[block] Remove userptr_t from block device abstraction

Simplify the block device code by assuming that all read/write buffers
are directly accessible via pointer dereferences.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-04-24 17:11:30 +01:00
parent 2742ed5d77
commit 2f11f466e6
19 changed files with 86 additions and 93 deletions

View File

@@ -45,8 +45,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
* @ret rc Return status code
*/
int block_read ( struct interface *control, struct interface *data,
uint64_t lba, unsigned int count,
userptr_t buffer, size_t len ) {
uint64_t lba, unsigned int count, void *buffer,
size_t len ) {
struct interface *dest;
block_read_TYPE ( void * ) *op =
intf_get_dest_op ( control, block_read, &dest );
@@ -76,8 +76,8 @@ int block_read ( struct interface *control, struct interface *data,
* @ret rc Return status code
*/
int block_write ( struct interface *control, struct interface *data,
uint64_t lba, unsigned int count,
userptr_t buffer, size_t len ) {
uint64_t lba, unsigned int count, void *buffer,
size_t len ) {
struct interface *dest;
block_write_TYPE ( void * ) *op =
intf_get_dest_op ( control, block_write, &dest );

View File

@@ -81,7 +81,7 @@ static void blktrans_xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset,
if ( blktrans->buffer ) {
/* Write data to buffer */
copy_to_user ( blktrans->buffer, offset, data, len );
memcpy ( ( blktrans->buffer + offset ), data, len );
} else {
@@ -107,7 +107,7 @@ static void blktrans_xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset,
if ( blktrans->buffer ) {
/* Read data from buffer */
copy_from_user ( data, blktrans->buffer, offset, len );
memcpy ( data, ( blktrans->buffer + offset ), len );
} else {
@@ -216,11 +216,11 @@ static struct interface_descriptor blktrans_xfer_desc =
* Insert block device translator
*
* @v block Block device interface
* @v buffer Data buffer (or UNULL)
* @v buffer Data buffer (or NULL)
* @v size Length of data buffer, or block size
* @ret rc Return status code
*/
int block_translate ( struct interface *block, userptr_t buffer, size_t size ) {
int block_translate ( struct interface *block, void *buffer, size_t size ) {
struct block_translator *blktrans;
int rc;

View File

@@ -29,6 +29,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
*
*/
#include <string.h>
#include <errno.h>
#include <ipxe/sanboot.h>

View File

@@ -424,10 +424,10 @@ int sandev_reopen ( struct san_device *sandev ) {
struct san_command_rw_params {
/** SAN device read/write operation */
int ( * block_rw ) ( struct interface *control, struct interface *data,
uint64_t lba, unsigned int count,
userptr_t buffer, size_t len );
uint64_t lba, unsigned int count, void *buffer,
size_t len );
/** Data buffer */
userptr_t buffer;
void *buffer;
/** Starting LBA */
uint64_t lba;
/** Block count */
@@ -594,11 +594,11 @@ int sandev_reset ( struct san_device *sandev ) {
* @ret rc Return status code
*/
static int sandev_rw ( struct san_device *sandev, uint64_t lba,
unsigned int count, userptr_t buffer,
unsigned int count, void *buffer,
int ( * block_rw ) ( struct interface *control,
struct interface *data,
uint64_t lba, unsigned int count,
userptr_t buffer, size_t len ) ) {
void *buffer, size_t len ) ) {
union san_command_params params;
unsigned int remaining;
size_t frag_len;
@@ -643,11 +643,12 @@ static int sandev_rw ( struct san_device *sandev, uint64_t lba,
* @ret rc Return status code
*/
int sandev_read ( struct san_device *sandev, uint64_t lba,
unsigned int count, userptr_t buffer ) {
unsigned int count, void *buffer ) {
int rc;
/* Read from device */
if ( ( rc = sandev_rw ( sandev, lba, count, buffer, block_read ) ) != 0 )
if ( ( rc = sandev_rw ( sandev, lba, count, buffer,
block_read ) ) != 0 )
return rc;
return 0;
@@ -663,11 +664,12 @@ int sandev_read ( struct san_device *sandev, uint64_t lba,
* @ret rc Return status code
*/
int sandev_write ( struct san_device *sandev, uint64_t lba,
unsigned int count, userptr_t buffer ) {
unsigned int count, void *buffer ) {
int rc;
/* Write to device */
if ( ( rc = sandev_rw ( sandev, lba, count, buffer, block_write ) ) != 0 )
if ( ( rc = sandev_rw ( sandev, lba, count, buffer,
block_write ) ) != 0 )
return rc;
/* Quiesce system. This is a heuristic designed to ensure
@@ -799,8 +801,7 @@ static int sandev_parse_iso9660 ( struct san_device *sandev ) {
}
/* Read primary volume descriptor */
if ( ( rc = sandev_read ( sandev, lba, count,
virt_to_user ( scratch ) ) ) != 0 ) {
if ( ( rc = sandev_read ( sandev, lba, count, scratch ) ) != 0 ) {
DBGC ( sandev->drive, "SAN %#02x could not read ISO9660 "
"primary volume descriptor: %s\n",
sandev->drive, strerror ( rc ) );