The start member of http_request_range has been widened to 64 bit. block_read/block_write len parameter has been widened. (also the block_read/block_write TYPES, which is why we also touched unrelated files like scsi.c or ata.c)
The len parameter of the blktrans_xferbuf_realloc has been widened (which records the length of the image) plus all intermediate functions that lead to the call. Tested with an 32GB Windows 7 64-bit image: it boots until it fails to find the root device (which is expected) Signed-off-by: Johannes Thoma <johan...@johannesthoma.com> --- src/core/blockdev.c | 4 ++-- src/core/blocktrans.c | 13 +++++++------ src/core/sanboot.c | 4 ++-- src/core/xfer.c | 4 ++-- src/core/xferbuf.c | 29 +++++++++++++++-------------- src/drivers/block/ata.c | 8 ++++---- src/drivers/block/scsi.c | 6 +++--- src/include/ipxe/blockdev.h | 8 ++++---- src/include/ipxe/blocktrans.h | 2 +- src/include/ipxe/http.h | 4 ++-- src/include/ipxe/xfer.h | 4 ++-- src/include/ipxe/xferbuf.h | 14 +++++++------- src/interface/efi/efi_pxe.c | 4 ++-- src/net/tcp/httpblock.c | 4 ++-- src/net/tcp/httpcore.c | 8 ++++---- 15 files changed, 59 insertions(+), 57 deletions(-) diff --git a/src/core/blockdev.c b/src/core/blockdev.c index c219d967..2ea8f4f8 100644 --- a/src/core/blockdev.c +++ b/src/core/blockdev.c @@ -46,7 +46,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); */ int block_read ( struct interface *control, struct interface *data, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { struct interface *dest; block_read_TYPE ( void * ) *op = intf_get_dest_op ( control, block_read, &dest ); @@ -77,7 +77,7 @@ int block_read ( struct interface *control, struct interface *data, */ int block_write ( struct interface *control, struct interface *data, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { struct interface *dest; block_write_TYPE ( void * ) *op = intf_get_dest_op ( control, block_write, &dest ); diff --git a/src/core/blocktrans.c b/src/core/blocktrans.c index 3f32f9cf..79b31f03 100644 --- a/src/core/blocktrans.c +++ b/src/core/blocktrans.c @@ -46,7 +46,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); * @ret rc Return status code */ static int blktrans_xferbuf_realloc ( struct xfer_buffer *xferbuf, - size_t len ) { + uint64_t len ) { struct block_translator *blktrans = container_of ( xferbuf, struct block_translator, xferbuf ); @@ -72,7 +72,7 @@ static int blktrans_xferbuf_realloc ( struct xfer_buffer *xferbuf, * @v data Data to copy * @v len Length of data */ -static void blktrans_xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset, +static void blktrans_xferbuf_write ( struct xfer_buffer *xferbuf, uint64_t offset, const void *data, size_t len ) { struct block_translator *blktrans = container_of ( xferbuf, struct block_translator, xferbuf ); @@ -98,8 +98,8 @@ static void blktrans_xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset, * @v data Data to read * @v len Length of data */ -static void blktrans_xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset, - void *data, size_t len ) { +static void blktrans_xferbuf_read ( struct xfer_buffer *xferbuf, + uint64_t offset, void *data, size_t len ) { struct block_translator *blktrans = container_of ( xferbuf, struct block_translator, xferbuf ); @@ -138,6 +138,7 @@ static void blktrans_close ( struct block_translator *blktrans, int rc ) { /* Construct block device capacity */ capacity.blocks = ( blktrans->xferbuf.len / blktrans->blksize ); + capacity.blksize = blktrans->blksize; capacity.max_count = -1U; @@ -220,7 +221,7 @@ static struct interface_descriptor blktrans_xfer_desc = * @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, userptr_t buffer, uint64_t size ) { struct block_translator *blktrans; int rc; @@ -249,7 +250,7 @@ int block_translate ( struct interface *block, userptr_t buffer, size_t size ) { DBGC2 ( blktrans, "BLKTRANS %p created", blktrans ); if ( buffer ) { - DBGC2 ( blktrans, " for %#lx+%#zx", + DBGC2 ( blktrans, " for %#lx+%#llx", user_to_phys ( buffer, 0 ), size ); } DBGC2 ( blktrans, "\n" ); diff --git a/src/core/sanboot.c b/src/core/sanboot.c index cabc4843..713daf05 100644 --- a/src/core/sanboot.c +++ b/src/core/sanboot.c @@ -418,7 +418,7 @@ 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 ); + userptr_t buffer, uint64_t len ); /** Data buffer */ userptr_t buffer; /** Starting LBA */ @@ -589,7 +589,7 @@ static int sandev_rw ( struct san_device *sandev, uint64_t lba, int ( * block_rw ) ( struct interface *control, struct interface *data, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) ) { + userptr_t buffer, uint64_t len ) ) { union san_command_params params; unsigned int remaining; size_t frag_len; diff --git a/src/core/xfer.c b/src/core/xfer.c index 0faf3292..765b5ed0 100644 --- a/src/core/xfer.c +++ b/src/core/xfer.c @@ -347,14 +347,14 @@ int xfer_printf ( struct interface *intf, const char *format, ... ) { * @v offset Offset to new position * @ret rc Return status code */ -int xfer_seek ( struct interface *intf, off_t offset ) { +int xfer_seek ( struct interface *intf, int64_t offset ) { struct io_buffer *iobuf; struct xfer_metadata meta = { .flags = XFER_FL_ABS_OFFSET, .offset = offset, }; - DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " seek to %ld\n", + DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " seek to %lld\n", INTF_DBG ( intf ), offset ); /* Allocate and send a zero-length data buffer */ diff --git a/src/core/xferbuf.c b/src/core/xferbuf.c index 24011855..cdd0f909 100644 --- a/src/core/xferbuf.c +++ b/src/core/xferbuf.c @@ -69,7 +69,7 @@ void xferbuf_free ( struct xfer_buffer *xferbuf ) { * @v len Required minimum size * @ret rc Return status code */ -static int xferbuf_ensure_size ( struct xfer_buffer *xferbuf, size_t len ) { +static int xferbuf_ensure_size ( struct xfer_buffer *xferbuf, uint64_t len ) { int rc; /* If buffer is already large enough, do nothing */ @@ -79,7 +79,7 @@ static int xferbuf_ensure_size ( struct xfer_buffer *xferbuf, size_t len ) { /* Extend buffer */ if ( ( rc = xferbuf->op->realloc ( xferbuf, len ) ) != 0 ) { DBGC ( xferbuf, "XFERBUF %p could not extend buffer to " - "%zd bytes: %s\n", xferbuf, len, strerror ( rc ) ); + "%lld bytes: %s\n", xferbuf, len, strerror ( rc ) ); return rc; } xferbuf->len = len; @@ -95,9 +95,9 @@ static int xferbuf_ensure_size ( struct xfer_buffer *xferbuf, size_t len ) { * @v data Data to write * @v len Length of data */ -int xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset, +int xferbuf_write ( struct xfer_buffer *xferbuf, uint64_t offset, const void *data, size_t len ) { - size_t max_len; + uint64_t max_len; int rc; /* Check for overflow */ @@ -125,7 +125,7 @@ int xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset, * @v data Data to write * @v len Length of data */ -int xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset, +int xferbuf_read ( struct xfer_buffer *xferbuf, uint64_t offset, void *data, size_t len ) { /* Check that read is within buffer range */ @@ -152,7 +152,7 @@ int xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset, int xferbuf_deliver ( struct xfer_buffer *xferbuf, struct io_buffer *iobuf, struct xfer_metadata *meta ) { size_t len = iob_len ( iobuf ); - size_t pos; + uint64_t pos; int rc; /* Start profiling */ @@ -184,7 +184,7 @@ int xferbuf_deliver ( struct xfer_buffer *xferbuf, struct io_buffer *iobuf, * @v len New length (or zero to free buffer) * @ret rc Return status code */ -static int xferbuf_malloc_realloc ( struct xfer_buffer *xferbuf, size_t len ) { +static int xferbuf_malloc_realloc ( struct xfer_buffer *xferbuf, uint64_t len ) { void *new_data; new_data = realloc ( xferbuf->data, len ); @@ -202,7 +202,7 @@ static int xferbuf_malloc_realloc ( struct xfer_buffer *xferbuf, size_t len ) { * @v data Data to copy * @v len Length of data */ -static void xferbuf_malloc_write ( struct xfer_buffer *xferbuf, size_t offset, +static void xferbuf_malloc_write ( struct xfer_buffer *xferbuf, uint64_t offset, const void *data, size_t len ) { memcpy ( ( xferbuf->data + offset ), data, len ); @@ -216,7 +216,7 @@ static void xferbuf_malloc_write ( struct xfer_buffer *xferbuf, size_t offset, * @v data Data to read * @v len Length of data */ -static void xferbuf_malloc_read ( struct xfer_buffer *xferbuf, size_t offset, +static void xferbuf_malloc_read ( struct xfer_buffer *xferbuf, uint64_t offset, void *data, size_t len ) { memcpy ( data, ( xferbuf->data + offset ), len ); @@ -236,7 +236,7 @@ struct xfer_buffer_operations xferbuf_malloc_operations = { * @v len New length (or zero to free buffer) * @ret rc Return status code */ -static int xferbuf_umalloc_realloc ( struct xfer_buffer *xferbuf, size_t len ) { +static int xferbuf_umalloc_realloc ( struct xfer_buffer *xferbuf, uint64_t len ) { userptr_t *udata = xferbuf->data; userptr_t new_udata; @@ -255,8 +255,9 @@ static int xferbuf_umalloc_realloc ( struct xfer_buffer *xferbuf, size_t len ) { * @v data Data to copy * @v len Length of data */ -static void xferbuf_umalloc_write ( struct xfer_buffer *xferbuf, size_t offset, - const void *data, size_t len ) { +static void xferbuf_umalloc_write ( struct xfer_buffer *xferbuf, + uint64_t offset, const void *data, + size_t len ) { userptr_t *udata = xferbuf->data; copy_to_user ( *udata, offset, data, len ); @@ -270,8 +271,8 @@ static void xferbuf_umalloc_write ( struct xfer_buffer *xferbuf, size_t offset, * @v data Data to read * @v len Length of data */ -static void xferbuf_umalloc_read ( struct xfer_buffer *xferbuf, size_t offset, - void *data, size_t len ) { +static void xferbuf_umalloc_read ( struct xfer_buffer *xferbuf, + uint64_t offset, void *data, size_t len ) { userptr_t *udata = xferbuf->data; copy_from_user ( data, *udata, offset, len ); diff --git a/src/drivers/block/ata.c b/src/drivers/block/ata.c index b1c6855a..039ec092 100644 --- a/src/drivers/block/ata.c +++ b/src/drivers/block/ata.c @@ -455,7 +455,7 @@ static int atadev_command ( struct ata_device *atadev, struct interface *block, struct ata_command_type *type, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { struct ata_command *atacmd; struct ata_cmd command; int tag; @@ -478,7 +478,7 @@ static int atadev_command ( struct ata_device *atadev, /* Sanity check */ if ( len != ( count * ATA_SECTOR_SIZE ) ) { DBGC ( atadev, "ATA %p tag %08x buffer length mismatch (count " - "%d len %zd)\n", atadev, atacmd->tag, count, len ); + "%d len %lld)\n", atadev, atacmd->tag, count, len ); rc = -EINVAL; goto err_len; } @@ -543,7 +543,7 @@ static int atadev_command ( struct ata_device *atadev, static int atadev_read ( struct ata_device *atadev, struct interface *block, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { return atadev_command ( atadev, block, &atacmd_read, lba, count, buffer, len ); } @@ -562,7 +562,7 @@ static int atadev_read ( struct ata_device *atadev, static int atadev_write ( struct ata_device *atadev, struct interface *block, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { return atadev_command ( atadev, block, &atacmd_write, lba, count, buffer, len ); } diff --git a/src/drivers/block/scsi.c b/src/drivers/block/scsi.c index f765c976..78a73cd1 100644 --- a/src/drivers/block/scsi.c +++ b/src/drivers/block/scsi.c @@ -717,7 +717,7 @@ static int scsidev_command ( struct scsi_device *scsidev, struct interface *block, struct scsi_command_type *type, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { struct scsi_command *scsicmd; int rc; @@ -769,7 +769,7 @@ static int scsidev_command ( struct scsi_device *scsidev, static int scsidev_read ( struct scsi_device *scsidev, struct interface *block, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { return scsidev_command ( scsidev, block, &scsicmd_read, lba, count, buffer, len ); } @@ -788,7 +788,7 @@ static int scsidev_read ( struct scsi_device *scsidev, static int scsidev_write ( struct scsi_device *scsidev, struct interface *block, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ) { + userptr_t buffer, uint64_t len ) { return scsidev_command ( scsidev, block, &scsicmd_write, lba, count, buffer, len ); } diff --git a/src/include/ipxe/blockdev.h b/src/include/ipxe/blockdev.h index 418c4300..b5ef137b 100644 --- a/src/include/ipxe/blockdev.h +++ b/src/include/ipxe/blockdev.h @@ -26,19 +26,19 @@ struct block_device_capacity { extern int block_read ( struct interface *control, struct interface *data, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ); + userptr_t buffer, uint64_t len ); #define block_read_TYPE( object_type ) \ typeof ( int ( object_type, struct interface *data, \ uint64_t lba, unsigned int count, \ - userptr_t buffer, size_t len ) ) + userptr_t buffer, uint64_t len ) ) extern int block_write ( struct interface *control, struct interface *data, uint64_t lba, unsigned int count, - userptr_t buffer, size_t len ); + userptr_t buffer, uint64_t len ); #define block_write_TYPE( object_type ) \ typeof ( int ( object_type, struct interface *data, \ uint64_t lba, unsigned int count, \ - userptr_t buffer, size_t len ) ) + userptr_t buffer, uint64_t len ) ) extern int block_read_capacity ( struct interface *control, struct interface *data ); diff --git a/src/include/ipxe/blocktrans.h b/src/include/ipxe/blocktrans.h index fee71b96..0c5682e9 100644 --- a/src/include/ipxe/blocktrans.h +++ b/src/include/ipxe/blocktrans.h @@ -33,6 +33,6 @@ struct block_translator { }; extern int block_translate ( struct interface *block, - userptr_t buffer, size_t size ); + userptr_t buffer, uint64_t size ); #endif /* _IPXE_BLOCKTRANS_H */ diff --git a/src/include/ipxe/http.h b/src/include/ipxe/http.h index 0893c953..6d479a6b 100644 --- a/src/include/ipxe/http.h +++ b/src/include/ipxe/http.h @@ -136,7 +136,7 @@ extern struct http_method http_post; /** HTTP request range descriptor */ struct http_request_range { /** Range start */ - size_t start; + uint64_t start; /** Range length, or zero for no range request */ size_t len; }; @@ -262,7 +262,7 @@ struct http_response_transfer { /** HTTP response content descriptor */ struct http_response_content { /** Content length (may be zero) */ - size_t len; + uint64_t len; /** Content encoding */ struct http_content_encoding *encoding; }; diff --git a/src/include/ipxe/xfer.h b/src/include/ipxe/xfer.h index 3a35fa92..c8a64471 100644 --- a/src/include/ipxe/xfer.h +++ b/src/include/ipxe/xfer.h @@ -34,7 +34,7 @@ struct xfer_metadata { * relative offset of zero, i.e. no offset from the current * position.) */ - off_t offset; + int64_t offset; /** Source socket address, or NULL */ struct sockaddr *src; /** Destination socket address, or NULL */ @@ -102,7 +102,7 @@ extern int xfer_vprintf ( struct interface *intf, const char *format, va_list args ); extern int __attribute__ (( format ( printf, 2, 3 ) )) xfer_printf ( struct interface *intf, const char *format, ... ); -extern int xfer_seek ( struct interface *intf, off_t offset ); +extern int xfer_seek ( struct interface *intf, int64_t offset ); extern int xfer_check_order ( struct xfer_metadata *meta, size_t *pos, size_t len ); diff --git a/src/include/ipxe/xferbuf.h b/src/include/ipxe/xferbuf.h index cb0b1a0e..e5bf0133 100644 --- a/src/include/ipxe/xferbuf.h +++ b/src/include/ipxe/xferbuf.h @@ -20,9 +20,9 @@ struct xfer_buffer { /** Data */ void *data; /** Size of data */ - size_t len; + uint64_t len; /** Current offset within data */ - size_t pos; + uint64_t pos; /** Data transfer buffer operations */ struct xfer_buffer_operations *op; }; @@ -35,7 +35,7 @@ struct xfer_buffer_operations { * @v len New length (or zero to free buffer) * @ret rc Return status code */ - int ( * realloc ) ( struct xfer_buffer *xferbuf, size_t len ); + int ( * realloc ) ( struct xfer_buffer *xferbuf, uint64_t len ); /** Write data to buffer * * @v xferbuf Data transfer buffer @@ -47,7 +47,7 @@ struct xfer_buffer_operations { * memcpy()-like operation: the caller is responsible for * ensuring that the write does not exceed the buffer length. */ - void ( * write ) ( struct xfer_buffer *xferbuf, size_t offset, + void ( * write ) ( struct xfer_buffer *xferbuf, uint64_t offset, const void *data, size_t len ); /** Read data from buffer * @@ -60,7 +60,7 @@ struct xfer_buffer_operations { * memcpy()-like operation: the caller is responsible for * ensuring that the read does not exceed the buffer length. */ - void ( * read ) ( struct xfer_buffer *xferbuf, size_t offset, + void ( * read ) ( struct xfer_buffer *xferbuf, uint64_t offset, void *data, size_t len ); }; @@ -90,9 +90,9 @@ xferbuf_umalloc_init ( struct xfer_buffer *xferbuf, userptr_t *data ) { } extern void xferbuf_free ( struct xfer_buffer *xferbuf ); -extern int xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset, +extern int xferbuf_write ( struct xfer_buffer *xferbuf, uint64_t offset, const void *data, size_t len ); -extern int xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset, +extern int xferbuf_read ( struct xfer_buffer *xferbuf, uint64_t offset, void *data, size_t len ); extern int xferbuf_deliver ( struct xfer_buffer *xferbuf, struct io_buffer *iobuf, diff --git a/src/interface/efi/efi_pxe.c b/src/interface/efi/efi_pxe.c index a1f81df5..e7be1558 100644 --- a/src/interface/efi/efi_pxe.c +++ b/src/interface/efi/efi_pxe.c @@ -317,7 +317,7 @@ static int efi_pxe_ip_filter ( struct efi_pxe *pxe, EFI_IP_ADDRESS *ip ) { * @ret rc Return status code */ static int efi_pxe_buf_realloc ( struct xfer_buffer *xferbuf __unused, - size_t len __unused ) { + uint64_t len __unused ) { /* Can never reallocate: return EFI_BUFFER_TOO_SMALL */ return -ERANGE; @@ -331,7 +331,7 @@ static int efi_pxe_buf_realloc ( struct xfer_buffer *xferbuf __unused, * @v data Data to copy * @v len Length of data */ -static void efi_pxe_buf_write ( struct xfer_buffer *xferbuf, size_t offset, +static void efi_pxe_buf_write ( struct xfer_buffer *xferbuf, uint64_t offset, const void *data, size_t len ) { /* Copy data to buffer */ diff --git a/src/net/tcp/httpblock.c b/src/net/tcp/httpblock.c index 1abd6b34..61765b51 100644 --- a/src/net/tcp/httpblock.c +++ b/src/net/tcp/httpblock.c @@ -53,12 +53,12 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); */ int http_block_read ( struct http_transaction *http, struct interface *data, uint64_t lba, unsigned int count, userptr_t buffer, - size_t len ) { + uint64_t len ) { struct http_request_range range; int rc; /* Sanity check */ - assert ( len == ( count * HTTP_BLKSIZE ) ); + assert ( len == ( ((uint64_t) count) * HTTP_BLKSIZE ) ); /* Construct request range descriptor */ range.start = ( lba * HTTP_BLKSIZE ); diff --git a/src/net/tcp/httpcore.c b/src/net/tcp/httpcore.c index f755fb72..51820e42 100644 --- a/src/net/tcp/httpcore.c +++ b/src/net/tcp/httpcore.c @@ -501,7 +501,7 @@ http_content_buffer ( struct http_transaction *http ) { __weak int http_block_read ( struct http_transaction *http __unused, struct interface *data __unused, uint64_t lba __unused, unsigned int count __unused, - userptr_t buffer __unused, size_t len __unused ) { + userptr_t buffer __unused, uint64_t len __unused ) { return -ENOTSUP; } @@ -591,7 +591,7 @@ int http_open ( struct interface *xfer, struct http_method *method, struct uri request_host; size_t request_uri_len; size_t request_host_len; - size_t content_len; + uint64_t content_len; char *request_uri_string; char *request_host_string; void *content_data; @@ -936,7 +936,7 @@ static int http_format_range ( struct http_transaction *http, /* Construct range, if applicable */ if ( http->request.range.len ) { - return snprintf ( buf, len, "bytes=%zd-%zd", + return snprintf ( buf, len, "bytes=%lld-%lld", http->request.range.start, ( http->request.range.start + http->request.range.len - 1 ) ); @@ -1345,7 +1345,7 @@ static int http_parse_content_length ( struct http_transaction *http, char *endp; /* Parse length */ - http->response.content.len = strtoul ( line, &endp, 10 ); + http->response.content.len = strtoull ( line, &endp, 10 ); if ( *endp != '\0' ) { DBGC ( http, "HTTP %p invalid Content-Length \"%s\"\n", http, line ); -- 2.17.0 _______________________________________________ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel