mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-22 12:50:10 +08:00
committed by
Kinsey Moore
parent
3b08664764
commit
938915c1ad
@@ -235,8 +235,7 @@ extern "C" {
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
typedef enum {
|
||||
/**
|
||||
* @brief Free.
|
||||
*/
|
||||
@@ -305,35 +304,33 @@ typedef struct rtems_bdbuf_group rtems_bdbuf_group;
|
||||
* speed-up buffer lookup descriptors are organized in AVL-Tree. The fields
|
||||
* 'dd' and 'block' are search keys.
|
||||
*/
|
||||
typedef struct rtems_bdbuf_buffer
|
||||
{
|
||||
rtems_chain_node link; /**< Link the BD onto a number of lists. */
|
||||
typedef struct rtems_bdbuf_buffer {
|
||||
rtems_chain_node link; /**< Link the BD onto a number of lists. */
|
||||
|
||||
struct rtems_bdbuf_avl_node
|
||||
{
|
||||
struct rtems_bdbuf_buffer* left; /**< Left Child */
|
||||
struct rtems_bdbuf_buffer* right; /**< Right Child */
|
||||
signed char cache; /**< Cache */
|
||||
signed char bal; /**< The balance of the sub-tree */
|
||||
struct rtems_bdbuf_avl_node {
|
||||
struct rtems_bdbuf_buffer *left; /**< Left Child */
|
||||
struct rtems_bdbuf_buffer *right; /**< Right Child */
|
||||
signed char cache; /**< Cache */
|
||||
signed char bal; /**< The balance of the sub-tree */
|
||||
} avl;
|
||||
|
||||
rtems_disk_device *dd; /**< disk device */
|
||||
rtems_disk_device *dd; /**< disk device */
|
||||
|
||||
rtems_blkdev_bnum block; /**< block number on the device */
|
||||
rtems_blkdev_bnum block; /**< block number on the device */
|
||||
|
||||
unsigned char* buffer; /**< Pointer to the buffer memory area */
|
||||
unsigned char *buffer; /**< Pointer to the buffer memory area */
|
||||
|
||||
rtems_bdbuf_buf_state state; /**< State of the buffer. */
|
||||
rtems_bdbuf_buf_state state; /**< State of the buffer. */
|
||||
|
||||
uint32_t waiters; /**< The number of threads waiting on this
|
||||
uint32_t waiters; /**< The number of threads waiting on this
|
||||
* buffer. */
|
||||
rtems_bdbuf_group* group; /**< Pointer to the group of BDs this BD is
|
||||
rtems_bdbuf_group *group; /**< Pointer to the group of BDs this BD is
|
||||
* part of. */
|
||||
uint32_t hold_timer; /**< Timer to indicate how long a buffer
|
||||
uint32_t hold_timer; /**< Timer to indicate how long a buffer
|
||||
* has been held in the cache modified. */
|
||||
|
||||
int references; /**< Allow reference counting by owner. */
|
||||
void* user; /**< User data. */
|
||||
int references; /**< Allow reference counting by owner. */
|
||||
void *user; /**< User data. */
|
||||
} rtems_bdbuf_buffer;
|
||||
|
||||
/**
|
||||
@@ -343,15 +340,14 @@ typedef struct rtems_bdbuf_buffer
|
||||
* buffers in the group, if there are more than 1 will also be that size. The
|
||||
* number of buffers in a group is a multiple of 2, ie 1, 2, 4, 8, etc.
|
||||
*/
|
||||
struct rtems_bdbuf_group
|
||||
{
|
||||
struct rtems_bdbuf_group {
|
||||
rtems_chain_node link; /**< Link the groups on a LRU list if they
|
||||
* have no buffers in use. */
|
||||
size_t bds_per_group; /**< The number of BD allocated to this
|
||||
* group. This value must be a multiple of
|
||||
* 2. */
|
||||
uint32_t users; /**< How many users the block has. */
|
||||
rtems_bdbuf_buffer* bdbuf; /**< First BD this block covers. */
|
||||
rtems_bdbuf_buffer *bdbuf; /**< First BD this block covers. */
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -373,15 +369,15 @@ typedef struct rtems_bdbuf_config {
|
||||
* task. */
|
||||
rtems_task_priority swapout_worker_priority; /**< Priority of the swap out
|
||||
* task. */
|
||||
size_t task_stack_size; /**< Task stack size for swap-out
|
||||
size_t task_stack_size; /**< Task stack size for swap-out
|
||||
* task and worker threads. */
|
||||
size_t size; /**< Size of memory in the
|
||||
size_t size; /**< Size of memory in the
|
||||
* cache */
|
||||
uint32_t buffer_min; /**< Minimum buffer size. */
|
||||
uint32_t buffer_max; /**< Maximum buffer size
|
||||
uint32_t buffer_min; /**< Minimum buffer size. */
|
||||
uint32_t buffer_max; /**< Maximum buffer size
|
||||
* supported. It is also the
|
||||
* allocation size. */
|
||||
rtems_task_priority read_ahead_priority; /**< Priority of the read-ahead
|
||||
rtems_task_priority read_ahead_priority; /**< Priority of the read-ahead
|
||||
* task. */
|
||||
} rtems_bdbuf_config;
|
||||
|
||||
@@ -396,17 +392,17 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
|
||||
* The default value for the maximum read-ahead blocks disables the read-ahead
|
||||
* feature.
|
||||
*/
|
||||
#define RTEMS_BDBUF_MAX_READ_AHEAD_BLOCKS_DEFAULT 0
|
||||
#define RTEMS_BDBUF_MAX_READ_AHEAD_BLOCKS_DEFAULT 0
|
||||
|
||||
/**
|
||||
* Default maximum number of blocks to write at once.
|
||||
*/
|
||||
#define RTEMS_BDBUF_MAX_WRITE_BLOCKS_DEFAULT 16
|
||||
#define RTEMS_BDBUF_MAX_WRITE_BLOCKS_DEFAULT 16
|
||||
|
||||
/**
|
||||
* Default swap-out task priority.
|
||||
*/
|
||||
#define RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT 15
|
||||
#define RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT 15
|
||||
|
||||
/**
|
||||
* Default swap-out task swap period in milli seconds.
|
||||
@@ -416,18 +412,18 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
|
||||
/**
|
||||
* Default swap-out task block hold time in milli seconds.
|
||||
*/
|
||||
#define RTEMS_BDBUF_SWAPOUT_TASK_BLOCK_HOLD_DEFAULT 1000
|
||||
#define RTEMS_BDBUF_SWAPOUT_TASK_BLOCK_HOLD_DEFAULT 1000
|
||||
|
||||
/**
|
||||
* Default swap-out worker tasks. Currently disabled.
|
||||
*/
|
||||
#define RTEMS_BDBUF_SWAPOUT_WORKER_TASKS_DEFAULT 0
|
||||
#define RTEMS_BDBUF_SWAPOUT_WORKER_TASKS_DEFAULT 0
|
||||
|
||||
/**
|
||||
* Default swap-out worker task priority. The same as the swap-out task.
|
||||
*/
|
||||
#define RTEMS_BDBUF_SWAPOUT_WORKER_TASK_PRIORITY_DEFAULT \
|
||||
RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT
|
||||
RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT
|
||||
|
||||
/**
|
||||
* Default read-ahead task priority. The same as the swap-out task.
|
||||
@@ -443,17 +439,17 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
|
||||
/**
|
||||
* Default size of memory allocated to the cache.
|
||||
*/
|
||||
#define RTEMS_BDBUF_CACHE_MEMORY_SIZE_DEFAULT (64 * 512)
|
||||
#define RTEMS_BDBUF_CACHE_MEMORY_SIZE_DEFAULT ( 64 * 512 )
|
||||
|
||||
/**
|
||||
* Default minimum size of buffers.
|
||||
*/
|
||||
#define RTEMS_BDBUF_BUFFER_MIN_SIZE_DEFAULT (512)
|
||||
#define RTEMS_BDBUF_BUFFER_MIN_SIZE_DEFAULT ( 512 )
|
||||
|
||||
/**
|
||||
* Default maximum size of buffers.
|
||||
*/
|
||||
#define RTEMS_BDBUF_BUFFER_MAX_SIZE_DEFAULT (4096)
|
||||
#define RTEMS_BDBUF_BUFFER_MAX_SIZE_DEFAULT ( 4096 )
|
||||
|
||||
/**
|
||||
* Prepare buffering layer to work - initialize buffer descritors and (if it is
|
||||
@@ -467,8 +463,7 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
|
||||
* @retval RTEMS_RESOURCE_IN_USE Already initialized.
|
||||
* @retval RTEMS_UNSATISFIED Not enough resources.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_init (void);
|
||||
rtems_status_code rtems_bdbuf_init( void );
|
||||
|
||||
/**
|
||||
* Get block buffer for data to be written into. The buffers is set to the
|
||||
@@ -498,11 +493,10 @@ rtems_bdbuf_init (void);
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_ID Invalid block number.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_get (
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum block,
|
||||
rtems_bdbuf_buffer** bd
|
||||
rtems_status_code rtems_bdbuf_get(
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum block,
|
||||
rtems_bdbuf_buffer **bd
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -532,11 +526,10 @@ rtems_bdbuf_get (
|
||||
* @retval RTEMS_INVALID_ID Invalid block number.
|
||||
* @retval RTEMS_IO_ERROR IO error.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_read (
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum block,
|
||||
rtems_bdbuf_buffer** bd
|
||||
rtems_status_code rtems_bdbuf_read(
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum block,
|
||||
rtems_bdbuf_buffer **bd
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -555,11 +548,10 @@ rtems_bdbuf_read (
|
||||
* @param block [in] Linear media block number.
|
||||
* @param nr_blocks [in] Number of consecutive blocks that can be pre-fetched.
|
||||
*/
|
||||
void
|
||||
rtems_bdbuf_peek (
|
||||
void rtems_bdbuf_peek(
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum block,
|
||||
uint32_t nr_blocks
|
||||
rtems_blkdev_bnum block,
|
||||
uint32_t nr_blocks
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -581,8 +573,7 @@ rtems_bdbuf_peek (
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_ADDRESS The reference is NULL.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_release (rtems_bdbuf_buffer* bd);
|
||||
rtems_status_code rtems_bdbuf_release( rtems_bdbuf_buffer *bd );
|
||||
|
||||
/**
|
||||
* Release the buffer allocated with a get or read call placing it on the
|
||||
@@ -605,8 +596,7 @@ rtems_bdbuf_release (rtems_bdbuf_buffer* bd);
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_ADDRESS The reference is NULL.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_release_modified (rtems_bdbuf_buffer* bd);
|
||||
rtems_status_code rtems_bdbuf_release_modified( rtems_bdbuf_buffer *bd );
|
||||
|
||||
/**
|
||||
* Release the buffer as modified and wait until it has been synchronized with
|
||||
@@ -628,8 +618,7 @@ rtems_bdbuf_release_modified (rtems_bdbuf_buffer* bd);
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_ADDRESS The reference is NULL.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_sync (rtems_bdbuf_buffer* bd);
|
||||
rtems_status_code rtems_bdbuf_sync( rtems_bdbuf_buffer *bd );
|
||||
|
||||
/**
|
||||
* Synchronize all modified buffers for this device with the disk and wait
|
||||
@@ -648,8 +637,7 @@ rtems_bdbuf_sync (rtems_bdbuf_buffer* bd);
|
||||
*
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_syncdev (rtems_disk_device *dd);
|
||||
rtems_status_code rtems_bdbuf_syncdev( rtems_disk_device *dd );
|
||||
|
||||
/**
|
||||
* @brief Purges all buffers corresponding to the disk device @a dd.
|
||||
@@ -662,8 +650,7 @@ rtems_bdbuf_syncdev (rtems_disk_device *dd);
|
||||
*
|
||||
* @param dd [in] The disk device.
|
||||
*/
|
||||
void
|
||||
rtems_bdbuf_purge_dev (rtems_disk_device *dd);
|
||||
void rtems_bdbuf_purge_dev( rtems_disk_device *dd );
|
||||
|
||||
/**
|
||||
* @brief Sets the block size of a disk device.
|
||||
@@ -689,23 +676,24 @@ rtems_bdbuf_purge_dev (rtems_disk_device *dd);
|
||||
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||
* @retval RTEMS_INVALID_NUMBER Invalid block size.
|
||||
*/
|
||||
rtems_status_code
|
||||
rtems_bdbuf_set_block_size (rtems_disk_device *dd,
|
||||
uint32_t block_size,
|
||||
bool sync);
|
||||
rtems_status_code rtems_bdbuf_set_block_size(
|
||||
rtems_disk_device *dd,
|
||||
uint32_t block_size,
|
||||
bool sync
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Returns the block device statistics.
|
||||
*/
|
||||
void
|
||||
rtems_bdbuf_get_device_stats (const rtems_disk_device *dd,
|
||||
rtems_blkdev_stats *stats);
|
||||
void rtems_bdbuf_get_device_stats(
|
||||
const rtems_disk_device *dd,
|
||||
rtems_blkdev_stats *stats
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Resets the block device statistics.
|
||||
*/
|
||||
void
|
||||
rtems_bdbuf_reset_device_stats (rtems_disk_device *dd);
|
||||
void rtems_bdbuf_reset_device_stats( rtems_disk_device *dd );
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
@@ -226,17 +226,17 @@ typedef union {
|
||||
* format recognized on the disk will be stored in @a format.
|
||||
*/
|
||||
rtems_status_code rtems_bdpart_read(
|
||||
const char *disk_name,
|
||||
rtems_bdpart_format *format,
|
||||
const char *disk_name,
|
||||
rtems_bdpart_format *format,
|
||||
rtems_bdpart_partition *partitions,
|
||||
size_t *count
|
||||
size_t *count
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Sorts the partition table @a partitions with @a count partitions to
|
||||
* have ascending begin blocks
|
||||
*/
|
||||
void rtems_bdpart_sort( rtems_bdpart_partition *partitions, size_t count);
|
||||
void rtems_bdpart_sort( rtems_bdpart_partition *partitions, size_t count );
|
||||
|
||||
/**
|
||||
* @brief Writes the partition table to the physical disk device with name
|
||||
@@ -252,10 +252,10 @@ void rtems_bdpart_sort( rtems_bdpart_partition *partitions, size_t count);
|
||||
* disk. Depending on the output format there are additional constrains.
|
||||
*/
|
||||
rtems_status_code rtems_bdpart_write(
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_format *format,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_format *format,
|
||||
const rtems_bdpart_partition *partitions,
|
||||
size_t count
|
||||
size_t count
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -269,11 +269,11 @@ rtems_status_code rtems_bdpart_write(
|
||||
* with respect to the output format in @a format.
|
||||
*/
|
||||
rtems_status_code rtems_bdpart_create(
|
||||
const char *disk_name,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_format *format,
|
||||
rtems_bdpart_partition *partitions,
|
||||
const unsigned *distribution,
|
||||
size_t count
|
||||
rtems_bdpart_partition *partitions,
|
||||
const unsigned *distribution,
|
||||
size_t count
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -288,9 +288,9 @@ rtems_status_code rtems_bdpart_create(
|
||||
* @see rtems_blkdev_create_partition().
|
||||
*/
|
||||
rtems_status_code rtems_bdpart_register(
|
||||
const char *disk_name,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_partition *partitions,
|
||||
size_t count
|
||||
size_t count
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -299,7 +299,7 @@ rtems_status_code rtems_bdpart_register(
|
||||
*
|
||||
* @see rtems_bdpart_register() and rtems_fsmount().
|
||||
*/
|
||||
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name);
|
||||
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name );
|
||||
|
||||
/**
|
||||
* @brief Deletes the logical disks associated with the partitions of the disk
|
||||
@@ -310,22 +310,25 @@ rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name);
|
||||
* rtems_bdpart_read().
|
||||
*/
|
||||
rtems_status_code rtems_bdpart_unregister(
|
||||
const char *disk_name,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_partition *partitions,
|
||||
size_t count
|
||||
size_t count
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Prints the partition table @a partitions with @a count partitions to
|
||||
* standard output.
|
||||
*/
|
||||
void rtems_bdpart_dump( const rtems_bdpart_partition *partitions, size_t count);
|
||||
void rtems_bdpart_dump(
|
||||
const rtems_bdpart_partition *partitions,
|
||||
size_t count
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Returns the partition type for the MBR partition type value
|
||||
* @a mbr_type in @a type.
|
||||
*/
|
||||
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type);
|
||||
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type );
|
||||
|
||||
/**
|
||||
* @brief Converts the partition type in @a type to the MBR partition type.
|
||||
@@ -336,7 +339,7 @@ void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type);
|
||||
*/
|
||||
bool rtems_bdpart_to_mbr_partition_type(
|
||||
const uuid_t type,
|
||||
uint8_t *mbr_type
|
||||
uint8_t *mbr_type
|
||||
);
|
||||
|
||||
/** @} */
|
||||
@@ -352,7 +355,7 @@ bool rtems_bdpart_to_mbr_partition_type(
|
||||
#define RTEMS_BDPART_MBR_OFFSET_TABLE_0 446
|
||||
|
||||
#define RTEMS_BDPART_MBR_OFFSET_TABLE_1 \
|
||||
(RTEMS_BDPART_MBR_OFFSET_TABLE_0 + RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE)
|
||||
( RTEMS_BDPART_MBR_OFFSET_TABLE_0 + RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE )
|
||||
|
||||
#define RTEMS_BDPART_MBR_OFFSET_DISK_ID 440
|
||||
|
||||
@@ -372,18 +375,16 @@ bool rtems_bdpart_to_mbr_partition_type(
|
||||
|
||||
#define RTEMS_BDPART_MBR_OFFSET_FLAGS 0
|
||||
|
||||
static inline uint8_t rtems_bdpart_mbr_partition_type(
|
||||
const uuid_t type
|
||||
)
|
||||
static inline uint8_t rtems_bdpart_mbr_partition_type( const uuid_t type )
|
||||
{
|
||||
return type [0];
|
||||
return type[ 0 ];
|
||||
}
|
||||
|
||||
rtems_status_code rtems_bdpart_get_disk_data(
|
||||
const char *disk_name,
|
||||
int *fd_ptr,
|
||||
const char *disk_name,
|
||||
int *fd_ptr,
|
||||
rtems_disk_device **dd_ptr,
|
||||
rtems_blkdev_bnum *disk_end
|
||||
rtems_blkdev_bnum *disk_end
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -47,9 +47,9 @@ extern "C" {
|
||||
* to avoid requests looping for ever.
|
||||
*/
|
||||
typedef enum rtems_blkdev_request_op {
|
||||
RTEMS_BLKDEV_REQ_READ, /**< Read the requested blocks of data. */
|
||||
RTEMS_BLKDEV_REQ_WRITE, /**< Write the requested blocks of data. */
|
||||
RTEMS_BLKDEV_REQ_SYNC /**< Sync any data with the media. */
|
||||
RTEMS_BLKDEV_REQ_READ, /**< Read the requested blocks of data. */
|
||||
RTEMS_BLKDEV_REQ_WRITE, /**< Write the requested blocks of data. */
|
||||
RTEMS_BLKDEV_REQ_SYNC /**< Sync any data with the media. */
|
||||
} rtems_blkdev_request_op;
|
||||
|
||||
struct rtems_blkdev_request;
|
||||
@@ -57,9 +57,9 @@ struct rtems_blkdev_request;
|
||||
/**
|
||||
* @brief Block device request done callback function type.
|
||||
*/
|
||||
typedef void (*rtems_blkdev_request_cb)(
|
||||
typedef void ( *rtems_blkdev_request_cb )(
|
||||
struct rtems_blkdev_request *req,
|
||||
rtems_status_code status
|
||||
rtems_status_code status
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -142,7 +142,7 @@ typedef struct rtems_blkdev_request {
|
||||
/**
|
||||
* List of scatter or gather buffers.
|
||||
*/
|
||||
rtems_blkdev_sg_buffer bufs[RTEMS_ZERO_LENGTH_ARRAY];
|
||||
rtems_blkdev_sg_buffer bufs[ RTEMS_ZERO_LENGTH_ARRAY ];
|
||||
} rtems_blkdev_request;
|
||||
|
||||
/**
|
||||
@@ -158,10 +158,10 @@ typedef struct rtems_blkdev_request {
|
||||
*/
|
||||
static inline void rtems_blkdev_request_done(
|
||||
rtems_blkdev_request *req,
|
||||
rtems_status_code status
|
||||
rtems_status_code status
|
||||
)
|
||||
{
|
||||
(*req->done)(req, status);
|
||||
( *req->done )( req, status );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -170,83 +170,83 @@ static inline void rtems_blkdev_request_done(
|
||||
* Only valid if the driver has returned the
|
||||
* @ref RTEMS_BLKDEV_CAP_MULTISECTOR_CONT capability.
|
||||
*/
|
||||
#define RTEMS_BLKDEV_START_BLOCK(req) (req->bufs[0].block)
|
||||
#define RTEMS_BLKDEV_START_BLOCK( req ) ( req->bufs[ 0 ].block )
|
||||
|
||||
/**
|
||||
* @name IO Control Request Codes
|
||||
*/
|
||||
/**@{**/
|
||||
|
||||
#define RTEMS_BLKIO_REQUEST _IOWR('B', 1, rtems_blkdev_request)
|
||||
#define RTEMS_BLKIO_GETMEDIABLKSIZE _IOR('B', 2, uint32_t)
|
||||
#define RTEMS_BLKIO_GETBLKSIZE _IOR('B', 3, uint32_t)
|
||||
#define RTEMS_BLKIO_SETBLKSIZE _IOW('B', 4, uint32_t)
|
||||
#define RTEMS_BLKIO_GETSIZE _IOR('B', 5, rtems_blkdev_bnum)
|
||||
#define RTEMS_BLKIO_SYNCDEV _IO('B', 6)
|
||||
#define RTEMS_BLKIO_DELETED _IO('B', 7)
|
||||
#define RTEMS_BLKIO_CAPABILITIES _IO('B', 8)
|
||||
#define RTEMS_BLKIO_GETDISKDEV _IOR('B', 9, rtems_disk_device *)
|
||||
#define RTEMS_BLKIO_PURGEDEV _IO('B', 10)
|
||||
#define RTEMS_BLKIO_GETDEVSTATS _IOR('B', 11, rtems_blkdev_stats *)
|
||||
#define RTEMS_BLKIO_RESETDEVSTATS _IO('B', 12)
|
||||
#define RTEMS_BLKIO_REQUEST _IOWR( 'B', 1, rtems_blkdev_request )
|
||||
#define RTEMS_BLKIO_GETMEDIABLKSIZE _IOR( 'B', 2, uint32_t )
|
||||
#define RTEMS_BLKIO_GETBLKSIZE _IOR( 'B', 3, uint32_t )
|
||||
#define RTEMS_BLKIO_SETBLKSIZE _IOW( 'B', 4, uint32_t )
|
||||
#define RTEMS_BLKIO_GETSIZE _IOR( 'B', 5, rtems_blkdev_bnum )
|
||||
#define RTEMS_BLKIO_SYNCDEV _IO( 'B', 6 )
|
||||
#define RTEMS_BLKIO_DELETED _IO( 'B', 7 )
|
||||
#define RTEMS_BLKIO_CAPABILITIES _IO( 'B', 8 )
|
||||
#define RTEMS_BLKIO_GETDISKDEV _IOR( 'B', 9, rtems_disk_device * )
|
||||
#define RTEMS_BLKIO_PURGEDEV _IO( 'B', 10 )
|
||||
#define RTEMS_BLKIO_GETDEVSTATS _IOR( 'B', 11, rtems_blkdev_stats * )
|
||||
#define RTEMS_BLKIO_RESETDEVSTATS _IO( 'B', 12 )
|
||||
|
||||
/** @} */
|
||||
|
||||
static inline int rtems_disk_fd_get_media_block_size(
|
||||
int fd,
|
||||
int fd,
|
||||
uint32_t *media_block_size
|
||||
)
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_GETMEDIABLKSIZE, media_block_size);
|
||||
return ioctl( fd, RTEMS_BLKIO_GETMEDIABLKSIZE, media_block_size );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_get_block_size(int fd, uint32_t *block_size)
|
||||
static inline int rtems_disk_fd_get_block_size( int fd, uint32_t *block_size )
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_GETBLKSIZE, block_size);
|
||||
return ioctl( fd, RTEMS_BLKIO_GETBLKSIZE, block_size );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_set_block_size(int fd, uint32_t block_size)
|
||||
static inline int rtems_disk_fd_set_block_size( int fd, uint32_t block_size )
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_SETBLKSIZE, &block_size);
|
||||
return ioctl( fd, RTEMS_BLKIO_SETBLKSIZE, &block_size );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_get_block_count(
|
||||
int fd,
|
||||
int fd,
|
||||
rtems_blkdev_bnum *block_count
|
||||
)
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_GETSIZE, block_count);
|
||||
return ioctl( fd, RTEMS_BLKIO_GETSIZE, block_count );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_get_disk_device(
|
||||
int fd,
|
||||
int fd,
|
||||
rtems_disk_device **dd_ptr
|
||||
)
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr);
|
||||
return ioctl( fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_sync(int fd)
|
||||
static inline int rtems_disk_fd_sync( int fd )
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_SYNCDEV);
|
||||
return ioctl( fd, RTEMS_BLKIO_SYNCDEV );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_purge(int fd)
|
||||
static inline int rtems_disk_fd_purge( int fd )
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_PURGEDEV);
|
||||
return ioctl( fd, RTEMS_BLKIO_PURGEDEV );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_get_device_stats(
|
||||
int fd,
|
||||
int fd,
|
||||
rtems_blkdev_stats *stats
|
||||
)
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_GETDEVSTATS, stats);
|
||||
return ioctl( fd, RTEMS_BLKIO_GETDEVSTATS, stats );
|
||||
}
|
||||
|
||||
static inline int rtems_disk_fd_reset_device_stats(int fd)
|
||||
static inline int rtems_disk_fd_reset_device_stats( int fd )
|
||||
{
|
||||
return ioctl(fd, RTEMS_BLKIO_RESETDEVSTATS);
|
||||
return ioctl( fd, RTEMS_BLKIO_RESETDEVSTATS );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -261,14 +261,14 @@ static inline int rtems_disk_fd_reset_device_stats(int fd)
|
||||
* inorder so the ATA multi-sector command for example can be used. This is a
|
||||
* hack to work around the current ATA driver.
|
||||
*/
|
||||
#define RTEMS_BLKDEV_CAP_MULTISECTOR_CONT (1 << 0)
|
||||
#define RTEMS_BLKDEV_CAP_MULTISECTOR_CONT ( 1 << 0 )
|
||||
|
||||
/**
|
||||
* @brief The driver will accept a sync call.
|
||||
*
|
||||
* A sync call is made to a driver after a bdbuf cache sync has finished.
|
||||
*/
|
||||
#define RTEMS_BLKDEV_CAP_SYNC (1 << 1)
|
||||
#define RTEMS_BLKDEV_CAP_SYNC ( 1 << 1 )
|
||||
|
||||
/** @} */
|
||||
|
||||
@@ -278,8 +278,7 @@ static inline int rtems_disk_fd_reset_device_stats(int fd)
|
||||
* Use this in all block devices to handle the common set of IO control
|
||||
* requests.
|
||||
*/
|
||||
int
|
||||
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
|
||||
int rtems_blkdev_ioctl( rtems_disk_device *dd, uint32_t req, void *argp );
|
||||
|
||||
/**
|
||||
* @brief Creates a block device.
|
||||
@@ -302,11 +301,11 @@ rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
|
||||
* rtems_blkdev_request.
|
||||
*/
|
||||
rtems_status_code rtems_blkdev_create(
|
||||
const char *device,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
const char *device,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
rtems_block_device_ioctl handler,
|
||||
void *driver_data
|
||||
void *driver_data
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -335,8 +334,8 @@ rtems_status_code rtems_blkdev_create(
|
||||
* @see rtems_blkdev_create() and rtems_bdbuf_set_block_size().
|
||||
*/
|
||||
rtems_status_code rtems_blkdev_create_partition(
|
||||
const char *partition,
|
||||
const char *parent_block_device,
|
||||
const char *partition,
|
||||
const char *parent_block_device,
|
||||
rtems_blkdev_bnum media_block_begin,
|
||||
rtems_blkdev_bnum media_block_count
|
||||
);
|
||||
@@ -346,10 +345,10 @@ rtems_status_code rtems_blkdev_create_partition(
|
||||
*/
|
||||
void rtems_blkdev_print_stats(
|
||||
const rtems_blkdev_stats *stats,
|
||||
uint32_t media_block_size,
|
||||
uint32_t media_block_count,
|
||||
uint32_t block_size,
|
||||
const rtems_printer* printer
|
||||
uint32_t media_block_size,
|
||||
uint32_t media_block_count,
|
||||
uint32_t block_size,
|
||||
const rtems_printer *printer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -357,8 +356,8 @@ void rtems_blkdev_print_stats(
|
||||
*/
|
||||
void rtems_blkstats(
|
||||
const rtems_printer *printer,
|
||||
const char *device,
|
||||
bool reset
|
||||
const char *device,
|
||||
bool reset
|
||||
);
|
||||
|
||||
/** @} */
|
||||
@@ -380,55 +379,49 @@ void rtems_blkstats(
|
||||
* driver should provide an initialize entry point, which registers the
|
||||
* appropriate IO control handler.
|
||||
*/
|
||||
#define RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES \
|
||||
rtems_blkdev_generic_open, \
|
||||
rtems_blkdev_generic_close, \
|
||||
rtems_blkdev_generic_read, \
|
||||
rtems_blkdev_generic_write, \
|
||||
rtems_blkdev_generic_ioctl
|
||||
#define RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES \
|
||||
rtems_blkdev_generic_open, rtems_blkdev_generic_close, \
|
||||
rtems_blkdev_generic_read, rtems_blkdev_generic_write, \
|
||||
rtems_blkdev_generic_ioctl
|
||||
|
||||
/* Use rtems_blkdev_create() instead */
|
||||
RTEMS_DEPRECATED rtems_device_driver
|
||||
rtems_blkdev_generic_read(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg
|
||||
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_read(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
);
|
||||
|
||||
/* Use rtems_blkdev_create() instead */
|
||||
RTEMS_DEPRECATED rtems_device_driver
|
||||
rtems_blkdev_generic_write(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg
|
||||
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_write(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
);
|
||||
|
||||
/* Use rtems_blkdev_create() instead */
|
||||
RTEMS_DEPRECATED rtems_device_driver
|
||||
rtems_blkdev_generic_open(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg
|
||||
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_open(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
);
|
||||
|
||||
/* Use rtems_blkdev_create() instead */
|
||||
RTEMS_DEPRECATED rtems_device_driver
|
||||
rtems_blkdev_generic_close(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg
|
||||
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_close(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
);
|
||||
|
||||
/* Use rtems_blkdev_create() instead */
|
||||
RTEMS_DEPRECATED rtems_device_driver
|
||||
rtems_blkdev_generic_ioctl(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg
|
||||
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_ioctl(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
);
|
||||
|
||||
/* Use rtems_blkdev_create() instead */
|
||||
RTEMS_DEPRECATED extern const rtems_driver_address_table rtems_blkdev_generic_ops;
|
||||
RTEMS_DEPRECATED extern const rtems_driver_address_table
|
||||
rtems_blkdev_generic_ops;
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
@@ -47,21 +47,21 @@ typedef uint32_t rtems_blkdev_bnum;
|
||||
/**
|
||||
* @brief Block device IO control handler type.
|
||||
*/
|
||||
typedef int (*rtems_block_device_ioctl)(
|
||||
typedef int ( *rtems_block_device_ioctl )(
|
||||
rtems_disk_device *dd,
|
||||
uint32_t req,
|
||||
void *argp
|
||||
uint32_t req,
|
||||
void *argp
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Trigger value to disable further read-ahead requests.
|
||||
*/
|
||||
#define RTEMS_DISK_READ_AHEAD_NO_TRIGGER ((rtems_blkdev_bnum) -1)
|
||||
#define RTEMS_DISK_READ_AHEAD_NO_TRIGGER ( ( rtems_blkdev_bnum ) - 1 )
|
||||
|
||||
/**
|
||||
* @brief Size value to set number of blocks based on config and disk size.
|
||||
*/
|
||||
#define RTEMS_DISK_READ_AHEAD_SIZE_AUTO (0)
|
||||
#define RTEMS_DISK_READ_AHEAD_SIZE_AUTO ( 0 )
|
||||
|
||||
/**
|
||||
* @brief Block device read-ahead control.
|
||||
@@ -306,24 +306,20 @@ RTEMS_DEPRECATED static inline dev_t rtems_disk_get_device_identifier(
|
||||
}
|
||||
|
||||
/* Use fstat() instead */
|
||||
RTEMS_DEPRECATED static inline rtems_device_major_number rtems_disk_get_major_number(
|
||||
const rtems_disk_device *dd
|
||||
)
|
||||
RTEMS_DEPRECATED static inline rtems_device_major_number
|
||||
rtems_disk_get_major_number( const rtems_disk_device *dd )
|
||||
{
|
||||
return rtems_filesystem_dev_major_t(dd->dev);
|
||||
return rtems_filesystem_dev_major_t( dd->dev );
|
||||
}
|
||||
|
||||
/* Use fstat() instead */
|
||||
RTEMS_DEPRECATED static inline rtems_device_minor_number rtems_disk_get_minor_number(
|
||||
const rtems_disk_device *dd
|
||||
)
|
||||
RTEMS_DEPRECATED static inline rtems_device_minor_number
|
||||
rtems_disk_get_minor_number( const rtems_disk_device *dd )
|
||||
{
|
||||
return rtems_filesystem_dev_minor_t(dd->dev);
|
||||
return rtems_filesystem_dev_minor_t( dd->dev );
|
||||
}
|
||||
|
||||
static inline void *rtems_disk_get_driver_data(
|
||||
const rtems_disk_device *dd
|
||||
)
|
||||
static inline void *rtems_disk_get_driver_data( const rtems_disk_device *dd )
|
||||
{
|
||||
return dd->driver_data;
|
||||
}
|
||||
@@ -335,9 +331,7 @@ static inline uint32_t rtems_disk_get_media_block_size(
|
||||
return dd->media_block_size;
|
||||
}
|
||||
|
||||
static inline uint32_t rtems_disk_get_block_size(
|
||||
const rtems_disk_device *dd
|
||||
)
|
||||
static inline uint32_t rtems_disk_get_block_size( const rtems_disk_device *dd )
|
||||
{
|
||||
return dd->block_size;
|
||||
}
|
||||
@@ -365,40 +359,40 @@ static inline rtems_blkdev_bnum rtems_disk_get_block_count(
|
||||
|
||||
/* Use rtems_blkdev_create() instead */
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_create_phys(
|
||||
dev_t dev,
|
||||
uint32_t block_size,
|
||||
rtems_blkdev_bnum block_count,
|
||||
dev_t dev,
|
||||
uint32_t block_size,
|
||||
rtems_blkdev_bnum block_count,
|
||||
rtems_block_device_ioctl handler,
|
||||
void *driver_data,
|
||||
const char *name
|
||||
void *driver_data,
|
||||
const char *name
|
||||
);
|
||||
|
||||
/* Use rtems_blkdev_create_partition() instead */
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_create_log(
|
||||
dev_t dev,
|
||||
dev_t phys,
|
||||
dev_t dev,
|
||||
dev_t phys,
|
||||
rtems_blkdev_bnum block_begin,
|
||||
rtems_blkdev_bnum block_count,
|
||||
const char *name
|
||||
const char *name
|
||||
);
|
||||
|
||||
/*
|
||||
* Use rtems_blkdev_create() or rtems_blkdev_create_partition and unlink()
|
||||
* instead.
|
||||
*/
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_delete(dev_t dev);
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_delete( dev_t dev );
|
||||
|
||||
/*
|
||||
* Use rtems_blkdev_create() or rtems_blkdev_create_partition and open()
|
||||
* instead.
|
||||
*/
|
||||
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_obtain(dev_t dev);
|
||||
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_obtain( dev_t dev );
|
||||
|
||||
/*
|
||||
* Use rtems_blkdev_create() or rtems_blkdev_create_partition and close()
|
||||
* instead.
|
||||
*/
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_release(rtems_disk_device *dd);
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_release( rtems_disk_device *dd );
|
||||
|
||||
/** @} */
|
||||
|
||||
@@ -408,10 +402,10 @@ RTEMS_DEPRECATED rtems_status_code rtems_disk_release(rtems_disk_device *dd);
|
||||
/**@{**/
|
||||
|
||||
/* Just remove calls to this function */
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_initialize(void);
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_initialize( void );
|
||||
|
||||
/* Just remove calls to this function */
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_done(void);
|
||||
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_done( void );
|
||||
|
||||
/** @} */
|
||||
|
||||
@@ -421,23 +415,23 @@ RTEMS_DEPRECATED rtems_status_code rtems_disk_io_done(void);
|
||||
* This functionality no longer available. There is no global registration for
|
||||
* disk devices.
|
||||
*/
|
||||
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_next(dev_t dev);
|
||||
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_next( dev_t dev );
|
||||
|
||||
/* Internal function, do not use */
|
||||
rtems_status_code rtems_disk_init_phys(
|
||||
rtems_disk_device *dd,
|
||||
uint32_t block_size,
|
||||
rtems_blkdev_bnum block_count,
|
||||
rtems_disk_device *dd,
|
||||
uint32_t block_size,
|
||||
rtems_blkdev_bnum block_count,
|
||||
rtems_block_device_ioctl handler,
|
||||
void *driver_data
|
||||
void *driver_data
|
||||
);
|
||||
|
||||
/* Internal function, do not use */
|
||||
rtems_status_code rtems_disk_init_log(
|
||||
rtems_disk_device *dd,
|
||||
rtems_disk_device *phys_dd,
|
||||
rtems_blkdev_bnum block_begin,
|
||||
rtems_blkdev_bnum block_count
|
||||
rtems_blkdev_bnum block_begin,
|
||||
rtems_blkdev_bnum block_count
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -57,42 +57,40 @@
|
||||
#include <rtems/seterr.h>
|
||||
|
||||
/* Minor base number for all logical devices */
|
||||
#define RTEMS_IDE_SECTOR_BITS 9
|
||||
#define RTEMS_IDE_SECTOR_SIZE 512
|
||||
#define RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE 16
|
||||
#define RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER 63
|
||||
#define RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER 4
|
||||
#define RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX 16
|
||||
#define RTEMS_IDE_SECTOR_BITS 9
|
||||
#define RTEMS_IDE_SECTOR_SIZE 512
|
||||
#define RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE 16
|
||||
#define RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER 63
|
||||
#define RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER 4
|
||||
#define RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX 16
|
||||
|
||||
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA1 0x55
|
||||
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA2 0xaa
|
||||
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_OFFSET 0x1fe
|
||||
#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be
|
||||
#define RTEMS_IDE_PARTITION_TABLE_SIZE (4 * 16)
|
||||
#define RTEMS_IDE_PARTITION_BOOTABLE_OFFSET 0
|
||||
#define RTEMS_IDE_PARTITION_SYS_TYPE_OFFSET 4
|
||||
#define RTEMS_IDE_PARTITION_START_OFFSET 8
|
||||
#define RTEMS_IDE_PARTITION_SIZE_OFFSET 12
|
||||
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA1 0x55
|
||||
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA2 0xaa
|
||||
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_OFFSET 0x1fe
|
||||
#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be
|
||||
#define RTEMS_IDE_PARTITION_TABLE_SIZE ( 4 * 16 )
|
||||
#define RTEMS_IDE_PARTITION_BOOTABLE_OFFSET 0
|
||||
#define RTEMS_IDE_PARTITION_SYS_TYPE_OFFSET 4
|
||||
#define RTEMS_IDE_PARTITION_START_OFFSET 8
|
||||
#define RTEMS_IDE_PARTITION_SIZE_OFFSET 12
|
||||
|
||||
/*
|
||||
* Conversion from and to little-endian byte order. (no-op on i386/i486)
|
||||
*/
|
||||
#define LE_TO_CPU_U16(v) le16toh(v)
|
||||
#define LE_TO_CPU_U32(v) le32toh(v)
|
||||
#define CPU_TO_LE_U16(v) htole16(v)
|
||||
#define CPU_TO_LE_U32(v) htole32(v)
|
||||
#define LE_TO_CPU_U16( v ) le16toh( v )
|
||||
#define LE_TO_CPU_U32( v ) le32toh( v )
|
||||
#define CPU_TO_LE_U16( v ) htole16( v )
|
||||
#define CPU_TO_LE_U32( v ) htole32( v )
|
||||
|
||||
/*
|
||||
* sector_data_t --
|
||||
* corresponds to the sector on the device
|
||||
*/
|
||||
typedef struct rtems_sector_data_s
|
||||
{
|
||||
uint32_t sector_num; /* sector number on the device */
|
||||
uint8_t data[RTEMS_ZERO_LENGTH_ARRAY]; /* raw sector data */
|
||||
typedef struct rtems_sector_data_s {
|
||||
uint32_t sector_num; /* sector number on the device */
|
||||
uint8_t data[ RTEMS_ZERO_LENGTH_ARRAY ]; /* raw sector data */
|
||||
} rtems_sector_data_t;
|
||||
|
||||
|
||||
/*
|
||||
* Enum partition types
|
||||
* see list at http://ata-atapi.com/hiwtab.htm
|
||||
@@ -100,24 +98,23 @@ typedef struct rtems_sector_data_s
|
||||
* @todo Should these have RTEMS before them.
|
||||
*/
|
||||
enum {
|
||||
EMPTY_PARTITION = 0x00,
|
||||
DOS_FAT12_PARTITION = 0x01,
|
||||
DOS_FAT16_PARTITION = 0x04,
|
||||
EXTENDED_PARTITION = 0x05,
|
||||
DOS_P32MB_PARTITION = 0x06,
|
||||
FAT32_PARTITION = 0x0B,
|
||||
FAT32_LBA_PARTITION = 0x0C,
|
||||
FAT16_LBA_PARTITION = 0x0E,
|
||||
DM6_PARTITION = 0x54,
|
||||
EZD_PARTITION = 0x55,
|
||||
DM6_AUX1PARTITION = 0x51,
|
||||
DM6_AUX3PARTITION = 0x53,
|
||||
LINUX_SWAP = 0x82,
|
||||
LINUX_NATIVE = 0x83,
|
||||
LINUX_EXTENDED = 0x85
|
||||
EMPTY_PARTITION = 0x00,
|
||||
DOS_FAT12_PARTITION = 0x01,
|
||||
DOS_FAT16_PARTITION = 0x04,
|
||||
EXTENDED_PARTITION = 0x05,
|
||||
DOS_P32MB_PARTITION = 0x06,
|
||||
FAT32_PARTITION = 0x0B,
|
||||
FAT32_LBA_PARTITION = 0x0C,
|
||||
FAT16_LBA_PARTITION = 0x0E,
|
||||
DM6_PARTITION = 0x54,
|
||||
EZD_PARTITION = 0x55,
|
||||
DM6_AUX1PARTITION = 0x51,
|
||||
DM6_AUX3PARTITION = 0x53,
|
||||
LINUX_SWAP = 0x82,
|
||||
LINUX_NATIVE = 0x83,
|
||||
LINUX_EXTENDED = 0x85
|
||||
};
|
||||
|
||||
|
||||
/* Forward declaration */
|
||||
struct rtems_disk_desc_s;
|
||||
|
||||
@@ -126,35 +123,34 @@ struct rtems_disk_desc_s;
|
||||
* contains all neccessary information about partition
|
||||
*/
|
||||
typedef struct rtems_part_desc_s {
|
||||
uint8_t bootable; /* is the partition active */
|
||||
uint8_t sys_type; /* type of partition */
|
||||
uint8_t log_id; /* logical number of partition */
|
||||
uint32_t start; /* first partition sector, in absolute
|
||||
uint8_t bootable; /* is the partition active */
|
||||
uint8_t sys_type; /* type of partition */
|
||||
uint8_t log_id; /* logical number of partition */
|
||||
uint32_t start; /* first partition sector, in absolute
|
||||
* numeration */
|
||||
uint32_t size; /* size in sectors */
|
||||
uint32_t end; /* last partition sector, end = start + size - 1 */
|
||||
struct rtems_disk_desc_s *disk_desc; /* descriptor of disk, partition
|
||||
uint32_t size; /* size in sectors */
|
||||
uint32_t end; /* last partition sector, end = start + size - 1 */
|
||||
struct rtems_disk_desc_s *disk_desc; /* descriptor of disk, partition
|
||||
* contains in */
|
||||
struct rtems_part_desc_s *ext_part; /* extended partition containing this
|
||||
struct rtems_part_desc_s *ext_part; /* extended partition containing this
|
||||
* one */
|
||||
|
||||
/* partitions, containing in this one */
|
||||
struct rtems_part_desc_s *sub_part[RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER];
|
||||
/* partitions, containing in this one */
|
||||
struct rtems_part_desc_s
|
||||
*sub_part[ RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER ];
|
||||
} rtems_part_desc_t;
|
||||
|
||||
|
||||
|
||||
typedef struct rtems_disk_desc_s {
|
||||
/* device name in /dev filesystem */
|
||||
char dev_name[RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX];
|
||||
/* device name in /dev filesystem */
|
||||
char dev_name[ RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX ];
|
||||
|
||||
uint32_t sector_size; /* size of sector */
|
||||
uint32_t sector_bits; /* the base-2 logarithm of sector_size */
|
||||
uint32_t lba_size; /* total amount of sectors in lba address mode */
|
||||
int last_log_id; /* used for logical disks enumerating */
|
||||
uint32_t sector_size; /* size of sector */
|
||||
uint32_t sector_bits; /* the base-2 logarithm of sector_size */
|
||||
uint32_t lba_size; /* total amount of sectors in lba address mode */
|
||||
int last_log_id; /* used for logical disks enumerating */
|
||||
|
||||
/* primary partition descriptors */
|
||||
rtems_part_desc_t *partitions[RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER];
|
||||
/* primary partition descriptors */
|
||||
rtems_part_desc_t *partitions[ RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER ];
|
||||
} rtems_disk_desc_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -178,7 +174,6 @@ void rtems_ide_part_table_free(
|
||||
rtems_disk_desc_t *disk_desc
|
||||
) RTEMS_DEPRECATED;
|
||||
|
||||
|
||||
/*
|
||||
* rtems_ide_part_table_get --
|
||||
* reads partition table structure from the device
|
||||
@@ -195,11 +190,10 @@ void rtems_ide_part_table_free(
|
||||
* @deprecated Use the @ref rtems_bdpart "block device partition module" instead.
|
||||
*/
|
||||
rtems_status_code rtems_ide_part_table_get(
|
||||
const char *dev_name,
|
||||
const char *dev_name,
|
||||
rtems_disk_desc_t *disk_desc
|
||||
) RTEMS_DEPRECATED;
|
||||
|
||||
|
||||
/*
|
||||
* rtems_ide_part_table_initialize --
|
||||
* initializes logical devices on the physical IDE drive
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#ifndef _RTEMS_RAMDISK_H
|
||||
#define _RTEMS_RAMDISK_H
|
||||
|
||||
|
||||
#include <rtems.h>
|
||||
#include <rtems/blkdev.h>
|
||||
|
||||
@@ -60,7 +59,7 @@ typedef struct rtems_ramdisk_config {
|
||||
*
|
||||
* The configuration table is provided by the application.
|
||||
*/
|
||||
extern rtems_ramdisk_config rtems_ramdisk_configuration [];
|
||||
extern rtems_ramdisk_config rtems_ramdisk_configuration[];
|
||||
|
||||
/**
|
||||
* @brief External reference the size of the RAM disk configuration table
|
||||
@@ -74,19 +73,16 @@ extern size_t rtems_ramdisk_configuration_size;
|
||||
* @brief RAM disk driver initialization entry point.
|
||||
*/
|
||||
rtems_device_driver ramdisk_initialize(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
);
|
||||
|
||||
/**
|
||||
* RAM disk driver table entry.
|
||||
*/
|
||||
#define RAMDISK_DRIVER_TABLE_ENTRY \
|
||||
{ \
|
||||
ramdisk_initialize, \
|
||||
NULL, NULL, NULL, NULL, NULL \
|
||||
}
|
||||
{ ramdisk_initialize, NULL, NULL, NULL, NULL, NULL }
|
||||
|
||||
#define RAMDISK_DEVICE_BASE_NAME "/dev/rd"
|
||||
|
||||
@@ -137,7 +133,7 @@ typedef struct ramdisk {
|
||||
bool free_at_delete_request;
|
||||
} ramdisk;
|
||||
|
||||
int ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
|
||||
int ramdisk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp );
|
||||
|
||||
/**
|
||||
* @brief Allocates and initializes a RAM disk descriptor.
|
||||
@@ -182,15 +178,15 @@ int ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
|
||||
* @endcode
|
||||
*/
|
||||
ramdisk *ramdisk_allocate(
|
||||
void *area_begin,
|
||||
uint32_t media_block_size,
|
||||
void *area_begin,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
bool trace
|
||||
bool trace
|
||||
);
|
||||
|
||||
void ramdisk_free(ramdisk *rd);
|
||||
void ramdisk_free( ramdisk *rd );
|
||||
|
||||
static inline void ramdisk_enable_free_at_delete_request(ramdisk *rd)
|
||||
static inline void ramdisk_enable_free_at_delete_request( ramdisk *rd )
|
||||
{
|
||||
rd->free_at_delete_request = true;
|
||||
}
|
||||
@@ -207,10 +203,10 @@ static inline void ramdisk_enable_free_at_delete_request(ramdisk *rd)
|
||||
* @retval RTEMS_UNSATISFIED Something is wrong.
|
||||
*/
|
||||
rtems_status_code ramdisk_register(
|
||||
uint32_t media_block_size,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
bool trace,
|
||||
const char *disk
|
||||
bool trace,
|
||||
const char *disk
|
||||
);
|
||||
|
||||
/** @} */
|
||||
|
||||
+1276
-1249
File diff suppressed because it is too large
Load Diff
@@ -41,66 +41,67 @@
|
||||
#include <rtems/bdpart.h>
|
||||
|
||||
rtems_status_code rtems_bdpart_create(
|
||||
const char *disk_name,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_format *format,
|
||||
rtems_bdpart_partition *pt,
|
||||
const unsigned *dist,
|
||||
size_t count
|
||||
rtems_bdpart_partition *pt,
|
||||
const unsigned *dist,
|
||||
size_t count
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
bool dos_compatibility = format != NULL
|
||||
&& format->type == RTEMS_BDPART_FORMAT_MBR
|
||||
&& format->mbr.dos_compatibility;
|
||||
bool dos_compatibility = format != NULL &&
|
||||
format->type == RTEMS_BDPART_FORMAT_MBR &&
|
||||
format->mbr.dos_compatibility;
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
rtems_blkdev_bnum pos = 0;
|
||||
rtems_blkdev_bnum dist_sum = 0;
|
||||
rtems_blkdev_bnum record_space =
|
||||
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
|
||||
rtems_blkdev_bnum record_space = dos_compatibility
|
||||
? RTEMS_BDPART_MBR_CYLINDER_SIZE
|
||||
: 1;
|
||||
rtems_blkdev_bnum overhead = 0;
|
||||
rtems_blkdev_bnum free_space = 0;
|
||||
size_t i = 0;
|
||||
size_t i = 0;
|
||||
|
||||
/* Check if we have something to do */
|
||||
if (count == 0) {
|
||||
if ( count == 0 ) {
|
||||
/* Nothing to do */
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
/* Check parameter */
|
||||
if (format == NULL || pt == NULL || dist == NULL) {
|
||||
if ( format == NULL || pt == NULL || dist == NULL ) {
|
||||
return RTEMS_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
/* Get disk data */
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, NULL, NULL, &disk_end);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, NULL, NULL, &disk_end );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
/* Get distribution sum and check for overflow */
|
||||
for (i = 0; i < count; ++i) {
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
unsigned prev_sum = dist_sum;
|
||||
|
||||
dist_sum += dist [i];
|
||||
dist_sum += dist[ i ];
|
||||
|
||||
if (dist_sum < prev_sum) {
|
||||
if ( dist_sum < prev_sum ) {
|
||||
return RTEMS_INVALID_NUMBER;
|
||||
}
|
||||
|
||||
if (dist [i] == 0) {
|
||||
if ( dist[ i ] == 0 ) {
|
||||
return RTEMS_INVALID_NUMBER;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check format */
|
||||
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
|
||||
if ( format->type != RTEMS_BDPART_FORMAT_MBR ) {
|
||||
return RTEMS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Align end of disk on cylinder boundary if necessary */
|
||||
if (dos_compatibility) {
|
||||
disk_end -= (disk_end % record_space);
|
||||
if ( dos_compatibility ) {
|
||||
disk_end -= ( disk_end % record_space );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -113,20 +114,20 @@ rtems_status_code rtems_bdpart_create(
|
||||
* In case we need an extended partition and logical partitions we have to
|
||||
* account for the space of each EBR.
|
||||
*/
|
||||
if (count > 4) {
|
||||
overhead += (count - 3) * record_space;
|
||||
if ( count > 4 ) {
|
||||
overhead += ( count - 3 ) * record_space;
|
||||
}
|
||||
|
||||
/*
|
||||
* Account space to align every partition on cylinder boundaries if
|
||||
* necessary.
|
||||
*/
|
||||
if (dos_compatibility) {
|
||||
overhead += (count - 1) * record_space;
|
||||
if ( dos_compatibility ) {
|
||||
overhead += ( count - 1 ) * record_space;
|
||||
}
|
||||
|
||||
/* Check disk space */
|
||||
if ((overhead + count) > disk_end) {
|
||||
if ( ( overhead + count ) > disk_end ) {
|
||||
return RTEMS_IO_ERROR;
|
||||
}
|
||||
|
||||
@@ -136,27 +137,27 @@ rtems_status_code rtems_bdpart_create(
|
||||
/* Space for partitions */
|
||||
free_space = disk_end - overhead;
|
||||
|
||||
for (i = 0; i < count; ++i) {
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
rtems_bdpart_partition *p = pt + i;
|
||||
|
||||
/* Partition size */
|
||||
rtems_blkdev_bnum s = free_space * dist [i];
|
||||
if (s < free_space || s < dist [i]) {
|
||||
rtems_blkdev_bnum s = free_space * dist[ i ];
|
||||
if ( s < free_space || s < dist[ i ] ) {
|
||||
/* TODO: Calculate without overflow */
|
||||
return RTEMS_INVALID_NUMBER;
|
||||
}
|
||||
s /= dist_sum;
|
||||
|
||||
/* Ensure that the partition is not empty */
|
||||
if (s == 0) {
|
||||
if ( s == 0 ) {
|
||||
s = 1;
|
||||
}
|
||||
|
||||
/* Align partition upwards */
|
||||
s += record_space - (s % record_space);
|
||||
s += record_space - ( s % record_space );
|
||||
|
||||
/* Reserve space for the EBR if necessary */
|
||||
if (count > 4 && i > 2) {
|
||||
if ( count > 4 && i > 2 ) {
|
||||
pos += record_space;
|
||||
}
|
||||
|
||||
@@ -167,7 +168,7 @@ rtems_status_code rtems_bdpart_create(
|
||||
}
|
||||
|
||||
/* Expand the last partition to the disk end */
|
||||
pt [count - 1].end = disk_end;
|
||||
pt[ count - 1 ].end = disk_end;
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
@@ -43,15 +43,12 @@
|
||||
#include <rtems.h>
|
||||
#include <rtems/bdpart.h>
|
||||
|
||||
static void rtems_bdpart_type_to_string(
|
||||
const uuid_t type,
|
||||
char str [37]
|
||||
)
|
||||
static void rtems_bdpart_type_to_string( const uuid_t type, char str[ 37 ] )
|
||||
{
|
||||
uuid_unparse_lower( type, str);
|
||||
uuid_unparse_lower( type, str );
|
||||
}
|
||||
|
||||
void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
|
||||
void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count )
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
@@ -63,14 +60,14 @@ void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
|
||||
"------------+------------+-----------------------------------------------------\n"
|
||||
);
|
||||
|
||||
for (i = 0; i < count; ++i) {
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
const rtems_bdpart_partition *p = pt + i;
|
||||
const char *type = NULL;
|
||||
char type_buffer [52];
|
||||
uint8_t type_mbr = 0;
|
||||
const char *type = NULL;
|
||||
char type_buffer[ 52 ];
|
||||
uint8_t type_mbr = 0;
|
||||
|
||||
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
|
||||
switch (type_mbr) {
|
||||
if ( rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr ) ) {
|
||||
switch ( type_mbr ) {
|
||||
case RTEMS_BDPART_MBR_FAT_12:
|
||||
type = "FAT 12";
|
||||
break;
|
||||
@@ -90,12 +87,17 @@ void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
|
||||
type = "DATA";
|
||||
break;
|
||||
default:
|
||||
snprintf( type_buffer, sizeof( type_buffer), "0x%02" PRIx8, type_mbr);
|
||||
snprintf(
|
||||
type_buffer,
|
||||
sizeof( type_buffer ),
|
||||
"0x%02" PRIx8,
|
||||
type_mbr
|
||||
);
|
||||
type = type_buffer;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
rtems_bdpart_type_to_string( p->type, type_buffer);
|
||||
rtems_bdpart_type_to_string( p->type, type_buffer );
|
||||
type = type_buffer;
|
||||
}
|
||||
|
||||
@@ -107,5 +109,7 @@ void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
|
||||
);
|
||||
}
|
||||
|
||||
puts( "------------+------------+-----------------------------------------------------");
|
||||
puts(
|
||||
"------------+------------+-----------------------------------------------------"
|
||||
);
|
||||
}
|
||||
|
||||
+122
-112
@@ -46,64 +46,71 @@
|
||||
#include <rtems/bdpart.h>
|
||||
#include <rtems/endian.h>
|
||||
|
||||
#define RTEMS_BDPART_MBR_PARTITION_TYPE( type) \
|
||||
{ \
|
||||
(type), 0xa2U, 0x2eU, 0x38U, \
|
||||
0x38U, 0xb5U, 0xdeU, 0x11U, \
|
||||
0xbcU, 0x13U, 0x00U, 0x1dU, \
|
||||
0x09U, 0xb0U, 0x5fU, 0xa4U \
|
||||
}
|
||||
#define RTEMS_BDPART_MBR_PARTITION_TYPE( type ) \
|
||||
{ ( type ), \
|
||||
0xa2U, \
|
||||
0x2eU, \
|
||||
0x38U, \
|
||||
0x38U, \
|
||||
0xb5U, \
|
||||
0xdeU, \
|
||||
0x11U, \
|
||||
0xbcU, \
|
||||
0x13U, \
|
||||
0x00U, \
|
||||
0x1dU, \
|
||||
0x09U, \
|
||||
0xb0U, \
|
||||
0x5fU, \
|
||||
0xa4U }
|
||||
|
||||
static const uuid_t RTEMS_BDPART_MBR_MASTER_TYPE =
|
||||
RTEMS_BDPART_MBR_PARTITION_TYPE( RTEMS_BDPART_MBR_EMPTY);
|
||||
RTEMS_BDPART_MBR_PARTITION_TYPE( RTEMS_BDPART_MBR_EMPTY );
|
||||
|
||||
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type)
|
||||
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type )
|
||||
{
|
||||
type [0] = mbr_type;
|
||||
memcpy( type + 1, RTEMS_BDPART_MBR_MASTER_TYPE + 1, sizeof( uuid_t) - 1);
|
||||
type[ 0 ] = mbr_type;
|
||||
memcpy( type + 1, RTEMS_BDPART_MBR_MASTER_TYPE + 1, sizeof( uuid_t ) - 1 );
|
||||
}
|
||||
|
||||
bool rtems_bdpart_to_mbr_partition_type(
|
||||
const uuid_t type,
|
||||
uint8_t *mbr_type
|
||||
)
|
||||
bool rtems_bdpart_to_mbr_partition_type( const uuid_t type, uint8_t *mbr_type )
|
||||
{
|
||||
*mbr_type = rtems_bdpart_mbr_partition_type( type);
|
||||
*mbr_type = rtems_bdpart_mbr_partition_type( type );
|
||||
|
||||
return memcmp(
|
||||
type + 1,
|
||||
RTEMS_BDPART_MBR_MASTER_TYPE + 1,
|
||||
sizeof( uuid_t) - 1
|
||||
) == 0;
|
||||
type + 1,
|
||||
RTEMS_BDPART_MBR_MASTER_TYPE + 1,
|
||||
sizeof( uuid_t ) - 1
|
||||
) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: This code should the deviceio interface and not the bdbug interface.
|
||||
*/
|
||||
rtems_status_code rtems_bdpart_get_disk_data(
|
||||
const char *disk_name,
|
||||
int *fd_ptr,
|
||||
const char *disk_name,
|
||||
int *fd_ptr,
|
||||
rtems_disk_device **dd_ptr,
|
||||
rtems_blkdev_bnum *disk_end
|
||||
rtems_blkdev_bnum *disk_end
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
int rv = 0;
|
||||
int fd;
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
int rv = 0;
|
||||
int fd;
|
||||
rtems_disk_device *dd = NULL;
|
||||
rtems_blkdev_bnum disk_begin = 0;
|
||||
rtems_blkdev_bnum block_size = 0;
|
||||
rtems_blkdev_bnum disk_begin = 0;
|
||||
rtems_blkdev_bnum block_size = 0;
|
||||
|
||||
/* Open device file */
|
||||
fd = open( disk_name, O_RDWR);
|
||||
if (fd < 0) {
|
||||
fd = open( disk_name, O_RDWR );
|
||||
if ( fd < 0 ) {
|
||||
sc = RTEMS_INVALID_NAME;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Get disk handle */
|
||||
rv = rtems_disk_fd_get_disk_device( fd, &dd);
|
||||
if (rv != 0) {
|
||||
rv = rtems_disk_fd_get_disk_device( fd, &dd );
|
||||
if ( rv != 0 ) {
|
||||
sc = RTEMS_INVALID_NAME;
|
||||
goto error;
|
||||
}
|
||||
@@ -114,45 +121,46 @@ rtems_status_code rtems_bdpart_get_disk_data(
|
||||
block_size = dd->block_size;
|
||||
|
||||
/* Check block size */
|
||||
if (block_size < RTEMS_BDPART_BLOCK_SIZE) {
|
||||
if ( block_size < RTEMS_BDPART_BLOCK_SIZE ) {
|
||||
sc = RTEMS_IO_ERROR;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Check that we have do not have a logical disk */
|
||||
if (disk_begin != 0) {
|
||||
if ( disk_begin != 0 ) {
|
||||
sc = RTEMS_IO_ERROR;
|
||||
goto error;
|
||||
}
|
||||
|
||||
error:
|
||||
|
||||
if (sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL) {
|
||||
if ( sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL ) {
|
||||
*fd_ptr = fd;
|
||||
*dd_ptr = dd;
|
||||
} else {
|
||||
close( fd);
|
||||
close( fd );
|
||||
}
|
||||
|
||||
out:
|
||||
return sc;
|
||||
}
|
||||
|
||||
static bool rtems_bdpart_is_valid_record( const uint8_t *data)
|
||||
static bool rtems_bdpart_is_valid_record( const uint8_t *data )
|
||||
{
|
||||
return data [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0]
|
||||
== RTEMS_BDPART_MBR_SIGNATURE_0
|
||||
&& data [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1]
|
||||
== RTEMS_BDPART_MBR_SIGNATURE_1;
|
||||
return data[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0 ] ==
|
||||
RTEMS_BDPART_MBR_SIGNATURE_0 &&
|
||||
data[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1 ] ==
|
||||
RTEMS_BDPART_MBR_SIGNATURE_1;
|
||||
}
|
||||
|
||||
static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data)
|
||||
static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data )
|
||||
{
|
||||
rtems_blkdev_bnum begin =
|
||||
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
|
||||
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
|
||||
rtems_blkdev_bnum begin = rtems_uint32_from_little_endian(
|
||||
data + RTEMS_BDPART_MBR_OFFSET_BEGIN
|
||||
);
|
||||
uint8_t type = data[ RTEMS_BDPART_MBR_OFFSET_TYPE ];
|
||||
|
||||
if (type == RTEMS_BDPART_MBR_EXTENDED) {
|
||||
if ( type == RTEMS_BDPART_MBR_EXTENDED ) {
|
||||
return begin;
|
||||
} else {
|
||||
return 0;
|
||||
@@ -160,65 +168,67 @@ static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data)
|
||||
}
|
||||
|
||||
static rtems_status_code rtems_bdpart_read_mbr_partition(
|
||||
const uint8_t *data,
|
||||
rtems_bdpart_partition **p,
|
||||
const uint8_t *data,
|
||||
rtems_bdpart_partition **p,
|
||||
const rtems_bdpart_partition *p_end,
|
||||
rtems_blkdev_bnum *ep_begin
|
||||
rtems_blkdev_bnum *ep_begin
|
||||
)
|
||||
{
|
||||
rtems_blkdev_bnum begin =
|
||||
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
|
||||
rtems_blkdev_bnum size =
|
||||
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_SIZE);
|
||||
rtems_blkdev_bnum begin = rtems_uint32_from_little_endian(
|
||||
data + RTEMS_BDPART_MBR_OFFSET_BEGIN
|
||||
);
|
||||
rtems_blkdev_bnum size = rtems_uint32_from_little_endian(
|
||||
data + RTEMS_BDPART_MBR_OFFSET_SIZE
|
||||
);
|
||||
rtems_blkdev_bnum end = begin + size;
|
||||
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
|
||||
uint8_t type = data[ RTEMS_BDPART_MBR_OFFSET_TYPE ];
|
||||
|
||||
if (type == RTEMS_BDPART_MBR_EMPTY) {
|
||||
if ( type == RTEMS_BDPART_MBR_EMPTY ) {
|
||||
return RTEMS_SUCCESSFUL;
|
||||
} else if (*p == p_end) {
|
||||
} else if ( *p == p_end ) {
|
||||
return RTEMS_TOO_MANY;
|
||||
} else if (begin >= end) {
|
||||
} else if ( begin >= end ) {
|
||||
return RTEMS_IO_ERROR;
|
||||
} else if (type == RTEMS_BDPART_MBR_EXTENDED) {
|
||||
if (ep_begin != NULL) {
|
||||
} else if ( type == RTEMS_BDPART_MBR_EXTENDED ) {
|
||||
if ( ep_begin != NULL ) {
|
||||
*ep_begin = begin;
|
||||
}
|
||||
} else {
|
||||
/* Increment partition index */
|
||||
++(*p);
|
||||
++( *p );
|
||||
|
||||
/* Clear partition */
|
||||
memset( *p, 0, sizeof( rtems_bdpart_partition));
|
||||
memset( *p, 0, sizeof( rtems_bdpart_partition ) );
|
||||
|
||||
/* Set values */
|
||||
(*p)->begin = begin;
|
||||
(*p)->end = end;
|
||||
rtems_bdpart_to_partition_type( type, (*p)->type);
|
||||
(*p)->flags = data [RTEMS_BDPART_MBR_OFFSET_FLAGS];
|
||||
( *p )->begin = begin;
|
||||
( *p )->end = end;
|
||||
rtems_bdpart_to_partition_type( type, ( *p )->type );
|
||||
( *p )->flags = data[ RTEMS_BDPART_MBR_OFFSET_FLAGS ];
|
||||
}
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static rtems_status_code rtems_bdpart_read_record(
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum index,
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum index,
|
||||
rtems_bdbuf_buffer **block
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
|
||||
/* Release previous block if necessary */
|
||||
if (*block != NULL) {
|
||||
sc = rtems_bdbuf_release( *block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( *block != NULL ) {
|
||||
sc = rtems_bdbuf_release( *block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
}
|
||||
|
||||
/* Read the record block */
|
||||
sc = rtems_bdbuf_read( dd, index, block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdbuf_read( dd, index, block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
@@ -228,7 +238,7 @@ static rtems_status_code rtems_bdpart_read_record(
|
||||
}
|
||||
|
||||
/* Check MBR signature */
|
||||
if (!rtems_bdpart_is_valid_record( (*block)->buffer)) {
|
||||
if ( !rtems_bdpart_is_valid_record( ( *block )->buffer ) ) {
|
||||
return RTEMS_IO_ERROR;
|
||||
}
|
||||
|
||||
@@ -236,27 +246,27 @@ static rtems_status_code rtems_bdpart_read_record(
|
||||
}
|
||||
|
||||
rtems_status_code rtems_bdpart_read(
|
||||
const char *disk_name,
|
||||
rtems_bdpart_format *format,
|
||||
const char *disk_name,
|
||||
rtems_bdpart_format *format,
|
||||
rtems_bdpart_partition *pt,
|
||||
size_t *count
|
||||
size_t *count
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code esc = RTEMS_SUCCESSFUL;
|
||||
rtems_bdbuf_buffer *block = NULL;
|
||||
rtems_bdpart_partition *p = pt - 1;
|
||||
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
|
||||
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
|
||||
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
size_t i = 0;
|
||||
const uint8_t *data = NULL;
|
||||
int fd = -1;
|
||||
rtems_disk_device *dd = NULL;
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code esc = RTEMS_SUCCESSFUL;
|
||||
rtems_bdbuf_buffer *block = NULL;
|
||||
rtems_bdpart_partition *p = pt - 1;
|
||||
const rtems_bdpart_partition *p_end = pt + ( count != NULL ? *count : 0 );
|
||||
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
|
||||
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
size_t i = 0;
|
||||
const uint8_t *data = NULL;
|
||||
int fd = -1;
|
||||
rtems_disk_device *dd = NULL;
|
||||
|
||||
/* Check parameter */
|
||||
if (format == NULL || pt == NULL || count == NULL) {
|
||||
if ( format == NULL || pt == NULL || count == NULL ) {
|
||||
return RTEMS_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
@@ -264,28 +274,28 @@ rtems_status_code rtems_bdpart_read(
|
||||
*count = 0;
|
||||
|
||||
/* Get disk data */
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
/* Read MBR */
|
||||
sc = rtems_bdpart_read_record( dd, 0, &block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_read_record( dd, 0, &block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Read the first partition entry */
|
||||
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
|
||||
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Determine if we have a MBR or GPT format */
|
||||
if (rtems_bdpart_mbr_partition_type( p->type) == RTEMS_BDPART_MBR_GPT) {
|
||||
if ( rtems_bdpart_mbr_partition_type( p->type ) == RTEMS_BDPART_MBR_GPT ) {
|
||||
esc = RTEMS_NOT_IMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -298,11 +308,11 @@ rtems_status_code rtems_bdpart_read(
|
||||
format->mbr.dos_compatibility = true;
|
||||
|
||||
/* Iterate through the rest of the primary partition table */
|
||||
for (i = 1; i < 4; ++i) {
|
||||
for ( i = 1; i < 4; ++i ) {
|
||||
data += RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE;
|
||||
|
||||
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -310,12 +320,12 @@ rtems_status_code rtems_bdpart_read(
|
||||
|
||||
/* Iterate through the logical partitions within the extended partition */
|
||||
ebr = ep_begin;
|
||||
while (ebr != 0) {
|
||||
while ( ebr != 0 ) {
|
||||
rtems_blkdev_bnum tmp = 0;
|
||||
|
||||
/* Read EBR */
|
||||
sc = rtems_bdpart_read_record( dd, ebr, &block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_read_record( dd, ebr, &block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -327,14 +337,14 @@ rtems_status_code rtems_bdpart_read(
|
||||
p_end,
|
||||
NULL
|
||||
);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Adjust partition begin */
|
||||
tmp = p->begin + ebr;
|
||||
if (tmp > p->begin) {
|
||||
if ( tmp > p->begin ) {
|
||||
p->begin = tmp;
|
||||
} else {
|
||||
esc = RTEMS_IO_ERROR;
|
||||
@@ -343,7 +353,7 @@ rtems_status_code rtems_bdpart_read(
|
||||
|
||||
/* Adjust partition end */
|
||||
tmp = p->end + ebr;
|
||||
if (tmp > p->end) {
|
||||
if ( tmp > p->end ) {
|
||||
p->end = tmp;
|
||||
} else {
|
||||
esc = RTEMS_IO_ERROR;
|
||||
@@ -354,10 +364,10 @@ rtems_status_code rtems_bdpart_read(
|
||||
ebr = rtems_bdpart_next_ebr(
|
||||
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_1
|
||||
);
|
||||
if (ebr != 0) {
|
||||
if ( ebr != 0 ) {
|
||||
/* Adjust partition EBR block index */
|
||||
tmp = ebr + ep_begin;
|
||||
if (tmp > ebr) {
|
||||
if ( tmp > ebr ) {
|
||||
ebr = tmp;
|
||||
} else {
|
||||
esc = RTEMS_IO_ERROR;
|
||||
@@ -367,16 +377,16 @@ rtems_status_code rtems_bdpart_read(
|
||||
}
|
||||
|
||||
/* Return partition count */
|
||||
*count = (size_t) (p - pt + 1);
|
||||
*count = (size_t) ( p - pt + 1 );
|
||||
|
||||
cleanup:
|
||||
|
||||
if (fd >= 0) {
|
||||
close( fd);
|
||||
if ( fd >= 0 ) {
|
||||
close( fd );
|
||||
}
|
||||
|
||||
if (block != NULL) {
|
||||
rtems_bdbuf_release( block);
|
||||
if ( block != NULL ) {
|
||||
rtems_bdbuf_release( block );
|
||||
}
|
||||
|
||||
return esc;
|
||||
|
||||
@@ -45,14 +45,16 @@
|
||||
#include <rtems.h>
|
||||
#include <rtems/bdpart.h>
|
||||
|
||||
static char *create_logical_disk_name( const char *disk_name, char **marker)
|
||||
static char *create_logical_disk_name( const char *disk_name, char **marker )
|
||||
{
|
||||
size_t disk_name_size = strlen( disk_name);
|
||||
char *logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
|
||||
size_t disk_name_size = strlen( disk_name );
|
||||
char *logical_disk_name = malloc(
|
||||
disk_name_size + RTEMS_BDPART_NUMBER_SIZE
|
||||
);
|
||||
|
||||
if (logical_disk_name != NULL) {
|
||||
if ( logical_disk_name != NULL ) {
|
||||
/* The string is NUL terminated by (A) ... */
|
||||
memcpy( logical_disk_name, disk_name, disk_name_size);
|
||||
memcpy( logical_disk_name, disk_name, disk_name_size );
|
||||
*marker = logical_disk_name + disk_name_size;
|
||||
}
|
||||
|
||||
@@ -60,16 +62,16 @@ static char *create_logical_disk_name( const char *disk_name, char **marker)
|
||||
}
|
||||
|
||||
static rtems_status_code update_logical_disk_name(
|
||||
char *logical_disk_marker,
|
||||
char *logical_disk_marker,
|
||||
size_t i
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
int rv = 0;
|
||||
int rv = 0;
|
||||
|
||||
/* ... (A) */
|
||||
rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
|
||||
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
|
||||
rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1 );
|
||||
if ( rv >= RTEMS_BDPART_NUMBER_SIZE ) {
|
||||
sc = RTEMS_INVALID_NAME;
|
||||
}
|
||||
|
||||
@@ -77,23 +79,23 @@ static rtems_status_code update_logical_disk_name(
|
||||
}
|
||||
|
||||
rtems_status_code rtems_bdpart_register(
|
||||
const char *disk_name,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_partition *pt,
|
||||
size_t count
|
||||
size_t count
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code esc = RTEMS_SUCCESSFUL;
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
char *logical_disk_name = NULL;
|
||||
char *logical_disk_marker = NULL;
|
||||
size_t i = 0;
|
||||
int fd = -1;
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code esc = RTEMS_SUCCESSFUL;
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
char *logical_disk_name = NULL;
|
||||
char *logical_disk_marker = NULL;
|
||||
size_t i = 0;
|
||||
int fd = -1;
|
||||
rtems_disk_device *dd = NULL;
|
||||
|
||||
/* Get disk data */
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
@@ -102,18 +104,18 @@ rtems_status_code rtems_bdpart_register(
|
||||
disk_name,
|
||||
&logical_disk_marker
|
||||
);
|
||||
if (logical_disk_name == NULL) {
|
||||
if ( logical_disk_name == NULL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Create a logical disk for each partition */
|
||||
for (i = 0; i < count; ++i) {
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
const rtems_bdpart_partition *p = pt + i;
|
||||
|
||||
/* Set partition number for logical disk name */
|
||||
sc = update_logical_disk_name( logical_disk_marker, i);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = update_logical_disk_name( logical_disk_marker, i );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -125,7 +127,7 @@ rtems_status_code rtems_bdpart_register(
|
||||
p->begin,
|
||||
p->end - p->begin
|
||||
);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -133,47 +135,47 @@ rtems_status_code rtems_bdpart_register(
|
||||
|
||||
cleanup:
|
||||
|
||||
free( logical_disk_name);
|
||||
close( fd);
|
||||
free( logical_disk_name );
|
||||
close( fd );
|
||||
|
||||
return esc;
|
||||
}
|
||||
|
||||
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name)
|
||||
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name )
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_bdpart_format format;
|
||||
rtems_bdpart_partition pt [RTEMS_BDPART_PARTITION_NUMBER_HINT];
|
||||
size_t count = RTEMS_BDPART_PARTITION_NUMBER_HINT;
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_bdpart_format format;
|
||||
rtems_bdpart_partition pt[ RTEMS_BDPART_PARTITION_NUMBER_HINT ];
|
||||
size_t count = RTEMS_BDPART_PARTITION_NUMBER_HINT;
|
||||
|
||||
/* Read partitions */
|
||||
sc = rtems_bdpart_read( disk_name, &format, pt, &count);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_read( disk_name, &format, pt, &count );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
/* Register partitions */
|
||||
return rtems_bdpart_register( disk_name, pt, count);
|
||||
return rtems_bdpart_register( disk_name, pt, count );
|
||||
}
|
||||
|
||||
rtems_status_code rtems_bdpart_unregister(
|
||||
const char *disk_name,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_partition *pt RTEMS_UNUSED,
|
||||
size_t count
|
||||
size_t count
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code esc = RTEMS_SUCCESSFUL;
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
char *logical_disk_name = NULL;
|
||||
char *logical_disk_marker = NULL;
|
||||
size_t i = 0;
|
||||
int fd = -1;
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code esc = RTEMS_SUCCESSFUL;
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
char *logical_disk_name = NULL;
|
||||
char *logical_disk_marker = NULL;
|
||||
size_t i = 0;
|
||||
int fd = -1;
|
||||
rtems_disk_device *dd = NULL;
|
||||
|
||||
/* Get disk data */
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
@@ -182,25 +184,25 @@ rtems_status_code rtems_bdpart_unregister(
|
||||
disk_name,
|
||||
&logical_disk_marker
|
||||
);
|
||||
if (logical_disk_name == NULL) {
|
||||
if ( logical_disk_name == NULL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Delete the logical disk for each partition */
|
||||
for (i = 0; i < count; ++i) {
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
int rv = 0;
|
||||
|
||||
/* Set partition number for logical disk name */
|
||||
sc = update_logical_disk_name( logical_disk_marker, i);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = update_logical_disk_name( logical_disk_marker, i );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Delete logical disk */
|
||||
rv = unlink( logical_disk_name);
|
||||
if (rv != 0) {
|
||||
rv = unlink( logical_disk_name );
|
||||
if ( rv != 0 ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -212,9 +214,9 @@ cleanup:
|
||||
* When we get here, logical_disk_name is guaranteed to be non-NULL
|
||||
* but fd may be -1. Coverity flagged passing a bad value to close().
|
||||
*/
|
||||
free( logical_disk_name);
|
||||
if (fd >= 0) {
|
||||
close( fd);
|
||||
free( logical_disk_name );
|
||||
if ( fd >= 0 ) {
|
||||
close( fd );
|
||||
}
|
||||
|
||||
return esc;
|
||||
|
||||
@@ -42,21 +42,21 @@
|
||||
#include <rtems.h>
|
||||
#include <rtems/bdpart.h>
|
||||
|
||||
static int rtems_bdpart_partition_compare( const void *aa, const void *bb)
|
||||
static int rtems_bdpart_partition_compare( const void *aa, const void *bb )
|
||||
{
|
||||
const rtems_bdpart_partition *a = aa;
|
||||
const rtems_bdpart_partition *b = bb;
|
||||
|
||||
if (a->begin < b->begin) {
|
||||
if ( a->begin < b->begin ) {
|
||||
return -1;
|
||||
} else if (a->begin == b->begin) {
|
||||
} else if ( a->begin == b->begin ) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void rtems_bdpart_sort( rtems_bdpart_partition *pt, size_t count)
|
||||
void rtems_bdpart_sort( rtems_bdpart_partition *pt, size_t count )
|
||||
{
|
||||
qsort( pt, count, sizeof( *pt), rtems_bdpart_partition_compare);
|
||||
qsort( pt, count, sizeof( *pt ), rtems_bdpart_partition_compare );
|
||||
}
|
||||
|
||||
@@ -48,35 +48,35 @@ static void rtems_bdpart_write_mbr_partition(
|
||||
uint8_t *data,
|
||||
uint32_t begin,
|
||||
uint32_t size,
|
||||
uint8_t type,
|
||||
uint8_t flags
|
||||
uint8_t type,
|
||||
uint8_t flags
|
||||
)
|
||||
{
|
||||
rtems_uint32_to_little_endian( begin, data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
|
||||
rtems_uint32_to_little_endian( size, data + RTEMS_BDPART_MBR_OFFSET_SIZE);
|
||||
data [RTEMS_BDPART_MBR_OFFSET_TYPE] = type;
|
||||
data [RTEMS_BDPART_MBR_OFFSET_FLAGS] = flags;
|
||||
rtems_uint32_to_little_endian( begin, data + RTEMS_BDPART_MBR_OFFSET_BEGIN );
|
||||
rtems_uint32_to_little_endian( size, data + RTEMS_BDPART_MBR_OFFSET_SIZE );
|
||||
data[ RTEMS_BDPART_MBR_OFFSET_TYPE ] = type;
|
||||
data[ RTEMS_BDPART_MBR_OFFSET_FLAGS ] = flags;
|
||||
}
|
||||
|
||||
static rtems_status_code rtems_bdpart_new_record(
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum index,
|
||||
rtems_disk_device *dd,
|
||||
rtems_blkdev_bnum index,
|
||||
rtems_bdbuf_buffer **block
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
|
||||
/* Synchronize previous block if necessary */
|
||||
if (*block != NULL) {
|
||||
sc = rtems_bdbuf_sync( *block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( *block != NULL ) {
|
||||
sc = rtems_bdbuf_sync( *block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
}
|
||||
|
||||
/* Read the new record block (this accounts for disk block sizes > 512) */
|
||||
sc = rtems_bdbuf_read( dd, index, block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdbuf_read( dd, index, block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
@@ -86,86 +86,87 @@ static rtems_status_code rtems_bdpart_new_record(
|
||||
}
|
||||
|
||||
/* Clear record */
|
||||
memset( (*block)->buffer, 0, RTEMS_BDPART_BLOCK_SIZE);
|
||||
memset( ( *block )->buffer, 0, RTEMS_BDPART_BLOCK_SIZE );
|
||||
|
||||
/* Write signature */
|
||||
(*block)->buffer [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0] =
|
||||
( *block )->buffer[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0 ] =
|
||||
RTEMS_BDPART_MBR_SIGNATURE_0;
|
||||
(*block)->buffer [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1] =
|
||||
( *block )->buffer[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1 ] =
|
||||
RTEMS_BDPART_MBR_SIGNATURE_1;
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
rtems_status_code rtems_bdpart_write(
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_format *format,
|
||||
const char *disk_name,
|
||||
const rtems_bdpart_format *format,
|
||||
const rtems_bdpart_partition *pt,
|
||||
size_t count
|
||||
size_t count
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code esc = RTEMS_SUCCESSFUL;
|
||||
bool dos_compatibility = format != NULL
|
||||
&& format->type == RTEMS_BDPART_FORMAT_MBR
|
||||
&& format->mbr.dos_compatibility;
|
||||
bool dos_compatibility = format != NULL &&
|
||||
format->type == RTEMS_BDPART_FORMAT_MBR &&
|
||||
format->mbr.dos_compatibility;
|
||||
rtems_bdbuf_buffer *block = NULL;
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
rtems_blkdev_bnum record_space =
|
||||
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
|
||||
size_t ppc = 0; /* Primary partition count */
|
||||
size_t i = 0;
|
||||
uint8_t *data = NULL;
|
||||
int fd = -1;
|
||||
rtems_disk_device *dd = NULL;
|
||||
rtems_blkdev_bnum disk_end = 0;
|
||||
rtems_blkdev_bnum record_space = dos_compatibility
|
||||
? RTEMS_BDPART_MBR_CYLINDER_SIZE
|
||||
: 1;
|
||||
size_t ppc = 0; /* Primary partition count */
|
||||
size_t i = 0;
|
||||
uint8_t *data = NULL;
|
||||
int fd = -1;
|
||||
rtems_disk_device *dd = NULL;
|
||||
|
||||
/* Check if we have something to do */
|
||||
if (count == 0) {
|
||||
if ( count == 0 ) {
|
||||
/* Nothing to do */
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
/* Check parameter */
|
||||
if (format == NULL || pt == NULL) {
|
||||
if ( format == NULL || pt == NULL ) {
|
||||
return RTEMS_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
/* Get disk data */
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return sc;
|
||||
}
|
||||
|
||||
/* Align end of disk on cylinder boundary if necessary */
|
||||
if (dos_compatibility) {
|
||||
disk_end -= (disk_end % record_space);
|
||||
if ( dos_compatibility ) {
|
||||
disk_end -= ( disk_end % record_space );
|
||||
}
|
||||
|
||||
/* Check that we have a consistent partition table */
|
||||
for (i = 0; i < count; ++i) {
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
const rtems_bdpart_partition *p = pt + i;
|
||||
|
||||
/* Check that begin and end are proper within the disk */
|
||||
if (p->begin >= disk_end || p->end > disk_end) {
|
||||
if ( p->begin >= disk_end || p->end > disk_end ) {
|
||||
esc = RTEMS_INVALID_NUMBER;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Check that begin and end are valid */
|
||||
if (p->begin >= p->end) {
|
||||
if ( p->begin >= p->end ) {
|
||||
esc = RTEMS_INVALID_NUMBER;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Check that partitions do not overlap */
|
||||
if (i > 0 && pt [i - 1].end > p->begin) {
|
||||
if ( i > 0 && pt[ i - 1 ].end > p->begin ) {
|
||||
esc = RTEMS_INVALID_NUMBER;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check format */
|
||||
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
|
||||
if ( format->type != RTEMS_BDPART_FORMAT_MBR ) {
|
||||
esc = RTEMS_NOT_IMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -182,7 +183,7 @@ rtems_status_code rtems_bdpart_write(
|
||||
* Check that the first primary partition starts at head one and sector one
|
||||
* under the virtual one head and 63 sectors geometry if necessary.
|
||||
*/
|
||||
if (dos_compatibility && pt [0].begin != RTEMS_BDPART_MBR_CYLINDER_SIZE) {
|
||||
if ( dos_compatibility && pt[ 0 ].begin != RTEMS_BDPART_MBR_CYLINDER_SIZE ) {
|
||||
esc = RTEMS_INVALID_NUMBER;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -196,27 +197,27 @@ rtems_status_code rtems_bdpart_write(
|
||||
* compatibility resides between the partitions. So there have to be gaps of
|
||||
* the appropriate size between the partitions.
|
||||
*/
|
||||
for (i = ppc; i < count; ++i) {
|
||||
if ((pt [i].begin - pt [i - 1].end) < record_space) {
|
||||
for ( i = ppc; i < count; ++i ) {
|
||||
if ( ( pt[ i ].begin - pt[ i - 1 ].end ) < record_space ) {
|
||||
esc = RTEMS_INVALID_NUMBER;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check that we can convert the parition descriptions to the MBR format */
|
||||
for (i = 0; i < count; ++i) {
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
uint8_t type = 0;
|
||||
|
||||
const rtems_bdpart_partition *p = pt + i;
|
||||
|
||||
/* Check type */
|
||||
if (!rtems_bdpart_to_mbr_partition_type( p->type, &type)) {
|
||||
esc = RTEMS_INVALID_ID;
|
||||
if ( !rtems_bdpart_to_mbr_partition_type( p->type, &type ) ) {
|
||||
esc = RTEMS_INVALID_ID;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Check flags */
|
||||
if (p->flags > 0xffU) {
|
||||
if ( p->flags > 0xffU ) {
|
||||
esc = RTEMS_INVALID_ID;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -226,8 +227,8 @@ rtems_status_code rtems_bdpart_write(
|
||||
}
|
||||
|
||||
/* New MBR */
|
||||
sc = rtems_bdpart_new_record( dd, 0, &block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_new_record( dd, 0, &block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -240,7 +241,7 @@ rtems_status_code rtems_bdpart_write(
|
||||
|
||||
/* Write primary partition table */
|
||||
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
|
||||
for (i = 0; i < ppc; ++i) {
|
||||
for ( i = 0; i < ppc; ++i ) {
|
||||
const rtems_bdpart_partition *p = pt + i;
|
||||
|
||||
/* Write partition entry */
|
||||
@@ -248,7 +249,7 @@ rtems_status_code rtems_bdpart_write(
|
||||
data,
|
||||
p->begin,
|
||||
p->end - p->begin,
|
||||
rtems_bdpart_mbr_partition_type( p->type),
|
||||
rtems_bdpart_mbr_partition_type( p->type ),
|
||||
(uint8_t) p->flags
|
||||
);
|
||||
|
||||
@@ -256,11 +257,11 @@ rtems_status_code rtems_bdpart_write(
|
||||
}
|
||||
|
||||
/* Write extended partition with logical partitions if necessary */
|
||||
if (ppc != count) {
|
||||
if ( ppc != count ) {
|
||||
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
|
||||
|
||||
/* Begin of extended partition */
|
||||
rtems_blkdev_bnum ep_begin = pt [ppc].begin - record_space;
|
||||
rtems_blkdev_bnum ep_begin = pt[ ppc ].begin - record_space;
|
||||
|
||||
/* Write extended partition */
|
||||
rtems_bdpart_write_mbr_partition(
|
||||
@@ -272,11 +273,11 @@ rtems_status_code rtems_bdpart_write(
|
||||
);
|
||||
|
||||
/* Write logical partitions */
|
||||
for (i = ppc; i < count; ++i) {
|
||||
for ( i = ppc; i < count; ++i ) {
|
||||
const rtems_bdpart_partition *p = pt + i;
|
||||
|
||||
/* Write second partition entry */
|
||||
if (i > ppc) {
|
||||
if ( i > ppc ) {
|
||||
rtems_blkdev_bnum begin = p->begin - record_space;
|
||||
|
||||
rtems_bdpart_write_mbr_partition(
|
||||
@@ -290,8 +291,8 @@ rtems_status_code rtems_bdpart_write(
|
||||
|
||||
/* New EBR */
|
||||
ebr = p->begin - record_space;
|
||||
sc = rtems_bdpart_new_record( dd, ebr, &block);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdpart_new_record( dd, ebr, &block );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
esc = sc;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -301,7 +302,7 @@ rtems_status_code rtems_bdpart_write(
|
||||
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0,
|
||||
record_space,
|
||||
p->end - p->begin,
|
||||
rtems_bdpart_mbr_partition_type( p->type),
|
||||
rtems_bdpart_mbr_partition_type( p->type ),
|
||||
(uint8_t) p->flags
|
||||
);
|
||||
}
|
||||
@@ -309,12 +310,12 @@ rtems_status_code rtems_bdpart_write(
|
||||
|
||||
cleanup:
|
||||
|
||||
if (fd >= 0) {
|
||||
close( fd);
|
||||
if ( fd >= 0 ) {
|
||||
close( fd );
|
||||
}
|
||||
|
||||
if (block != NULL) {
|
||||
rtems_bdbuf_sync( block);
|
||||
if ( block != NULL ) {
|
||||
rtems_bdbuf_sync( block );
|
||||
}
|
||||
|
||||
return esc;
|
||||
|
||||
@@ -45,34 +45,42 @@
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
void rtems_blkstats(const rtems_printer* printer, const char *device, bool reset)
|
||||
void rtems_blkstats(
|
||||
const rtems_printer *printer,
|
||||
const char *device,
|
||||
bool reset
|
||||
)
|
||||
{
|
||||
int fd = open(device, O_RDONLY);
|
||||
int fd = open( device, O_RDONLY );
|
||||
|
||||
if (fd >= 0) {
|
||||
if ( fd >= 0 ) {
|
||||
struct stat st;
|
||||
int rv;
|
||||
int rv;
|
||||
|
||||
rv = fstat(fd, &st);
|
||||
if (rv == 0) {
|
||||
if (S_ISBLK(st.st_mode)) {
|
||||
if (reset) {
|
||||
rv = rtems_disk_fd_reset_device_stats(fd);
|
||||
if (rv != 0) {
|
||||
rtems_printf(printer, "error: reset stats: %s\n", strerror(errno));
|
||||
rv = fstat( fd, &st );
|
||||
if ( rv == 0 ) {
|
||||
if ( S_ISBLK( st.st_mode ) ) {
|
||||
if ( reset ) {
|
||||
rv = rtems_disk_fd_reset_device_stats( fd );
|
||||
if ( rv != 0 ) {
|
||||
rtems_printf(
|
||||
printer,
|
||||
"error: reset stats: %s\n",
|
||||
strerror( errno )
|
||||
);
|
||||
}
|
||||
} else {
|
||||
uint32_t media_block_size = 0;
|
||||
uint32_t media_block_count = 0;
|
||||
uint32_t block_size = 0;
|
||||
uint32_t media_block_size = 0;
|
||||
uint32_t media_block_count = 0;
|
||||
uint32_t block_size = 0;
|
||||
rtems_blkdev_stats stats;
|
||||
|
||||
rtems_disk_fd_get_media_block_size(fd, &media_block_size);
|
||||
rtems_disk_fd_get_block_count(fd, &media_block_count);
|
||||
rtems_disk_fd_get_block_size(fd, &block_size);
|
||||
rtems_disk_fd_get_media_block_size( fd, &media_block_size );
|
||||
rtems_disk_fd_get_block_count( fd, &media_block_count );
|
||||
rtems_disk_fd_get_block_size( fd, &block_size );
|
||||
|
||||
rv = rtems_disk_fd_get_device_stats(fd, &stats);
|
||||
if (rv == 0) {
|
||||
rv = rtems_disk_fd_get_device_stats( fd, &stats );
|
||||
if ( rv == 0 ) {
|
||||
rtems_blkdev_print_stats(
|
||||
&stats,
|
||||
media_block_size,
|
||||
@@ -81,21 +89,29 @@ void rtems_blkstats(const rtems_printer* printer, const char *device, bool reset
|
||||
printer
|
||||
);
|
||||
} else {
|
||||
rtems_printf(printer, "error: get stats: %s\n", strerror(errno));
|
||||
rtems_printf(
|
||||
printer,
|
||||
"error: get stats: %s\n",
|
||||
strerror( errno )
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
rtems_printf(printer, "error: not a block device\n");
|
||||
rtems_printf( printer, "error: not a block device\n" );
|
||||
}
|
||||
} else {
|
||||
rtems_printf(printer, "error: get file stats: %s\n", strerror(errno));
|
||||
rtems_printf(
|
||||
printer,
|
||||
"error: get file stats: %s\n",
|
||||
strerror( errno )
|
||||
);
|
||||
}
|
||||
|
||||
rv = close(fd);
|
||||
if (rv != 0) {
|
||||
rtems_printf(printer, "error: close device: %s\n", strerror(errno));
|
||||
rv = close( fd );
|
||||
if ( rv != 0 ) {
|
||||
rtems_printf( printer, "error: close device: %s\n", strerror( errno ) );
|
||||
}
|
||||
} else {
|
||||
rtems_printf(printer, "error: open device: %s\n", strerror(errno));
|
||||
rtems_printf( printer, "error: open device: %s\n", strerror( errno ) );
|
||||
}
|
||||
}
|
||||
|
||||
+108
-110
@@ -49,40 +49,40 @@
|
||||
|
||||
typedef struct {
|
||||
rtems_disk_device dd;
|
||||
int fd;
|
||||
int fd;
|
||||
} rtems_blkdev_imfs_context;
|
||||
|
||||
static ssize_t rtems_blkdev_imfs_read(
|
||||
rtems_libio_t *iop,
|
||||
void *buffer,
|
||||
size_t count
|
||||
void *buffer,
|
||||
size_t count
|
||||
)
|
||||
{
|
||||
int rv;
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
ssize_t remaining = (ssize_t) count;
|
||||
off_t offset = iop->offset;
|
||||
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
|
||||
ssize_t block_offset = (ssize_t) (offset % block_size);
|
||||
char *dst = buffer;
|
||||
int rv;
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
ssize_t remaining = (ssize_t) count;
|
||||
off_t offset = iop->offset;
|
||||
ssize_t block_size = (ssize_t) rtems_disk_get_block_size( dd );
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( offset / block_size );
|
||||
ssize_t block_offset = (ssize_t) ( offset % block_size );
|
||||
char *dst = buffer;
|
||||
|
||||
while (remaining > 0) {
|
||||
while ( remaining > 0 ) {
|
||||
rtems_bdbuf_buffer *bd;
|
||||
rtems_status_code sc = rtems_bdbuf_read(dd, block, &bd);
|
||||
rtems_status_code sc = rtems_bdbuf_read( dd, block, &bd );
|
||||
|
||||
if (sc == RTEMS_SUCCESSFUL) {
|
||||
if ( sc == RTEMS_SUCCESSFUL ) {
|
||||
ssize_t copy = block_size - block_offset;
|
||||
|
||||
if (copy > remaining) {
|
||||
if ( copy > remaining ) {
|
||||
copy = remaining;
|
||||
}
|
||||
|
||||
memcpy(dst, (char *) bd->buffer + block_offset, (size_t) copy);
|
||||
memcpy( dst, (char *) bd->buffer + block_offset, (size_t) copy );
|
||||
|
||||
sc = rtems_bdbuf_release(bd);
|
||||
if (sc == RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdbuf_release( bd );
|
||||
if ( sc == RTEMS_SUCCESSFUL ) {
|
||||
block_offset = 0;
|
||||
remaining -= copy;
|
||||
dst += copy;
|
||||
@@ -95,7 +95,7 @@ static ssize_t rtems_blkdev_imfs_read(
|
||||
}
|
||||
}
|
||||
|
||||
if (remaining >= 0) {
|
||||
if ( remaining >= 0 ) {
|
||||
iop->offset += count;
|
||||
rv = (ssize_t) count;
|
||||
} else {
|
||||
@@ -108,41 +108,41 @@ static ssize_t rtems_blkdev_imfs_read(
|
||||
|
||||
static ssize_t rtems_blkdev_imfs_write(
|
||||
rtems_libio_t *iop,
|
||||
const void *buffer,
|
||||
size_t count
|
||||
const void *buffer,
|
||||
size_t count
|
||||
)
|
||||
{
|
||||
int rv;
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
ssize_t remaining = (ssize_t) count;
|
||||
off_t offset = iop->offset;
|
||||
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
|
||||
ssize_t block_offset = (ssize_t) (offset % block_size);
|
||||
const char *src = buffer;
|
||||
int rv;
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
ssize_t remaining = (ssize_t) count;
|
||||
off_t offset = iop->offset;
|
||||
ssize_t block_size = (ssize_t) rtems_disk_get_block_size( dd );
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( offset / block_size );
|
||||
ssize_t block_offset = (ssize_t) ( offset % block_size );
|
||||
const char *src = buffer;
|
||||
|
||||
while (remaining > 0) {
|
||||
rtems_status_code sc;
|
||||
while ( remaining > 0 ) {
|
||||
rtems_status_code sc;
|
||||
rtems_bdbuf_buffer *bd;
|
||||
|
||||
if (block_offset == 0 && remaining >= block_size) {
|
||||
sc = rtems_bdbuf_get(dd, block, &bd);
|
||||
if ( block_offset == 0 && remaining >= block_size ) {
|
||||
sc = rtems_bdbuf_get( dd, block, &bd );
|
||||
} else {
|
||||
sc = rtems_bdbuf_read(dd, block, &bd);
|
||||
sc = rtems_bdbuf_read( dd, block, &bd );
|
||||
}
|
||||
|
||||
if (sc == RTEMS_SUCCESSFUL) {
|
||||
if ( sc == RTEMS_SUCCESSFUL ) {
|
||||
ssize_t copy = block_size - block_offset;
|
||||
|
||||
if (copy > remaining) {
|
||||
if ( copy > remaining ) {
|
||||
copy = remaining;
|
||||
}
|
||||
|
||||
memcpy((char *) bd->buffer + block_offset, src, (size_t) copy);
|
||||
memcpy( (char *) bd->buffer + block_offset, src, (size_t) copy );
|
||||
|
||||
sc = rtems_bdbuf_release_modified(bd);
|
||||
if (sc == RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_bdbuf_release_modified( bd );
|
||||
if ( sc == RTEMS_SUCCESSFUL ) {
|
||||
block_offset = 0;
|
||||
remaining -= copy;
|
||||
src += copy;
|
||||
@@ -155,7 +155,7 @@ static ssize_t rtems_blkdev_imfs_write(
|
||||
}
|
||||
}
|
||||
|
||||
if (remaining >= 0) {
|
||||
if ( remaining >= 0 ) {
|
||||
iop->offset += count;
|
||||
rv = (ssize_t) count;
|
||||
} else {
|
||||
@@ -167,18 +167,18 @@ static ssize_t rtems_blkdev_imfs_write(
|
||||
}
|
||||
|
||||
static int rtems_blkdev_imfs_ioctl(
|
||||
rtems_libio_t *iop,
|
||||
rtems_libio_t *iop,
|
||||
ioctl_command_t request,
|
||||
void *buffer
|
||||
void *buffer
|
||||
)
|
||||
{
|
||||
int rv = 0;
|
||||
|
||||
if (request != RTEMS_BLKIO_REQUEST) {
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
if ( request != RTEMS_BLKIO_REQUEST ) {
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
|
||||
rv = (*dd->ioctl)(dd, request, buffer);
|
||||
rv = ( *dd->ioctl )( dd, request, buffer );
|
||||
} else {
|
||||
/*
|
||||
* It is not allowed to directly access the driver circumventing the cache.
|
||||
@@ -192,35 +192,33 @@ static int rtems_blkdev_imfs_ioctl(
|
||||
|
||||
static int rtems_blkdev_imfs_fstat(
|
||||
const rtems_filesystem_location_info_t *loc,
|
||||
struct stat *buf
|
||||
struct stat *buf
|
||||
)
|
||||
{
|
||||
rtems_blkdev_imfs_context *ctx;
|
||||
rtems_disk_device *dd;
|
||||
IMFS_jnode_t *node;
|
||||
rtems_disk_device *dd;
|
||||
IMFS_jnode_t *node;
|
||||
|
||||
ctx = IMFS_generic_get_context_by_location(loc);
|
||||
ctx = IMFS_generic_get_context_by_location( loc );
|
||||
dd = &ctx->dd;
|
||||
|
||||
buf->st_blksize = rtems_disk_get_block_size(dd);
|
||||
buf->st_blocks = rtems_disk_get_block_count(dd);
|
||||
buf->st_blksize = rtems_disk_get_block_size( dd );
|
||||
buf->st_blocks = rtems_disk_get_block_count( dd );
|
||||
|
||||
node = loc->node_access;
|
||||
buf->st_rdev = IMFS_generic_get_device_identifier_by_node(node);
|
||||
buf->st_rdev = IMFS_generic_get_device_identifier_by_node( node );
|
||||
|
||||
return IMFS_stat(loc, buf);
|
||||
return IMFS_stat( loc, buf );
|
||||
}
|
||||
|
||||
static int rtems_blkdev_imfs_fsync_or_fdatasync(
|
||||
rtems_libio_t *iop
|
||||
)
|
||||
static int rtems_blkdev_imfs_fsync_or_fdatasync( rtems_libio_t *iop )
|
||||
{
|
||||
int rv = 0;
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
rtems_status_code sc = rtems_bdbuf_syncdev(dd);
|
||||
int rv = 0;
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
rtems_status_code sc = rtems_bdbuf_syncdev( dd );
|
||||
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
errno = EIO;
|
||||
rv = -1;
|
||||
}
|
||||
@@ -249,65 +247,65 @@ static const rtems_filesystem_file_handlers_r rtems_blkdev_imfs_node = {
|
||||
|
||||
static IMFS_jnode_t *rtems_blkdev_imfs_initialize(
|
||||
IMFS_jnode_t *node,
|
||||
void *arg
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_blkdev_imfs_context *ctx;
|
||||
rtems_disk_device *dd;
|
||||
rtems_disk_device *dd;
|
||||
|
||||
node = IMFS_node_initialize_generic(node, arg);
|
||||
node = IMFS_node_initialize_generic( node, arg );
|
||||
|
||||
ctx = IMFS_generic_get_context_by_node(node);
|
||||
ctx = IMFS_generic_get_context_by_node( node );
|
||||
dd = &ctx->dd;
|
||||
dd->dev = IMFS_generic_get_device_identifier_by_node(node);
|
||||
dd->dev = IMFS_generic_get_device_identifier_by_node( node );
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static void rtems_blkdev_imfs_destroy(IMFS_jnode_t *node)
|
||||
static void rtems_blkdev_imfs_destroy( IMFS_jnode_t *node )
|
||||
{
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_node(node);
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_node( node );
|
||||
rtems_disk_device *dd = &ctx->dd;
|
||||
|
||||
(void) rtems_bdbuf_syncdev(dd);
|
||||
rtems_bdbuf_purge_dev(dd);
|
||||
(void) rtems_bdbuf_syncdev( dd );
|
||||
rtems_bdbuf_purge_dev( dd );
|
||||
|
||||
if (ctx->fd >= 0) {
|
||||
close(ctx->fd);
|
||||
if ( ctx->fd >= 0 ) {
|
||||
close( ctx->fd );
|
||||
} else {
|
||||
(*dd->ioctl)(dd, RTEMS_BLKIO_DELETED, NULL);
|
||||
( *dd->ioctl )( dd, RTEMS_BLKIO_DELETED, NULL );
|
||||
}
|
||||
|
||||
free(ctx);
|
||||
free( ctx );
|
||||
|
||||
IMFS_node_destroy_default(node);
|
||||
IMFS_node_destroy_default( node );
|
||||
}
|
||||
|
||||
static const IMFS_node_control rtems_blkdev_imfs_control =
|
||||
IMFS_GENERIC_INITIALIZER(
|
||||
static const IMFS_node_control
|
||||
rtems_blkdev_imfs_control = IMFS_GENERIC_INITIALIZER(
|
||||
&rtems_blkdev_imfs_node,
|
||||
rtems_blkdev_imfs_initialize,
|
||||
rtems_blkdev_imfs_destroy
|
||||
);
|
||||
|
||||
rtems_status_code rtems_blkdev_create(
|
||||
const char *device,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
const char *device,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
rtems_block_device_ioctl handler,
|
||||
void *driver_data
|
||||
void *driver_data
|
||||
)
|
||||
{
|
||||
rtems_status_code sc;
|
||||
rtems_status_code sc;
|
||||
rtems_blkdev_imfs_context *ctx;
|
||||
|
||||
sc = rtems_bdbuf_init();
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
return RTEMS_INCORRECT_STATE;
|
||||
}
|
||||
|
||||
ctx = malloc(sizeof(*ctx));
|
||||
if (ctx != NULL) {
|
||||
ctx = malloc( sizeof( *ctx ) );
|
||||
if ( ctx != NULL ) {
|
||||
sc = rtems_disk_init_phys(
|
||||
&ctx->dd,
|
||||
media_block_size,
|
||||
@@ -318,7 +316,7 @@ rtems_status_code rtems_blkdev_create(
|
||||
|
||||
ctx->fd = -1;
|
||||
|
||||
if (sc == RTEMS_SUCCESSFUL) {
|
||||
if ( sc == RTEMS_SUCCESSFUL ) {
|
||||
int rv = IMFS_make_generic_node(
|
||||
device,
|
||||
S_IFBLK | S_IRWXU | S_IRWXG | S_IRWXO,
|
||||
@@ -326,12 +324,12 @@ rtems_status_code rtems_blkdev_create(
|
||||
ctx
|
||||
);
|
||||
|
||||
if (rv != 0) {
|
||||
free(ctx);
|
||||
if ( rv != 0 ) {
|
||||
free( ctx );
|
||||
sc = RTEMS_UNSATISFIED;
|
||||
}
|
||||
} else {
|
||||
free(ctx);
|
||||
free( ctx );
|
||||
}
|
||||
} else {
|
||||
sc = RTEMS_NO_MEMORY;
|
||||
@@ -341,28 +339,28 @@ rtems_status_code rtems_blkdev_create(
|
||||
}
|
||||
|
||||
rtems_status_code rtems_blkdev_create_partition(
|
||||
const char *partition,
|
||||
const char *parent_block_device,
|
||||
const char *partition,
|
||||
const char *parent_block_device,
|
||||
rtems_blkdev_bnum media_block_begin,
|
||||
rtems_blkdev_bnum media_block_count
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
int fd = open(parent_block_device, O_RDWR);
|
||||
int fd = open( parent_block_device, O_RDWR );
|
||||
|
||||
if (fd >= 0) {
|
||||
int rv;
|
||||
if ( fd >= 0 ) {
|
||||
int rv;
|
||||
struct stat st;
|
||||
|
||||
rv = fstat(fd, &st);
|
||||
if (rv == 0 && S_ISBLK(st.st_mode)) {
|
||||
rv = fstat( fd, &st );
|
||||
if ( rv == 0 && S_ISBLK( st.st_mode ) ) {
|
||||
rtems_disk_device *phys_dd;
|
||||
|
||||
rv = rtems_disk_fd_get_disk_device(fd, &phys_dd);
|
||||
if (rv == 0) {
|
||||
rtems_blkdev_imfs_context *ctx = malloc(sizeof(*ctx));
|
||||
rv = rtems_disk_fd_get_disk_device( fd, &phys_dd );
|
||||
if ( rv == 0 ) {
|
||||
rtems_blkdev_imfs_context *ctx = malloc( sizeof( *ctx ) );
|
||||
|
||||
if (ctx != NULL) {
|
||||
if ( ctx != NULL ) {
|
||||
sc = rtems_disk_init_log(
|
||||
&ctx->dd,
|
||||
phys_dd,
|
||||
@@ -370,7 +368,7 @@ rtems_status_code rtems_blkdev_create_partition(
|
||||
media_block_count
|
||||
);
|
||||
|
||||
if (sc == RTEMS_SUCCESSFUL) {
|
||||
if ( sc == RTEMS_SUCCESSFUL ) {
|
||||
ctx->fd = fd;
|
||||
|
||||
rv = IMFS_make_generic_node(
|
||||
@@ -380,12 +378,12 @@ rtems_status_code rtems_blkdev_create_partition(
|
||||
ctx
|
||||
);
|
||||
|
||||
if (rv != 0) {
|
||||
free(ctx);
|
||||
if ( rv != 0 ) {
|
||||
free( ctx );
|
||||
sc = RTEMS_UNSATISFIED;
|
||||
}
|
||||
} else {
|
||||
free(ctx);
|
||||
free( ctx );
|
||||
}
|
||||
} else {
|
||||
sc = RTEMS_NO_MEMORY;
|
||||
@@ -397,8 +395,8 @@ rtems_status_code rtems_blkdev_create_partition(
|
||||
sc = RTEMS_INVALID_NODE;
|
||||
}
|
||||
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
close(fd);
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
close( fd );
|
||||
}
|
||||
} else {
|
||||
sc = RTEMS_INVALID_ID;
|
||||
|
||||
@@ -20,63 +20,61 @@
|
||||
#include <rtems/blkdev.h>
|
||||
#include <rtems/bdbuf.h>
|
||||
|
||||
int
|
||||
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
|
||||
int rtems_blkdev_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
|
||||
{
|
||||
rtems_status_code sc;
|
||||
int rc = 0;
|
||||
rtems_status_code sc;
|
||||
int rc = 0;
|
||||
|
||||
switch (req)
|
||||
{
|
||||
case RTEMS_BLKIO_GETMEDIABLKSIZE:
|
||||
*(uint32_t *) argp = dd->media_block_size;
|
||||
break;
|
||||
switch ( req ) {
|
||||
case RTEMS_BLKIO_GETMEDIABLKSIZE:
|
||||
*(uint32_t *) argp = dd->media_block_size;
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_GETBLKSIZE:
|
||||
*(uint32_t *) argp = dd->block_size;
|
||||
break;
|
||||
case RTEMS_BLKIO_GETBLKSIZE:
|
||||
*(uint32_t *) argp = dd->block_size;
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_SETBLKSIZE:
|
||||
sc = rtems_bdbuf_set_block_size(dd, *(uint32_t *) argp, true);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
errno = EIO;
|
||||
rc = -1;
|
||||
}
|
||||
break;
|
||||
case RTEMS_BLKIO_SETBLKSIZE:
|
||||
sc = rtems_bdbuf_set_block_size( dd, *(uint32_t *) argp, true );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
errno = EIO;
|
||||
rc = -1;
|
||||
}
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_GETSIZE:
|
||||
*(rtems_blkdev_bnum *) argp = dd->size;
|
||||
break;
|
||||
case RTEMS_BLKIO_GETSIZE:
|
||||
*(rtems_blkdev_bnum *) argp = dd->size;
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_SYNCDEV:
|
||||
sc = rtems_bdbuf_syncdev(dd);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
errno = EIO;
|
||||
rc = -1;
|
||||
}
|
||||
break;
|
||||
case RTEMS_BLKIO_SYNCDEV:
|
||||
sc = rtems_bdbuf_syncdev( dd );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
errno = EIO;
|
||||
rc = -1;
|
||||
}
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_GETDISKDEV:
|
||||
*(rtems_disk_device **) argp = dd;
|
||||
break;
|
||||
case RTEMS_BLKIO_GETDISKDEV:
|
||||
*(rtems_disk_device **) argp = dd;
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_PURGEDEV:
|
||||
rtems_bdbuf_purge_dev(dd);
|
||||
break;
|
||||
case RTEMS_BLKIO_PURGEDEV:
|
||||
rtems_bdbuf_purge_dev( dd );
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_GETDEVSTATS:
|
||||
rtems_bdbuf_get_device_stats(dd, (rtems_blkdev_stats *) argp);
|
||||
break;
|
||||
case RTEMS_BLKIO_GETDEVSTATS:
|
||||
rtems_bdbuf_get_device_stats( dd, (rtems_blkdev_stats *) argp );
|
||||
break;
|
||||
|
||||
case RTEMS_BLKIO_RESETDEVSTATS:
|
||||
rtems_bdbuf_reset_device_stats(dd);
|
||||
break;
|
||||
case RTEMS_BLKIO_RESETDEVSTATS:
|
||||
rtems_bdbuf_reset_device_stats( dd );
|
||||
break;
|
||||
|
||||
default:
|
||||
errno = EINVAL;
|
||||
rc = -1;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
errno = EINVAL;
|
||||
rc = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -38,10 +38,10 @@
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
|
||||
const rtems_driver_address_table rtems_blkdev_generic_ops = {
|
||||
.initialization_entry = NULL,
|
||||
.open_entry = rtems_blkdev_generic_open,
|
||||
.close_entry = rtems_blkdev_generic_close,
|
||||
.read_entry = rtems_blkdev_generic_read,
|
||||
.write_entry = rtems_blkdev_generic_write,
|
||||
.control_entry = rtems_blkdev_generic_ioctl
|
||||
.initialization_entry = NULL,
|
||||
.open_entry = rtems_blkdev_generic_open,
|
||||
.close_entry = rtems_blkdev_generic_close,
|
||||
.read_entry = rtems_blkdev_generic_read,
|
||||
.write_entry = rtems_blkdev_generic_write,
|
||||
.control_entry = rtems_blkdev_generic_ioctl
|
||||
};
|
||||
|
||||
@@ -43,41 +43,41 @@
|
||||
|
||||
void rtems_blkdev_print_stats(
|
||||
const rtems_blkdev_stats *stats,
|
||||
uint32_t media_block_size,
|
||||
uint32_t media_block_count,
|
||||
uint32_t block_size,
|
||||
const rtems_printer* printer
|
||||
uint32_t media_block_size,
|
||||
uint32_t media_block_count,
|
||||
uint32_t block_size,
|
||||
const rtems_printer *printer
|
||||
)
|
||||
{
|
||||
rtems_printf(
|
||||
printer,
|
||||
"-------------------------------------------------------------------------------\n"
|
||||
" DEVICE STATISTICS\n"
|
||||
"----------------------+--------------------------------------------------------\n"
|
||||
" MEDIA BLOCK SIZE | %" PRIu32 "\n"
|
||||
" MEDIA BLOCK COUNT | %" PRIu32 "\n"
|
||||
" BLOCK SIZE | %" PRIu32 "\n"
|
||||
" READ HITS | %" PRIu32 "\n"
|
||||
" READ MISSES | %" PRIu32 "\n"
|
||||
" READ AHEAD TRANSFERS | %" PRIu32 "\n"
|
||||
" READ AHEAD PEEKS | %" PRIu32 "\n"
|
||||
" READ BLOCKS | %" PRIu32 "\n"
|
||||
" READ ERRORS | %" PRIu32 "\n"
|
||||
" WRITE TRANSFERS | %" PRIu32 "\n"
|
||||
" WRITE BLOCKS | %" PRIu32 "\n"
|
||||
" WRITE ERRORS | %" PRIu32 "\n"
|
||||
"----------------------+--------------------------------------------------------\n",
|
||||
media_block_size,
|
||||
media_block_count,
|
||||
block_size,
|
||||
stats->read_hits,
|
||||
stats->read_misses,
|
||||
stats->read_ahead_transfers,
|
||||
stats->read_ahead_peeks,
|
||||
stats->read_blocks,
|
||||
stats->read_errors,
|
||||
stats->write_transfers,
|
||||
stats->write_blocks,
|
||||
stats->write_errors
|
||||
printer,
|
||||
"-------------------------------------------------------------------------------\n"
|
||||
" DEVICE STATISTICS\n"
|
||||
"----------------------+--------------------------------------------------------\n"
|
||||
" MEDIA BLOCK SIZE | %" PRIu32 "\n"
|
||||
" MEDIA BLOCK COUNT | %" PRIu32 "\n"
|
||||
" BLOCK SIZE | %" PRIu32 "\n"
|
||||
" READ HITS | %" PRIu32 "\n"
|
||||
" READ MISSES | %" PRIu32 "\n"
|
||||
" READ AHEAD TRANSFERS | %" PRIu32 "\n"
|
||||
" READ AHEAD PEEKS | %" PRIu32 "\n"
|
||||
" READ BLOCKS | %" PRIu32 "\n"
|
||||
" READ ERRORS | %" PRIu32 "\n"
|
||||
" WRITE TRANSFERS | %" PRIu32 "\n"
|
||||
" WRITE BLOCKS | %" PRIu32 "\n"
|
||||
" WRITE ERRORS | %" PRIu32 "\n"
|
||||
"----------------------+--------------------------------------------------------\n",
|
||||
media_block_size,
|
||||
media_block_count,
|
||||
block_size,
|
||||
stats->read_hits,
|
||||
stats->read_misses,
|
||||
stats->read_ahead_transfers,
|
||||
stats->read_ahead_peeks,
|
||||
stats->read_blocks,
|
||||
stats->read_errors,
|
||||
stats->write_transfers,
|
||||
stats->write_blocks,
|
||||
stats->write_errors
|
||||
);
|
||||
}
|
||||
|
||||
+115
-115
@@ -31,139 +31,144 @@
|
||||
* Generic block device read primitive. Implemented using block device
|
||||
* buffer management primitives.
|
||||
*/
|
||||
rtems_device_driver
|
||||
rtems_blkdev_generic_read(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void * arg)
|
||||
rtems_device_driver rtems_blkdev_generic_read(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_status_code rc = RTEMS_SUCCESSFUL;
|
||||
rtems_libio_rw_args_t *args = arg;
|
||||
rtems_libio_t *iop = args->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
uint32_t block_size = dd->block_size;
|
||||
char *buf = args->buffer;
|
||||
uint32_t count = args->count;
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
|
||||
uint32_t blkofs = (uint32_t) (args->offset % block_size);
|
||||
rtems_status_code rc = RTEMS_SUCCESSFUL;
|
||||
rtems_libio_rw_args_t *args = arg;
|
||||
rtems_libio_t *iop = args->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
uint32_t block_size = dd->block_size;
|
||||
char *buf = args->buffer;
|
||||
uint32_t count = args->count;
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( args->offset / block_size );
|
||||
uint32_t blkofs = (uint32_t) ( args->offset % block_size );
|
||||
|
||||
args->bytes_moved = 0;
|
||||
args->bytes_moved = 0;
|
||||
|
||||
while (count > 0)
|
||||
{
|
||||
rtems_bdbuf_buffer *diskbuf;
|
||||
uint32_t copy;
|
||||
while ( count > 0 ) {
|
||||
rtems_bdbuf_buffer *diskbuf;
|
||||
uint32_t copy;
|
||||
|
||||
rc = rtems_bdbuf_read(dd, block, &diskbuf);
|
||||
if (rc != RTEMS_SUCCESSFUL)
|
||||
break;
|
||||
copy = block_size - blkofs;
|
||||
if (copy > count)
|
||||
copy = count;
|
||||
memcpy(buf, (char *)diskbuf->buffer + blkofs, copy);
|
||||
rc = rtems_bdbuf_release(diskbuf);
|
||||
args->bytes_moved += copy;
|
||||
if (rc != RTEMS_SUCCESSFUL)
|
||||
break;
|
||||
count -= copy;
|
||||
buf += copy;
|
||||
blkofs = 0;
|
||||
block++;
|
||||
rc = rtems_bdbuf_read( dd, block, &diskbuf );
|
||||
if ( rc != RTEMS_SUCCESSFUL ) {
|
||||
break;
|
||||
}
|
||||
copy = block_size - blkofs;
|
||||
if ( copy > count ) {
|
||||
copy = count;
|
||||
}
|
||||
memcpy( buf, (char *) diskbuf->buffer + blkofs, copy );
|
||||
rc = rtems_bdbuf_release( diskbuf );
|
||||
args->bytes_moved += copy;
|
||||
if ( rc != RTEMS_SUCCESSFUL ) {
|
||||
break;
|
||||
}
|
||||
count -= copy;
|
||||
buf += copy;
|
||||
blkofs = 0;
|
||||
block++;
|
||||
}
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* rtems_blkdev_generic_write --
|
||||
* Generic block device write primitive. Implemented using block device
|
||||
* buffer management primitives.
|
||||
*/
|
||||
rtems_device_driver
|
||||
rtems_blkdev_generic_write(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void * arg)
|
||||
rtems_device_driver rtems_blkdev_generic_write(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_status_code rc = RTEMS_SUCCESSFUL;
|
||||
rtems_libio_rw_args_t *args = arg;
|
||||
rtems_libio_t *iop = args->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
uint32_t block_size = dd->block_size;
|
||||
char *buf = args->buffer;
|
||||
uint32_t count = args->count;
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
|
||||
uint32_t blkofs = (uint32_t) (args->offset % block_size);
|
||||
rtems_status_code rc = RTEMS_SUCCESSFUL;
|
||||
rtems_libio_rw_args_t *args = arg;
|
||||
rtems_libio_t *iop = args->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
uint32_t block_size = dd->block_size;
|
||||
char *buf = args->buffer;
|
||||
uint32_t count = args->count;
|
||||
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( args->offset / block_size );
|
||||
uint32_t blkofs = (uint32_t) ( args->offset % block_size );
|
||||
|
||||
args->bytes_moved = 0;
|
||||
args->bytes_moved = 0;
|
||||
|
||||
while (count > 0)
|
||||
{
|
||||
rtems_bdbuf_buffer *diskbuf;
|
||||
uint32_t copy;
|
||||
while ( count > 0 ) {
|
||||
rtems_bdbuf_buffer *diskbuf;
|
||||
uint32_t copy;
|
||||
|
||||
if ((blkofs == 0) && (count >= block_size))
|
||||
rc = rtems_bdbuf_get(dd, block, &diskbuf);
|
||||
else
|
||||
rc = rtems_bdbuf_read(dd, block, &diskbuf);
|
||||
if (rc != RTEMS_SUCCESSFUL)
|
||||
break;
|
||||
|
||||
copy = block_size - blkofs;
|
||||
if (copy > count)
|
||||
copy = count;
|
||||
memcpy((char *)diskbuf->buffer + blkofs, buf, copy);
|
||||
args->bytes_moved += copy;
|
||||
|
||||
rc = rtems_bdbuf_release_modified(diskbuf);
|
||||
if (rc != RTEMS_SUCCESSFUL)
|
||||
break;
|
||||
|
||||
count -= copy;
|
||||
buf += copy;
|
||||
blkofs = 0;
|
||||
block++;
|
||||
if ( ( blkofs == 0 ) && ( count >= block_size ) ) {
|
||||
rc = rtems_bdbuf_get( dd, block, &diskbuf );
|
||||
} else {
|
||||
rc = rtems_bdbuf_read( dd, block, &diskbuf );
|
||||
}
|
||||
if ( rc != RTEMS_SUCCESSFUL ) {
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
copy = block_size - blkofs;
|
||||
if ( copy > count ) {
|
||||
copy = count;
|
||||
}
|
||||
memcpy( (char *) diskbuf->buffer + blkofs, buf, copy );
|
||||
args->bytes_moved += copy;
|
||||
|
||||
rc = rtems_bdbuf_release_modified( diskbuf );
|
||||
if ( rc != RTEMS_SUCCESSFUL ) {
|
||||
break;
|
||||
}
|
||||
|
||||
count -= copy;
|
||||
buf += copy;
|
||||
blkofs = 0;
|
||||
block++;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* blkdev_generic_open --
|
||||
* Generic block device open primitive.
|
||||
*/
|
||||
rtems_device_driver
|
||||
rtems_blkdev_generic_open(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg)
|
||||
rtems_device_driver rtems_blkdev_generic_open(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_libio_open_close_args_t *oc = arg;
|
||||
rtems_libio_t *iop = oc->iop;
|
||||
dev_t dev = rtems_filesystem_make_dev_t(major, minor);
|
||||
rtems_disk_device *dd = rtems_disk_obtain(dev);
|
||||
rtems_libio_t *iop = oc->iop;
|
||||
dev_t dev = rtems_filesystem_make_dev_t( major, minor );
|
||||
rtems_disk_device *dd = rtems_disk_obtain( dev );
|
||||
|
||||
iop->data1 = dd;
|
||||
|
||||
if (dd != NULL)
|
||||
if ( dd != NULL ) {
|
||||
return RTEMS_SUCCESSFUL;
|
||||
else
|
||||
} else {
|
||||
return RTEMS_UNSATISFIED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* blkdev_generic_close --
|
||||
* Generic block device close primitive.
|
||||
*/
|
||||
rtems_device_driver
|
||||
rtems_blkdev_generic_close(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void * arg)
|
||||
rtems_device_driver rtems_blkdev_generic_close(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_libio_open_close_args_t *oc = arg;
|
||||
rtems_libio_t *iop = oc->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
rtems_libio_t *iop = oc->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
|
||||
rtems_disk_release(dd);
|
||||
rtems_disk_release( dd );
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
@@ -171,30 +176,25 @@ rtems_blkdev_generic_close(
|
||||
/* blkdev_generic_ioctl --
|
||||
* Generic block device ioctl primitive.
|
||||
*/
|
||||
rtems_device_driver
|
||||
rtems_blkdev_generic_ioctl(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void * arg)
|
||||
rtems_device_driver rtems_blkdev_generic_ioctl(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_libio_ioctl_args_t *args = arg;
|
||||
rtems_libio_t *iop = args->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
rtems_libio_ioctl_args_t *args = arg;
|
||||
rtems_libio_t *iop = args->iop;
|
||||
rtems_disk_device *dd = iop->data1;
|
||||
|
||||
if (args->command != RTEMS_BLKIO_REQUEST)
|
||||
{
|
||||
args->ioctl_return = dd->ioctl(dd,
|
||||
args->command,
|
||||
args->buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
if ( args->command != RTEMS_BLKIO_REQUEST ) {
|
||||
args->ioctl_return = dd->ioctl( dd, args->command, args->buffer );
|
||||
} else {
|
||||
/*
|
||||
* It is not allowed to directly access the driver circumventing the
|
||||
* cache.
|
||||
*/
|
||||
args->ioctl_return = -1;
|
||||
}
|
||||
args->ioctl_return = -1;
|
||||
}
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
@@ -43,16 +43,16 @@
|
||||
#include <string.h>
|
||||
|
||||
rtems_status_code rtems_disk_init_phys(
|
||||
rtems_disk_device *dd,
|
||||
uint32_t block_size,
|
||||
rtems_blkdev_bnum block_count,
|
||||
rtems_disk_device *dd,
|
||||
uint32_t block_size,
|
||||
rtems_blkdev_bnum block_count,
|
||||
rtems_block_device_ioctl handler,
|
||||
void *driver_data
|
||||
void *driver_data
|
||||
)
|
||||
{
|
||||
rtems_status_code sc;
|
||||
|
||||
dd = memset(dd, 0, sizeof(*dd));
|
||||
dd = memset( dd, 0, sizeof( *dd ) );
|
||||
|
||||
dd->phys_dev = dd;
|
||||
dd->size = block_count;
|
||||
@@ -61,12 +61,14 @@ rtems_status_code rtems_disk_init_phys(
|
||||
dd->driver_data = driver_data;
|
||||
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
|
||||
|
||||
if (block_count > 0) {
|
||||
if ((*handler)(dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities) != 0) {
|
||||
if ( block_count > 0 ) {
|
||||
if (
|
||||
( *handler )( dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities ) != 0
|
||||
) {
|
||||
dd->capabilities = 0;
|
||||
}
|
||||
|
||||
sc = rtems_bdbuf_set_block_size(dd, block_size, false);
|
||||
sc = rtems_bdbuf_set_block_size( dd, block_size, false );
|
||||
} else {
|
||||
sc = RTEMS_INVALID_NUMBER;
|
||||
}
|
||||
@@ -77,13 +79,13 @@ rtems_status_code rtems_disk_init_phys(
|
||||
rtems_status_code rtems_disk_init_log(
|
||||
rtems_disk_device *dd,
|
||||
rtems_disk_device *phys_dd,
|
||||
rtems_blkdev_bnum block_begin,
|
||||
rtems_blkdev_bnum block_count
|
||||
rtems_blkdev_bnum block_begin,
|
||||
rtems_blkdev_bnum block_count
|
||||
)
|
||||
{
|
||||
rtems_status_code sc;
|
||||
|
||||
dd = memset(dd, 0, sizeof(*dd));
|
||||
dd = memset( dd, 0, sizeof( *dd ) );
|
||||
|
||||
dd->phys_dev = phys_dd;
|
||||
dd->start = block_begin;
|
||||
@@ -93,15 +95,14 @@ rtems_status_code rtems_disk_init_log(
|
||||
dd->driver_data = phys_dd->driver_data;
|
||||
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
|
||||
|
||||
if (phys_dd->phys_dev == phys_dd) {
|
||||
if ( phys_dd->phys_dev == phys_dd ) {
|
||||
rtems_blkdev_bnum phys_block_count = phys_dd->size;
|
||||
|
||||
if (
|
||||
block_begin < phys_block_count
|
||||
&& block_count > 0
|
||||
&& block_count <= phys_block_count - block_begin
|
||||
block_begin < phys_block_count && block_count > 0 &&
|
||||
block_count <= phys_block_count - block_begin
|
||||
) {
|
||||
sc = rtems_bdbuf_set_block_size(dd, phys_dd->media_block_size, false);
|
||||
sc = rtems_bdbuf_set_block_size( dd, phys_dd->media_block_size, false );
|
||||
} else {
|
||||
sc = RTEMS_INVALID_NUMBER;
|
||||
}
|
||||
|
||||
+162
-186
File diff suppressed because it is too large
Load Diff
+1373
-1071
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -35,7 +35,7 @@
|
||||
|
||||
#include <rtems/media.h>
|
||||
|
||||
static const char *const rtems_media_event_desc_table [] = {
|
||||
static const char *const rtems_media_event_desc_table[] = {
|
||||
[RTEMS_MEDIA_EVENT_DISK_ATTACH] = "DISK ATTACH",
|
||||
[RTEMS_MEDIA_EVENT_DISK_DETACH] = "DISK DETACH",
|
||||
[RTEMS_MEDIA_EVENT_MOUNT] = "MOUNT",
|
||||
@@ -45,7 +45,7 @@ static const char *const rtems_media_event_desc_table [] = {
|
||||
[RTEMS_MEDIA_EVENT_PARTITION_DETACH] = "PARTITION DETACH"
|
||||
};
|
||||
|
||||
static const char *const rtems_media_state_desc_table [] = {
|
||||
static const char *const rtems_media_state_desc_table[] = {
|
||||
[RTEMS_MEDIA_STATE_INQUIRY] = "INQUIRY",
|
||||
[RTEMS_MEDIA_STATE_ABORTED] = "ABORTED",
|
||||
[RTEMS_MEDIA_STATE_READY] = "SUCCESS",
|
||||
@@ -53,32 +53,36 @@ static const char *const rtems_media_state_desc_table [] = {
|
||||
[RTEMS_MEDIA_STATE_SUCCESS] = "SUCCESS",
|
||||
[RTEMS_MEDIA_ERROR_DISK_UNKNOWN] = "ERROR DISK UNKNOWN",
|
||||
[RTEMS_MEDIA_ERROR_DISK_EXISTS] = "ERROR DISK EXISTS",
|
||||
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_UNKNOWN] = "ERROR DISK OR PARTITION UNKNOWN",
|
||||
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_EXISTS] = "ERROR DISK OR PARTITION EXISTS",
|
||||
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_UNKNOWN] =
|
||||
"ERROR DISK OR PARTITION UNKNOWN",
|
||||
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_EXISTS] =
|
||||
"ERROR DISK OR PARTITION EXISTS",
|
||||
[RTEMS_MEDIA_ERROR_PARTITION_UNKNOWN] = "ERROR PARTITION UNKNOWN",
|
||||
[RTEMS_MEDIA_ERROR_PARTITION_ORPHAN] = "ERROR PARTITION ORPHAN",
|
||||
[RTEMS_MEDIA_ERROR_PARTITION_DETACH_WITH_MOUNT] = "ERROR PARTITION DETACH WITH MOUNT",
|
||||
[RTEMS_MEDIA_ERROR_PARTITION_WITH_UNKNOWN_DISK] = "ERROR PARTITION WITH UNKNOWN DISK",
|
||||
[RTEMS_MEDIA_ERROR_PARTITION_DETACH_WITH_MOUNT] =
|
||||
"ERROR PARTITION DETACH WITH MOUNT",
|
||||
[RTEMS_MEDIA_ERROR_PARTITION_WITH_UNKNOWN_DISK] =
|
||||
"ERROR PARTITION WITH UNKNOWN DISK",
|
||||
[RTEMS_MEDIA_ERROR_MOUNT_POINT_UNKNOWN] = "ERROR MOUNT POINT UNKNOWN",
|
||||
[RTEMS_MEDIA_ERROR_MOUNT_POINT_EXISTS] = "ERROR MOUNT POINT EXISTS",
|
||||
[RTEMS_MEDIA_ERROR_MOUNT_POINT_ORPHAN] = "ERROR MOUNT POINT ORPHAN"
|
||||
};
|
||||
|
||||
#define TC(table) (sizeof(table) / sizeof(table [0]))
|
||||
#define TC( table ) ( sizeof( table ) / sizeof( table[ 0 ] ) )
|
||||
|
||||
const char *rtems_media_event_description(rtems_media_event event)
|
||||
const char *rtems_media_event_description( rtems_media_event event )
|
||||
{
|
||||
if ((size_t) event < TC(rtems_media_event_desc_table)) {
|
||||
return rtems_media_event_desc_table [event];
|
||||
} else {
|
||||
return "INVALID";
|
||||
}
|
||||
}
|
||||
|
||||
const char *rtems_media_state_description(rtems_media_state state)
|
||||
{
|
||||
if ((size_t) state < TC(rtems_media_state_desc_table)) {
|
||||
return rtems_media_state_desc_table [state];
|
||||
if ( (size_t) event < TC( rtems_media_event_desc_table ) ) {
|
||||
return rtems_media_event_desc_table[ event ];
|
||||
} else {
|
||||
return "INVALID";
|
||||
}
|
||||
}
|
||||
|
||||
const char *rtems_media_state_description( rtems_media_state state )
|
||||
{
|
||||
if ( (size_t) state < TC( rtems_media_state_desc_table ) ) {
|
||||
return rtems_media_state_desc_table[ state ];
|
||||
} else {
|
||||
return "INVALID";
|
||||
}
|
||||
|
||||
@@ -43,14 +43,14 @@
|
||||
|
||||
rtems_status_code rtems_media_get_device_identifier(
|
||||
const char *device_path,
|
||||
dev_t *device_identifier
|
||||
dev_t *device_identifier
|
||||
)
|
||||
{
|
||||
int rv = 0;
|
||||
int rv = 0;
|
||||
struct stat st;
|
||||
|
||||
rv = stat(device_path, &st);
|
||||
if (rv != 0) {
|
||||
rv = stat( device_path, &st );
|
||||
if ( rv != 0 ) {
|
||||
return RTEMS_INVALID_ID;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,57 +42,57 @@
|
||||
#include <rtems/media.h>
|
||||
|
||||
char *rtems_media_create_path(
|
||||
const char *prefix,
|
||||
const char *name,
|
||||
const char *prefix,
|
||||
const char *name,
|
||||
rtems_device_major_number major
|
||||
)
|
||||
{
|
||||
size_t const size = strlen(prefix) + 1 + strlen(name) + 1 + 10 + 1;
|
||||
char *const s = malloc(size);
|
||||
size_t const size = strlen( prefix ) + 1 + strlen( name ) + 1 + 10 + 1;
|
||||
char *const s = malloc( size );
|
||||
|
||||
if (s != NULL) {
|
||||
if ( s != NULL ) {
|
||||
#ifndef NDEBUG
|
||||
int rv =
|
||||
int rv =
|
||||
#endif
|
||||
snprintf(s, size, "%s/%s-%" PRIu32, prefix, name, major);
|
||||
assert(rv < (int) size);
|
||||
snprintf( s, size, "%s/%s-%" PRIu32, prefix, name, major );
|
||||
assert( rv < (int) size );
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
char *rtems_media_replace_prefix(const char *new_prefix, const char *path)
|
||||
char *rtems_media_replace_prefix( const char *new_prefix, const char *path )
|
||||
{
|
||||
const char *const name_try = strrchr(path, '/');
|
||||
const char *const name = (name_try == NULL) ? path : name_try + 1;
|
||||
size_t const new_prefix_len = strlen(new_prefix);
|
||||
size_t const name_size = strlen(name) + 1;
|
||||
size_t const size = new_prefix_len + 1 + name_size;
|
||||
char *const s = malloc(size);
|
||||
const char *const name_try = strrchr( path, '/' );
|
||||
const char *const name = ( name_try == NULL ) ? path : name_try + 1;
|
||||
size_t const new_prefix_len = strlen( new_prefix );
|
||||
size_t const name_size = strlen( name ) + 1;
|
||||
size_t const size = new_prefix_len + 1 + name_size;
|
||||
char *const s = malloc( size );
|
||||
|
||||
if (s != NULL) {
|
||||
memcpy(s, new_prefix, new_prefix_len);
|
||||
s [new_prefix_len] = '/';
|
||||
memcpy(s + new_prefix_len + 1, name, name_size);
|
||||
if ( s != NULL ) {
|
||||
memcpy( s, new_prefix, new_prefix_len );
|
||||
s[ new_prefix_len ] = '/';
|
||||
memcpy( s + new_prefix_len + 1, name, name_size );
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
char *rtems_media_append_minor(
|
||||
const char *path,
|
||||
const char *path,
|
||||
rtems_device_minor_number minor
|
||||
)
|
||||
{
|
||||
size_t const size = strlen(path) + 1 + 10 + 1;
|
||||
char *const s = malloc(size);
|
||||
size_t const size = strlen( path ) + 1 + 10 + 1;
|
||||
char *const s = malloc( size );
|
||||
|
||||
if (s != NULL) {
|
||||
if ( s != NULL ) {
|
||||
#ifndef NDEBUG
|
||||
int rv =
|
||||
int rv =
|
||||
#endif
|
||||
snprintf(s, size, "%s-%" PRIu32, path, minor);
|
||||
assert(rv < (int) size);
|
||||
snprintf( s, size, "%s-%" PRIu32, path, minor );
|
||||
assert( rv < (int) size );
|
||||
}
|
||||
|
||||
return s;
|
||||
|
||||
@@ -44,22 +44,22 @@
|
||||
#define EVENT RTEMS_EVENT_13
|
||||
|
||||
typedef struct {
|
||||
rtems_chain_node node;
|
||||
rtems_media_event event;
|
||||
const char *src;
|
||||
rtems_chain_node node;
|
||||
rtems_media_event event;
|
||||
const char *src;
|
||||
rtems_media_worker worker;
|
||||
void *worker_arg;
|
||||
void *worker_arg;
|
||||
} message;
|
||||
|
||||
static RTEMS_CHAIN_DEFINE_EMPTY(message_chain);
|
||||
static RTEMS_CHAIN_DEFINE_EMPTY( message_chain );
|
||||
|
||||
static rtems_id server_id = RTEMS_ID_NONE;
|
||||
|
||||
static void media_server(rtems_task_argument arg RTEMS_UNUSED)
|
||||
static void media_server( rtems_task_argument arg RTEMS_UNUSED )
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
|
||||
while (true) {
|
||||
while ( true ) {
|
||||
message *msg = NULL;
|
||||
|
||||
sc = rtems_chain_get_with_wait(
|
||||
@@ -68,8 +68,8 @@ static void media_server(rtems_task_argument arg RTEMS_UNUSED)
|
||||
RTEMS_NO_TIMEOUT,
|
||||
(rtems_chain_node **) &msg
|
||||
);
|
||||
assert(sc == RTEMS_SUCCESSFUL);
|
||||
assert(msg != NULL);
|
||||
assert( sc == RTEMS_SUCCESSFUL );
|
||||
assert( msg != NULL );
|
||||
|
||||
rtems_media_post_event(
|
||||
msg->event,
|
||||
@@ -79,75 +79,75 @@ static void media_server(rtems_task_argument arg RTEMS_UNUSED)
|
||||
msg->worker_arg
|
||||
);
|
||||
|
||||
free(msg);
|
||||
free( msg );
|
||||
}
|
||||
}
|
||||
|
||||
rtems_status_code rtems_media_server_initialize(
|
||||
rtems_task_priority priority,
|
||||
size_t stack_size,
|
||||
rtems_mode modes,
|
||||
rtems_attribute attributes
|
||||
size_t stack_size,
|
||||
rtems_mode modes,
|
||||
rtems_attribute attributes
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
|
||||
if (server_id == RTEMS_ID_NONE) {
|
||||
if ( server_id == RTEMS_ID_NONE ) {
|
||||
sc = rtems_media_initialize();
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
sc = rtems_task_create(
|
||||
rtems_build_name('M', 'D', 'I', 'A'),
|
||||
rtems_build_name( 'M', 'D', 'I', 'A' ),
|
||||
priority,
|
||||
stack_size,
|
||||
modes,
|
||||
attributes,
|
||||
&server_id
|
||||
);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
sc = rtems_task_start(server_id, media_server, 0);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
sc = rtems_task_start( server_id, media_server, 0 );
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
|
||||
error:
|
||||
|
||||
if (server_id != RTEMS_ID_NONE) {
|
||||
rtems_task_delete(server_id);
|
||||
if ( server_id != RTEMS_ID_NONE ) {
|
||||
rtems_task_delete( server_id );
|
||||
}
|
||||
|
||||
return RTEMS_NO_MEMORY;
|
||||
}
|
||||
|
||||
rtems_status_code rtems_media_server_post_event(
|
||||
rtems_media_event event,
|
||||
const char *src,
|
||||
rtems_media_event event,
|
||||
const char *src,
|
||||
rtems_media_worker worker,
|
||||
void *worker_arg
|
||||
void *worker_arg
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
size_t src_size = strlen(src) + 1;
|
||||
message *msg = malloc(sizeof(*msg) + src_size);
|
||||
size_t src_size = strlen( src ) + 1;
|
||||
message *msg = malloc( sizeof( *msg ) + src_size );
|
||||
|
||||
if (msg != NULL) {
|
||||
char *s = (char *) msg + sizeof(*msg);
|
||||
if ( msg != NULL ) {
|
||||
char *s = (char *) msg + sizeof( *msg );
|
||||
|
||||
memcpy(s, src, src_size);
|
||||
memcpy( s, src, src_size );
|
||||
|
||||
msg->event = event;
|
||||
msg->src = s;
|
||||
msg->worker = worker;
|
||||
msg->worker_arg = worker_arg;
|
||||
rtems_chain_initialize_node(&msg->node);
|
||||
rtems_chain_initialize_node( &msg->node );
|
||||
|
||||
sc = rtems_chain_append_with_notification(
|
||||
&message_chain,
|
||||
@@ -155,7 +155,7 @@ rtems_status_code rtems_media_server_post_event(
|
||||
server_id,
|
||||
EVENT
|
||||
);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
sc = RTEMS_NOT_CONFIGURED;
|
||||
}
|
||||
} else {
|
||||
|
||||
+290
-288
File diff suppressed because it is too large
Load Diff
@@ -46,48 +46,49 @@
|
||||
#include <rtems/nvdisk-sram.h>
|
||||
|
||||
#ifndef NVDISK_SRAM_ERROR_TRACE
|
||||
#define NVDISK_SRAM_ERROR_TRACE (0)
|
||||
#define NVDISK_SRAM_ERROR_TRACE ( 0 )
|
||||
#endif
|
||||
|
||||
static int
|
||||
rtems_nvdisk_sram_read (uint32_t device RTEMS_UNUSED,
|
||||
uint32_t flags RTEMS_UNUSED,
|
||||
void* base,
|
||||
uint32_t offset,
|
||||
void* buffer,
|
||||
size_t size)
|
||||
static int rtems_nvdisk_sram_read(
|
||||
uint32_t device RTEMS_UNUSED,
|
||||
uint32_t flags RTEMS_UNUSED,
|
||||
void *base,
|
||||
uint32_t offset,
|
||||
void *buffer,
|
||||
size_t size
|
||||
)
|
||||
{
|
||||
memcpy (buffer, (base + offset), size);
|
||||
memcpy( buffer, ( base + offset ), size );
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
rtems_nvdisk_sram_write (uint32_t device RTEMS_UNUSED,
|
||||
uint32_t flags RTEMS_UNUSED,
|
||||
void* base,
|
||||
uint32_t offset,
|
||||
const void* buffer,
|
||||
size_t size)
|
||||
static int rtems_nvdisk_sram_write(
|
||||
uint32_t device RTEMS_UNUSED,
|
||||
uint32_t flags RTEMS_UNUSED,
|
||||
void *base,
|
||||
uint32_t offset,
|
||||
const void *buffer,
|
||||
size_t size
|
||||
)
|
||||
{
|
||||
memcpy ((base + offset), buffer, size);
|
||||
memcpy( ( base + offset ), buffer, size );
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
rtems_nvdisk_sram_verify (uint32_t device RTEMS_UNUSED,
|
||||
uint32_t flags RTEMS_UNUSED,
|
||||
void* base,
|
||||
uint32_t offset,
|
||||
const void* buffer,
|
||||
size_t size)
|
||||
static int rtems_nvdisk_sram_verify(
|
||||
uint32_t device RTEMS_UNUSED,
|
||||
uint32_t flags RTEMS_UNUSED,
|
||||
void *base,
|
||||
uint32_t offset,
|
||||
const void *buffer,
|
||||
size_t size
|
||||
)
|
||||
{
|
||||
return memcmp ((base + offset), buffer, size) == 0 ? 0 : EIO;
|
||||
return memcmp( ( base + offset ), buffer, size ) == 0 ? 0 : EIO;
|
||||
}
|
||||
|
||||
|
||||
const rtems_nvdisk_driver_handlers rtems_nvdisk_sram_handlers =
|
||||
{
|
||||
.read = rtems_nvdisk_sram_read,
|
||||
.write = rtems_nvdisk_sram_write,
|
||||
const rtems_nvdisk_driver_handlers rtems_nvdisk_sram_handlers = {
|
||||
.read = rtems_nvdisk_sram_read,
|
||||
.write = rtems_nvdisk_sram_write,
|
||||
.verify = rtems_nvdisk_sram_verify
|
||||
};
|
||||
|
||||
+375
-283
File diff suppressed because it is too large
Load Diff
@@ -21,18 +21,18 @@
|
||||
#include <rtems/libio.h>
|
||||
#include <rtems/ramdisk.h>
|
||||
|
||||
rtems_device_driver
|
||||
ramdisk_initialize(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void *arg RTEMS_UNUSED)
|
||||
rtems_device_driver ramdisk_initialize(
|
||||
rtems_device_major_number major RTEMS_UNUSED,
|
||||
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||
void *arg RTEMS_UNUSED
|
||||
)
|
||||
{
|
||||
rtems_device_minor_number i;
|
||||
rtems_ramdisk_config *c = rtems_ramdisk_configuration;
|
||||
struct ramdisk *r;
|
||||
rtems_status_code rc;
|
||||
rtems_device_minor_number i;
|
||||
rtems_ramdisk_config *c = rtems_ramdisk_configuration;
|
||||
struct ramdisk *r;
|
||||
rtems_status_code rc;
|
||||
|
||||
/*
|
||||
/*
|
||||
* Coverity Id 27 notes that this calloc() is a resource leak.
|
||||
*
|
||||
* This is allocating memory for a RAM disk which will persist for
|
||||
@@ -40,44 +40,41 @@ ramdisk_initialize(
|
||||
* so there is no corresponding free(r). Coverity is correct that
|
||||
* it is never freed but this is not a problem.
|
||||
*/
|
||||
r = calloc(rtems_ramdisk_configuration_size, sizeof(struct ramdisk));
|
||||
r->trace = false;
|
||||
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
|
||||
{
|
||||
char name [] = RAMDISK_DEVICE_BASE_NAME "a";
|
||||
name [sizeof(RAMDISK_DEVICE_BASE_NAME) - 1] += i;
|
||||
r->block_size = c->block_size;
|
||||
r->block_num = c->block_num;
|
||||
if (c->location == NULL)
|
||||
{
|
||||
r->malloced = true;
|
||||
r->area = malloc(r->block_size * r->block_num);
|
||||
if (r->area == NULL) /* No enough memory for this disk */
|
||||
{
|
||||
r->initialized = false;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
r->initialized = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
r->malloced = false;
|
||||
r->initialized = true;
|
||||
r->area = c->location;
|
||||
}
|
||||
rc = rtems_blkdev_create(name, c->block_size, c->block_num,
|
||||
ramdisk_ioctl, r);
|
||||
if (rc != RTEMS_SUCCESSFUL)
|
||||
{
|
||||
if (r->malloced)
|
||||
{
|
||||
free(r->area);
|
||||
}
|
||||
r->initialized = false;
|
||||
}
|
||||
r = calloc( rtems_ramdisk_configuration_size, sizeof( struct ramdisk ) );
|
||||
r->trace = false;
|
||||
for ( i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++ ) {
|
||||
char name[] = RAMDISK_DEVICE_BASE_NAME "a";
|
||||
name[ sizeof( RAMDISK_DEVICE_BASE_NAME ) - 1 ] += i;
|
||||
r->block_size = c->block_size;
|
||||
r->block_num = c->block_num;
|
||||
if ( c->location == NULL ) {
|
||||
r->malloced = true;
|
||||
r->area = malloc( r->block_size * r->block_num );
|
||||
if ( r->area == NULL ) /* No enough memory for this disk */
|
||||
{
|
||||
r->initialized = false;
|
||||
continue;
|
||||
} else {
|
||||
r->initialized = true;
|
||||
}
|
||||
} else {
|
||||
r->malloced = false;
|
||||
r->initialized = true;
|
||||
r->area = c->location;
|
||||
}
|
||||
return RTEMS_SUCCESSFUL;
|
||||
rc = rtems_blkdev_create(
|
||||
name,
|
||||
c->block_size,
|
||||
c->block_num,
|
||||
ramdisk_ioctl,
|
||||
r
|
||||
);
|
||||
if ( rc != RTEMS_SUCCESSFUL ) {
|
||||
if ( r->malloced ) {
|
||||
free( r->area );
|
||||
}
|
||||
r->initialized = false;
|
||||
}
|
||||
}
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#endif
|
||||
|
||||
/* FIXME: How to set this define? */
|
||||
#if !defined(RTEMS_RAMDISK_TRACE)
|
||||
#if !defined( RTEMS_RAMDISK_TRACE )
|
||||
#define RTEMS_RAMDISK_TRACE 0
|
||||
#endif
|
||||
|
||||
@@ -32,106 +32,116 @@
|
||||
#include <rtems/ramdisk.h>
|
||||
|
||||
#if RTEMS_RAMDISK_TRACE
|
||||
static void
|
||||
rtems_ramdisk_printf (const ramdisk *rd, const char *format, ...)
|
||||
{
|
||||
if (rd->trace)
|
||||
{
|
||||
va_list args;
|
||||
va_start (args, format);
|
||||
printf ("ramdisk:");
|
||||
vprintf (format, args);
|
||||
printf ("\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req)
|
||||
static void rtems_ramdisk_printf( const ramdisk *rd, const char *format, ... )
|
||||
{
|
||||
uint8_t *from = rd->area;
|
||||
uint32_t i;
|
||||
rtems_blkdev_sg_buffer *sg;
|
||||
|
||||
#if RTEMS_RAMDISK_TRACE
|
||||
rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d",
|
||||
req->bufs[0].block, req->bufnum);
|
||||
if ( rd->trace ) {
|
||||
va_list args;
|
||||
va_start( args, format );
|
||||
printf( "ramdisk:" );
|
||||
vprintf( format, args );
|
||||
printf( "\n" );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
|
||||
{
|
||||
static int ramdisk_read( struct ramdisk *rd, rtems_blkdev_request *req )
|
||||
{
|
||||
uint8_t *from = rd->area;
|
||||
uint32_t i;
|
||||
rtems_blkdev_sg_buffer *sg;
|
||||
|
||||
#if RTEMS_RAMDISK_TRACE
|
||||
rtems_ramdisk_printf (rd, "ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
|
||||
i, sg->block, sg->length, sg->block * rd->block_size,
|
||||
from + (sg->block * rd->block_size));
|
||||
rtems_ramdisk_printf(
|
||||
rd,
|
||||
"ramdisk read: start=%d, blocks=%d",
|
||||
req->bufs[ 0 ].block,
|
||||
req->bufnum
|
||||
);
|
||||
#endif
|
||||
memcpy(sg->buffer, from + (sg->block * rd->block_size), sg->length);
|
||||
}
|
||||
rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
|
||||
return 0;
|
||||
|
||||
for ( i = 0, sg = req->bufs; i < req->bufnum; i++, sg++ ) {
|
||||
#if RTEMS_RAMDISK_TRACE
|
||||
rtems_ramdisk_printf(
|
||||
rd,
|
||||
"ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
|
||||
i,
|
||||
sg->block,
|
||||
sg->length,
|
||||
sg->block * rd->block_size,
|
||||
from + ( sg->block * rd->block_size )
|
||||
);
|
||||
#endif
|
||||
memcpy( sg->buffer, from + ( sg->block * rd->block_size ), sg->length );
|
||||
}
|
||||
rtems_blkdev_request_done( req, RTEMS_SUCCESSFUL );
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req)
|
||||
static int ramdisk_write( struct ramdisk *rd, rtems_blkdev_request *req )
|
||||
{
|
||||
uint8_t *to = rd->area;
|
||||
uint32_t i;
|
||||
rtems_blkdev_sg_buffer *sg;
|
||||
uint8_t *to = rd->area;
|
||||
uint32_t i;
|
||||
rtems_blkdev_sg_buffer *sg;
|
||||
|
||||
#if RTEMS_RAMDISK_TRACE
|
||||
rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d",
|
||||
req->bufs[0].block, req->bufnum);
|
||||
rtems_ramdisk_printf(
|
||||
rd,
|
||||
"ramdisk write: start=%d, blocks=%d",
|
||||
req->bufs[ 0 ].block,
|
||||
req->bufnum
|
||||
);
|
||||
#endif
|
||||
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
|
||||
{
|
||||
for ( i = 0, sg = req->bufs; i < req->bufnum; i++, sg++ ) {
|
||||
#if RTEMS_RAMDISK_TRACE
|
||||
rtems_ramdisk_printf (rd, "ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
|
||||
i, sg->block, sg->length, sg->block * rd->block_size,
|
||||
to + (sg->block * rd->block_size));
|
||||
rtems_ramdisk_printf(
|
||||
rd,
|
||||
"ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
|
||||
i,
|
||||
sg->block,
|
||||
sg->length,
|
||||
sg->block * rd->block_size,
|
||||
to + ( sg->block * rd->block_size )
|
||||
);
|
||||
#endif
|
||||
memcpy(to + (sg->block * rd->block_size), sg->buffer, sg->length);
|
||||
}
|
||||
rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
|
||||
return 0;
|
||||
memcpy( to + ( sg->block * rd->block_size ), sg->buffer, sg->length );
|
||||
}
|
||||
rtems_blkdev_request_done( req, RTEMS_SUCCESSFUL );
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
|
||||
int ramdisk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
|
||||
{
|
||||
struct ramdisk *rd = rtems_disk_get_driver_data(dd);
|
||||
struct ramdisk *rd = rtems_disk_get_driver_data( dd );
|
||||
|
||||
switch (req)
|
||||
{
|
||||
case RTEMS_BLKIO_REQUEST:
|
||||
{
|
||||
rtems_blkdev_request *r = argp;
|
||||
switch ( req ) {
|
||||
case RTEMS_BLKIO_REQUEST: {
|
||||
rtems_blkdev_request *r = argp;
|
||||
|
||||
switch (r->req)
|
||||
{
|
||||
case RTEMS_BLKDEV_REQ_READ:
|
||||
return ramdisk_read(rd, r);
|
||||
switch ( r->req ) {
|
||||
case RTEMS_BLKDEV_REQ_READ:
|
||||
return ramdisk_read( rd, r );
|
||||
|
||||
case RTEMS_BLKDEV_REQ_WRITE:
|
||||
return ramdisk_write(rd, r);
|
||||
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case RTEMS_BLKIO_DELETED:
|
||||
if (rd->free_at_delete_request) {
|
||||
ramdisk_free(rd);
|
||||
}
|
||||
break;
|
||||
case RTEMS_BLKDEV_REQ_WRITE:
|
||||
return ramdisk_write( rd, r );
|
||||
|
||||
default:
|
||||
return rtems_blkdev_ioctl (dd, req, argp);
|
||||
break;
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
case RTEMS_BLKIO_DELETED:
|
||||
if ( rd->free_at_delete_request ) {
|
||||
ramdisk_free( rd );
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return rtems_blkdev_ioctl( dd, req, argp );
|
||||
break;
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -43,22 +43,22 @@
|
||||
#include <rtems/ramdisk.h>
|
||||
|
||||
ramdisk *ramdisk_allocate(
|
||||
void *area_begin,
|
||||
uint32_t media_block_size,
|
||||
void *area_begin,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
bool trace
|
||||
bool trace
|
||||
)
|
||||
{
|
||||
struct ramdisk *rd = calloc(1, sizeof(*rd));
|
||||
struct ramdisk *rd = calloc( 1, sizeof( *rd ) );
|
||||
|
||||
if (rd == NULL) {
|
||||
if ( rd == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (area_begin == NULL) {
|
||||
area_begin = calloc(media_block_count, media_block_size);
|
||||
if (area_begin == NULL) {
|
||||
free(rd);
|
||||
if ( area_begin == NULL ) {
|
||||
area_begin = calloc( media_block_count, media_block_size );
|
||||
if ( area_begin == NULL ) {
|
||||
free( rd );
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -75,12 +75,12 @@ ramdisk *ramdisk_allocate(
|
||||
return rd;
|
||||
}
|
||||
|
||||
void ramdisk_free(ramdisk *rd)
|
||||
void ramdisk_free( ramdisk *rd )
|
||||
{
|
||||
if (rd != NULL) {
|
||||
if (rd->malloced) {
|
||||
free(rd->area);
|
||||
if ( rd != NULL ) {
|
||||
if ( rd->malloced ) {
|
||||
free( rd->area );
|
||||
}
|
||||
free(rd);
|
||||
free( rd );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,17 +40,17 @@
|
||||
#include <rtems/ramdisk.h>
|
||||
|
||||
rtems_status_code ramdisk_register(
|
||||
uint32_t media_block_size,
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
bool trace,
|
||||
const char *disk
|
||||
bool trace,
|
||||
const char *disk
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
ramdisk *rd = NULL;
|
||||
ramdisk *rd = NULL;
|
||||
|
||||
rd = ramdisk_allocate(NULL, media_block_size, media_block_count, trace);
|
||||
if (rd == NULL) {
|
||||
rd = ramdisk_allocate( NULL, media_block_size, media_block_count, trace );
|
||||
if ( rd == NULL ) {
|
||||
return RTEMS_UNSATISFIED;
|
||||
}
|
||||
|
||||
@@ -61,8 +61,8 @@ rtems_status_code ramdisk_register(
|
||||
ramdisk_ioctl,
|
||||
rd
|
||||
);
|
||||
if (sc != RTEMS_SUCCESSFUL) {
|
||||
ramdisk_free(rd);
|
||||
if ( sc != RTEMS_SUCCESSFUL ) {
|
||||
ramdisk_free( rd );
|
||||
|
||||
return RTEMS_UNSATISFIED;
|
||||
}
|
||||
|
||||
+421
-412
File diff suppressed because it is too large
Load Diff
@@ -48,16 +48,16 @@
|
||||
*/
|
||||
static rtems_sparse_disk *sparse_disk_allocate(
|
||||
const uint32_t media_block_size,
|
||||
const rtems_blkdev_bnum blocks_with_buffer )
|
||||
const rtems_blkdev_bnum blocks_with_buffer
|
||||
)
|
||||
{
|
||||
size_t const key_table_size = blocks_with_buffer
|
||||
* sizeof( rtems_sparse_disk_key );
|
||||
size_t const data_size = blocks_with_buffer * media_block_size;
|
||||
size_t const alloc_size = sizeof( rtems_sparse_disk )
|
||||
+ key_table_size + data_size;
|
||||
size_t const key_table_size = blocks_with_buffer *
|
||||
sizeof( rtems_sparse_disk_key );
|
||||
size_t const data_size = blocks_with_buffer * media_block_size;
|
||||
size_t const alloc_size = sizeof( rtems_sparse_disk ) + key_table_size +
|
||||
data_size;
|
||||
|
||||
rtems_sparse_disk *const sd = (rtems_sparse_disk *) malloc(
|
||||
alloc_size );
|
||||
rtems_sparse_disk *const sd = (rtems_sparse_disk *) malloc( alloc_size );
|
||||
|
||||
return sd;
|
||||
}
|
||||
@@ -65,42 +65,47 @@ static rtems_sparse_disk *sparse_disk_allocate(
|
||||
/*
|
||||
* Initialize sparse disk data
|
||||
*/
|
||||
static rtems_status_code sparse_disk_initialize( rtems_sparse_disk *sd,
|
||||
const uint32_t media_block_size,
|
||||
const rtems_blkdev_bnum blocks_with_buffer,
|
||||
const rtems_sparse_disk_delete_handler sparse_disk_delete,
|
||||
const uint8_t fill_pattern )
|
||||
static rtems_status_code sparse_disk_initialize(
|
||||
rtems_sparse_disk *sd,
|
||||
const uint32_t media_block_size,
|
||||
const rtems_blkdev_bnum blocks_with_buffer,
|
||||
const rtems_sparse_disk_delete_handler sparse_disk_delete,
|
||||
const uint8_t fill_pattern
|
||||
)
|
||||
{
|
||||
rtems_blkdev_bnum i;
|
||||
|
||||
if ( NULL == sd )
|
||||
if ( NULL == sd ) {
|
||||
return RTEMS_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
uint8_t *data = (uint8_t *) sd;
|
||||
size_t const key_table_size = blocks_with_buffer
|
||||
* sizeof( rtems_sparse_disk_key );
|
||||
size_t const data_size = blocks_with_buffer * media_block_size;
|
||||
uint8_t *data = (uint8_t *) sd;
|
||||
size_t const key_table_size = blocks_with_buffer *
|
||||
sizeof( rtems_sparse_disk_key );
|
||||
size_t const data_size = blocks_with_buffer * media_block_size;
|
||||
|
||||
memset( data, 0, sizeof( rtems_sparse_disk ) + key_table_size );
|
||||
|
||||
sd->fill_pattern = fill_pattern;
|
||||
memset( (uint8_t *) ( data + sizeof( rtems_sparse_disk ) + key_table_size ),
|
||||
sd->fill_pattern,
|
||||
data_size );
|
||||
memset(
|
||||
(uint8_t *) ( data + sizeof( rtems_sparse_disk ) + key_table_size ),
|
||||
sd->fill_pattern,
|
||||
data_size
|
||||
);
|
||||
|
||||
sd->delete_handler = sparse_disk_delete;
|
||||
|
||||
rtems_mutex_init( &sd->mutex, "Sparse Disk" );
|
||||
|
||||
data += sizeof( rtems_sparse_disk );
|
||||
data += sizeof( rtems_sparse_disk );
|
||||
|
||||
sd->blocks_with_buffer = blocks_with_buffer;
|
||||
sd->key_table = (rtems_sparse_disk_key *) data;
|
||||
sd->key_table = (rtems_sparse_disk_key *) data;
|
||||
|
||||
data += key_table_size;
|
||||
data += key_table_size;
|
||||
|
||||
for ( i = 0; i < blocks_with_buffer; ++i, data += media_block_size ) {
|
||||
sd->key_table[i].data = data;
|
||||
sd->key_table[ i ].data = data;
|
||||
}
|
||||
|
||||
sd->media_block_size = media_block_size;
|
||||
@@ -167,20 +172,23 @@ static int sparse_disk_read_block(
|
||||
const rtems_sparse_disk *sparse_disk,
|
||||
const rtems_blkdev_bnum block,
|
||||
uint8_t *buffer,
|
||||
const size_t buffer_size )
|
||||
const size_t buffer_size
|
||||
)
|
||||
{
|
||||
size_t bytes_to_copy = sparse_disk->media_block_size;
|
||||
rtems_sparse_disk_key *key;
|
||||
|
||||
if ( buffer_size < bytes_to_copy )
|
||||
if ( buffer_size < bytes_to_copy ) {
|
||||
bytes_to_copy = buffer_size;
|
||||
}
|
||||
|
||||
key = sparse_disk_find_block( sparse_disk, block );
|
||||
|
||||
if ( NULL != key )
|
||||
if ( NULL != key ) {
|
||||
memcpy( buffer, key->data, bytes_to_copy );
|
||||
else
|
||||
} else {
|
||||
memset( buffer, sparse_disk->fill_pattern, buffer_size );
|
||||
}
|
||||
|
||||
return bytes_to_copy;
|
||||
}
|
||||
@@ -189,15 +197,17 @@ static int sparse_disk_write_block(
|
||||
rtems_sparse_disk *sparse_disk,
|
||||
const rtems_blkdev_bnum block,
|
||||
const uint8_t *buffer,
|
||||
const size_t buffer_size )
|
||||
const size_t buffer_size
|
||||
)
|
||||
{
|
||||
size_t bytes_to_copy = sparse_disk->media_block_size;
|
||||
bool block_needs_writing = false;
|
||||
rtems_sparse_disk_key *key;
|
||||
size_t i;
|
||||
|
||||
if ( buffer_size < bytes_to_copy )
|
||||
if ( buffer_size < bytes_to_copy ) {
|
||||
bytes_to_copy = buffer_size;
|
||||
}
|
||||
|
||||
/* we only need to write the block if it is different from the fill pattern.
|
||||
* If the read method does not find a block it will deliver the fill pattern anyway.
|
||||
@@ -207,8 +217,9 @@ static int sparse_disk_write_block(
|
||||
|
||||
if ( NULL == key ) {
|
||||
for ( i = 0; ( !block_needs_writing ) && ( i < bytes_to_copy ); ++i ) {
|
||||
if ( buffer[i] != sparse_disk->fill_pattern )
|
||||
if ( buffer[ i ] != sparse_disk->fill_pattern ) {
|
||||
block_needs_writing = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( block_needs_writing ) {
|
||||
@@ -216,10 +227,11 @@ static int sparse_disk_write_block(
|
||||
}
|
||||
}
|
||||
|
||||
if ( NULL != key )
|
||||
if ( NULL != key ) {
|
||||
memcpy( key->data, buffer, bytes_to_copy );
|
||||
else if ( block_needs_writing )
|
||||
} else if ( block_needs_writing ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return bytes_to_copy;
|
||||
}
|
||||
@@ -230,7 +242,8 @@ static int sparse_disk_write_block(
|
||||
static int sparse_disk_read_write(
|
||||
rtems_sparse_disk *sparse_disk,
|
||||
rtems_blkdev_request *req,
|
||||
const bool read )
|
||||
const bool read
|
||||
)
|
||||
{
|
||||
int rv = 0;
|
||||
uint32_t req_buffer;
|
||||
@@ -242,40 +255,46 @@ static int sparse_disk_read_write(
|
||||
|
||||
rtems_mutex_lock( &sparse_disk->mutex );
|
||||
|
||||
for ( req_buffer = 0;
|
||||
( 0 <= rv ) && ( req_buffer < req->bufnum );
|
||||
++req_buffer ) {
|
||||
scatter_gather = &req->bufs[req_buffer];
|
||||
for (
|
||||
req_buffer = 0; ( 0 <= rv ) && ( req_buffer < req->bufnum ); ++req_buffer
|
||||
) {
|
||||
scatter_gather = &req->bufs[ req_buffer ];
|
||||
|
||||
bytes_handled = 0;
|
||||
buff = (uint8_t *) scatter_gather->buffer;
|
||||
block = scatter_gather->block;
|
||||
buff_size = scatter_gather->length;
|
||||
bytes_handled = 0;
|
||||
buff = (uint8_t *) scatter_gather->buffer;
|
||||
block = scatter_gather->block;
|
||||
buff_size = scatter_gather->length;
|
||||
|
||||
while ( ( 0 <= rv ) && ( 0 < buff_size ) ) {
|
||||
if ( read )
|
||||
rv = sparse_disk_read_block( sparse_disk,
|
||||
block,
|
||||
&buff[bytes_handled],
|
||||
buff_size );
|
||||
else
|
||||
rv = sparse_disk_write_block( sparse_disk,
|
||||
block,
|
||||
&buff[bytes_handled],
|
||||
buff_size );
|
||||
if ( read ) {
|
||||
rv = sparse_disk_read_block(
|
||||
sparse_disk,
|
||||
block,
|
||||
&buff[ bytes_handled ],
|
||||
buff_size
|
||||
);
|
||||
} else {
|
||||
rv = sparse_disk_write_block(
|
||||
sparse_disk,
|
||||
block,
|
||||
&buff[ bytes_handled ],
|
||||
buff_size
|
||||
);
|
||||
}
|
||||
|
||||
++block;
|
||||
bytes_handled += rv;
|
||||
buff_size -= rv;
|
||||
buff_size -= rv;
|
||||
}
|
||||
}
|
||||
|
||||
rtems_mutex_unlock( &sparse_disk->mutex );
|
||||
|
||||
if ( 0 > rv )
|
||||
if ( 0 > rv ) {
|
||||
rtems_blkdev_request_done( req, RTEMS_IO_ERROR );
|
||||
else
|
||||
} else {
|
||||
rtems_blkdev_request_done( req, RTEMS_SUCCESSFUL );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -293,15 +312,20 @@ static int sparse_disk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
|
||||
switch ( r->req ) {
|
||||
case RTEMS_BLKDEV_REQ_READ:
|
||||
case RTEMS_BLKDEV_REQ_WRITE:
|
||||
return sparse_disk_read_write( sd, r, r->req == RTEMS_BLKDEV_REQ_READ );
|
||||
return sparse_disk_read_write(
|
||||
sd,
|
||||
r,
|
||||
r->req == RTEMS_BLKDEV_REQ_READ
|
||||
);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if ( RTEMS_BLKIO_DELETED == req ) {
|
||||
rtems_mutex_destroy( &sd->mutex );
|
||||
|
||||
if ( NULL != sd->delete_handler )
|
||||
if ( NULL != sd->delete_handler ) {
|
||||
( *sd->delete_handler )( sd );
|
||||
}
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
@@ -322,9 +346,10 @@ rtems_status_code rtems_sparse_disk_create_and_register(
|
||||
uint32_t media_block_size,
|
||||
rtems_blkdev_bnum blocks_with_buffer,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
uint8_t fill_pattern )
|
||||
uint8_t fill_pattern
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_sparse_disk *sparse_disk = sparse_disk_allocate(
|
||||
media_block_size,
|
||||
blocks_with_buffer
|
||||
@@ -354,7 +379,8 @@ rtems_status_code rtems_sparse_disk_register(
|
||||
rtems_blkdev_bnum blocks_with_buffer,
|
||||
rtems_blkdev_bnum media_block_count,
|
||||
uint8_t fill_pattern,
|
||||
rtems_sparse_disk_delete_handler sparse_disk_delete )
|
||||
rtems_sparse_disk_delete_handler sparse_disk_delete
|
||||
)
|
||||
{
|
||||
rtems_status_code sc;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user