[uaccess] Remove user_to_phys() and phys_to_user()

Remove the intermediate concept of a user pointer from physical
address conversions, leaving virt_to_phys() and phys_to_virt() as the
directly implemented functions.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-04-21 16:16:01 +01:00
parent 4535548cba
commit 8c31270a21
48 changed files with 211 additions and 235 deletions

View File

@@ -124,7 +124,7 @@ static int cmdline_init ( void ) {
DBGC ( colour, "RUNTIME found no command line\n" ); DBGC ( colour, "RUNTIME found no command line\n" );
return 0; return 0;
} }
cmdline_user = phys_to_user ( cmdline_phys ); cmdline_user = phys_to_virt ( cmdline_phys );
len = ( strlen ( cmdline_user ) + 1 /* NUL */ ); len = ( strlen ( cmdline_user ) + 1 /* NUL */ );
/* Allocate and copy command line */ /* Allocate and copy command line */
@@ -193,7 +193,7 @@ static int initrd_init ( void ) {
initrd_phys, ( initrd_phys + initrd_len ) ); initrd_phys, ( initrd_phys + initrd_len ) );
/* Create initrd image */ /* Create initrd image */
image = image_memory ( "<INITRD>", phys_to_user ( initrd_phys ), image = image_memory ( "<INITRD>", phys_to_virt ( initrd_phys ),
initrd_len ); initrd_len );
if ( ! image ) { if ( ! image ) {
DBGC ( colour, "RUNTIME could not create initrd image\n" ); DBGC ( colour, "RUNTIME could not create initrd image\n" );

View File

@@ -47,7 +47,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
* @ret len Length of setting data, or negative error * @ret len Length of setting data, or negative error
*/ */
static int vram_fetch ( void *data, size_t len ) { static int vram_fetch ( void *data, size_t len ) {
userptr_t vram = phys_to_user ( VRAM_BASE ); userptr_t vram = phys_to_virt ( VRAM_BASE );
/* Copy video RAM */ /* Copy video RAM */
if ( len > VRAM_LEN ) if ( len > VRAM_LEN )

View File

@@ -169,7 +169,7 @@ static int bzimage_parse_header ( struct image *image,
bzimg->rm_memsz += BZI_CMDLINE_SIZE; bzimg->rm_memsz += BZI_CMDLINE_SIZE;
/* Calculate load address of protected-mode portion */ /* Calculate load address of protected-mode portion */
bzimg->pm_kernel = phys_to_user ( is_bzimage ? BZI_LOAD_HIGH_ADDR bzimg->pm_kernel = phys_to_virt ( is_bzimage ? BZI_LOAD_HIGH_ADDR
: BZI_LOAD_LOW_ADDR ); : BZI_LOAD_LOW_ADDR );
/* Extract video mode */ /* Extract video mode */
@@ -185,8 +185,8 @@ static int bzimage_parse_header ( struct image *image,
DBGC ( image, "bzImage %p version %04x RM %#lx+%#zx PM %#lx+%#zx " DBGC ( image, "bzImage %p version %04x RM %#lx+%#zx PM %#lx+%#zx "
"cmdlen %zd\n", image, bzimg->version, "cmdlen %zd\n", image, bzimg->version,
user_to_phys ( bzimg->rm_kernel, 0 ), bzimg->rm_filesz, virt_to_phys ( bzimg->rm_kernel ), bzimg->rm_filesz,
user_to_phys ( bzimg->pm_kernel, 0 ), bzimg->pm_sz, virt_to_phys ( bzimg->pm_kernel ), bzimg->pm_sz,
bzimg->cmdline_size ); bzimg->cmdline_size );
return 0; return 0;
@@ -215,8 +215,8 @@ static void bzimage_update_header ( struct image *image,
/* Set command line */ /* Set command line */
if ( bzimg->version >= 0x0202 ) { if ( bzimg->version >= 0x0202 ) {
bzimg->bzhdr.cmd_line_ptr = user_to_phys ( bzimg->rm_kernel, bzimg->bzhdr.cmd_line_ptr = ( virt_to_phys ( bzimg->rm_kernel )
bzimg->rm_cmdline ); + bzimg->rm_cmdline );
} else { } else {
bzimg->cmdline_magic.magic = BZI_CMDLINE_MAGIC; bzimg->cmdline_magic.magic = BZI_CMDLINE_MAGIC;
bzimg->cmdline_magic.offset = bzimg->rm_cmdline; bzimg->cmdline_magic.offset = bzimg->rm_cmdline;
@@ -383,11 +383,11 @@ static size_t bzimage_load_initrd ( struct image *image,
} }
assert ( offset == len ); assert ( offset == len );
DBGC ( image, "bzImage %p initrd %p [%#08lx,%#08lx,%#08lx)" DBGC ( image, "bzImage %p initrd %p [%#08lx,%#08lx,%#08lx)"
"%s%s\n", image, initrd, user_to_phys ( address, 0 ), "%s%s\n", image, initrd, virt_to_phys ( address ),
user_to_phys ( address, offset ), ( virt_to_phys ( address ) + offset ),
user_to_phys ( address, ( offset + initrd->len ) ), ( virt_to_phys ( address ) + offset + initrd->len ),
( filename ? " " : "" ), ( filename ? filename : "" ) ); ( filename ? " " : "" ), ( filename ? filename : "" ) );
DBGC2_MD5A ( image, user_to_phys ( address, offset ), DBGC2_MD5A ( image, ( virt_to_phys ( address ) + offset ),
( address + offset ), initrd->len ); ( address + offset ), initrd->len );
} }
len += initrd->len; len += initrd->len;
@@ -422,11 +422,11 @@ static int bzimage_check_initrds ( struct image *image,
len = bzimage_align ( len ); len = bzimage_align ( len );
DBGC ( image, "bzImage %p initrd %p from [%#08lx,%#08lx)%s%s\n", DBGC ( image, "bzImage %p initrd %p from [%#08lx,%#08lx)%s%s\n",
image, initrd, user_to_phys ( initrd->data, 0 ), image, initrd, virt_to_phys ( initrd->data ),
user_to_phys ( initrd->data, initrd->len ), ( virt_to_phys ( initrd->data ) + initrd->len ),
( initrd->cmdline ? " " : "" ), ( initrd->cmdline ? " " : "" ),
( initrd->cmdline ? initrd->cmdline : "" ) ); ( initrd->cmdline ? initrd->cmdline : "" ) );
DBGC2_MD5A ( image, user_to_phys ( initrd->data, 0 ), DBGC2_MD5A ( image, virt_to_phys ( initrd->data ),
initrd->data, initrd->len ); initrd->data, initrd->len );
} }
@@ -445,7 +445,7 @@ static int bzimage_check_initrds ( struct image *image,
} }
/* Check that total length fits within kernel's memory limit */ /* Check that total length fits within kernel's memory limit */
if ( user_to_phys ( bottom, len ) > bzimg->mem_limit ) { if ( ( virt_to_phys ( bottom ) + len ) > bzimg->mem_limit ) {
DBGC ( image, "bzImage %p not enough space for initrds\n", DBGC ( image, "bzImage %p not enough space for initrds\n",
image ); image );
return -ENOBUFS; return -ENOBUFS;
@@ -485,12 +485,12 @@ static void bzimage_load_initrds ( struct image *image,
/* Find highest usable address */ /* Find highest usable address */
top = ( highest->data + bzimage_align ( highest->len ) ); top = ( highest->data + bzimage_align ( highest->len ) );
if ( user_to_phys ( top, -1 ) > bzimg->mem_limit ) { if ( ( virt_to_phys ( top ) - 1UL ) > bzimg->mem_limit ) {
top = phys_to_user ( ( bzimg->mem_limit + 1 ) & top = phys_to_virt ( ( bzimg->mem_limit + 1 ) &
~( INITRD_ALIGN - 1 ) ); ~( INITRD_ALIGN - 1 ) );
} }
DBGC ( image, "bzImage %p loading initrds from %#08lx downwards\n", DBGC ( image, "bzImage %p loading initrds from %#08lx downwards\n",
image, user_to_phys ( top, -1 ) ); image, ( virt_to_phys ( top ) - 1UL ) );
/* Load initrds in order */ /* Load initrds in order */
for_each_image ( initrd ) { for_each_image ( initrd ) {
@@ -512,8 +512,8 @@ static void bzimage_load_initrds ( struct image *image,
/* Record initrd location */ /* Record initrd location */
if ( ! bzimg->ramdisk_image ) if ( ! bzimg->ramdisk_image )
bzimg->ramdisk_image = user_to_phys ( dest, 0 ); bzimg->ramdisk_image = virt_to_phys ( dest );
bzimg->ramdisk_size = ( user_to_phys ( dest, len ) - bzimg->ramdisk_size = ( virt_to_phys ( dest ) + len -
bzimg->ramdisk_image ); bzimg->ramdisk_image );
} }
DBGC ( image, "bzImage %p initrds at [%#08lx,%#08lx)\n", DBGC ( image, "bzImage %p initrds at [%#08lx,%#08lx)\n",

View File

@@ -211,7 +211,7 @@ static int com32_load_image ( struct image *image ) {
filesz = image->len; filesz = image->len;
memsz = filesz; memsz = filesz;
buffer = phys_to_user ( COM32_START_PHYS ); buffer = phys_to_virt ( COM32_START_PHYS );
if ( ( rc = prep_segment ( buffer, filesz, memsz ) ) != 0 ) { if ( ( rc = prep_segment ( buffer, filesz, memsz ) ) != 0 ) {
DBGC ( image, "COM32 %p: could not prepare segment: %s\n", DBGC ( image, "COM32 %p: could not prepare segment: %s\n",
image, strerror ( rc ) ); image, strerror ( rc ) );

View File

@@ -76,10 +76,10 @@ static userptr_t initrd_squash_high ( userptr_t top ) {
current -= len; current -= len;
DBGC ( &images, "INITRD squashing %s [%#08lx,%#08lx)->" DBGC ( &images, "INITRD squashing %s [%#08lx,%#08lx)->"
"[%#08lx,%#08lx)\n", highest->name, "[%#08lx,%#08lx)\n", highest->name,
user_to_phys ( highest->data, 0 ), virt_to_phys ( highest->data ),
user_to_phys ( highest->data, highest->len ), ( virt_to_phys ( highest->data ) + highest->len ),
user_to_phys ( current, 0 ), virt_to_phys ( current ),
user_to_phys ( current, highest->len ) ); ( virt_to_phys ( current ) + highest->len ) );
memmove ( current, highest->data, highest->len ); memmove ( current, highest->data, highest->len );
highest->data = current; highest->data = current;
} }
@@ -92,10 +92,10 @@ static userptr_t initrd_squash_high ( userptr_t top ) {
current -= len; current -= len;
DBGC ( &images, "INITRD copying %s [%#08lx,%#08lx)->" DBGC ( &images, "INITRD copying %s [%#08lx,%#08lx)->"
"[%#08lx,%#08lx)\n", initrd->name, "[%#08lx,%#08lx)\n", initrd->name,
user_to_phys ( initrd->data, 0 ), virt_to_phys ( initrd->data ),
user_to_phys ( initrd->data, initrd->len ), ( virt_to_phys ( initrd->data ) + initrd->len ),
user_to_phys ( current, 0 ), virt_to_phys ( current ),
user_to_phys ( current, initrd->len ) ); ( virt_to_phys ( current ) + initrd->len ) );
memcpy ( current, initrd->data, initrd->len ); memcpy ( current, initrd->data, initrd->len );
initrd->data = current; initrd->data = current;
} }
@@ -119,10 +119,10 @@ static void initrd_swap ( struct image *low, struct image *high,
size_t new_len; size_t new_len;
DBGC ( &images, "INITRD swapping %s [%#08lx,%#08lx)<->[%#08lx,%#08lx) " DBGC ( &images, "INITRD swapping %s [%#08lx,%#08lx)<->[%#08lx,%#08lx) "
"%s\n", low->name, user_to_phys ( low->data, 0 ), "%s\n", low->name, virt_to_phys ( low->data ),
user_to_phys ( low->data, low->len ), ( virt_to_phys ( low->data ) + low->len ),
user_to_phys ( high->data, 0 ), virt_to_phys ( high->data ),
user_to_phys ( high->data, high->len ), high->name ); ( virt_to_phys ( high->data ) + high->len ), high->name );
/* Round down length of free space */ /* Round down length of free space */
free_len &= ~( INITRD_ALIGN - 1 ); free_len &= ~( INITRD_ALIGN - 1 );
@@ -208,9 +208,9 @@ static void initrd_dump ( void ) {
/* Dump initrd locations */ /* Dump initrd locations */
for_each_image ( initrd ) { for_each_image ( initrd ) {
DBGC ( &images, "INITRD %s at [%#08lx,%#08lx)\n", DBGC ( &images, "INITRD %s at [%#08lx,%#08lx)\n",
initrd->name, user_to_phys ( initrd->data, 0 ), initrd->name, virt_to_phys ( initrd->data ),
user_to_phys ( initrd->data, initrd->len ) ); ( virt_to_phys ( initrd->data ) + initrd->len ) );
DBGC2_MD5A ( &images, user_to_phys ( initrd->data, 0 ), DBGC2_MD5A ( &images, virt_to_phys ( initrd->data ),
initrd->data, initrd->len ); initrd->data, initrd->len );
} }
} }
@@ -239,7 +239,7 @@ void initrd_reshuffle ( userptr_t bottom ) {
/* Debug */ /* Debug */
DBGC ( &images, "INITRD region [%#08lx,%#08lx)\n", DBGC ( &images, "INITRD region [%#08lx,%#08lx)\n",
user_to_phys ( bottom, 0 ), user_to_phys ( top, 0 ) ); virt_to_phys ( bottom ), virt_to_phys ( top ) );
initrd_dump(); initrd_dump();
/* Squash initrds as high as possible in memory */ /* Squash initrds as high as possible in memory */

View File

@@ -212,7 +212,7 @@ static int multiboot_add_modules ( struct image *image, physaddr_t start,
start = ( ( start + 0xfff ) & ~0xfff ); start = ( ( start + 0xfff ) & ~0xfff );
/* Prepare segment */ /* Prepare segment */
if ( ( rc = prep_segment ( phys_to_user ( start ), if ( ( rc = prep_segment ( phys_to_virt ( start ),
module_image->len, module_image->len,
module_image->len ) ) != 0 ) { module_image->len ) ) != 0 ) {
DBGC ( image, "MULTIBOOT %p could not prepare module " DBGC ( image, "MULTIBOOT %p could not prepare module "
@@ -222,7 +222,7 @@ static int multiboot_add_modules ( struct image *image, physaddr_t start,
} }
/* Copy module */ /* Copy module */
memcpy ( phys_to_user ( start ), module_image->data, memcpy ( phys_to_virt ( start ), module_image->data,
module_image->len ); module_image->len );
/* Add module to list */ /* Add module to list */
@@ -342,7 +342,7 @@ static int multiboot_load_raw ( struct image *image,
( image->len - offset ) ); ( image->len - offset ) );
memsz = ( hdr->mb.bss_end_addr ? memsz = ( hdr->mb.bss_end_addr ?
( hdr->mb.bss_end_addr - hdr->mb.load_addr ) : filesz ); ( hdr->mb.bss_end_addr - hdr->mb.load_addr ) : filesz );
buffer = phys_to_user ( hdr->mb.load_addr ); buffer = phys_to_virt ( hdr->mb.load_addr );
if ( ( rc = prep_segment ( buffer, filesz, memsz ) ) != 0 ) { if ( ( rc = prep_segment ( buffer, filesz, memsz ) ) != 0 ) {
DBGC ( image, "MULTIBOOT %p could not prepare segment: %s\n", DBGC ( image, "MULTIBOOT %p could not prepare segment: %s\n",
image, strerror ( rc ) ); image, strerror ( rc ) );

View File

@@ -181,7 +181,7 @@ static int nbi_process_segments ( struct image *image,
/* Calculate segment load address */ /* Calculate segment load address */
switch ( NBI_LOADADDR_FLAGS ( sh.flags ) ) { switch ( NBI_LOADADDR_FLAGS ( sh.flags ) ) {
case NBI_LOADADDR_ABS: case NBI_LOADADDR_ABS:
dest = phys_to_user ( sh.loadaddr ); dest = phys_to_virt ( sh.loadaddr );
break; break;
case NBI_LOADADDR_AFTER: case NBI_LOADADDR_AFTER:
dest = ( dest + memsz + sh.loadaddr ); dest = ( dest + memsz + sh.loadaddr );
@@ -194,7 +194,7 @@ static int nbi_process_segments ( struct image *image,
* maintains backwards compatibility with * maintains backwards compatibility with
* previous versions of Etherboot. * previous versions of Etherboot.
*/ */
dest = phys_to_user ( ( extmemsize() + 1024 ) * 1024 dest = phys_to_virt ( ( extmemsize() + 1024 ) * 1024
- sh.loadaddr ); - sh.loadaddr );
break; break;
default: default:

View File

@@ -92,16 +92,17 @@ static int sdi_exec ( struct image *image ) {
return -ENOTTY; return -ENOTTY;
} }
DBGC ( image, "SDI %p image at %08lx+%08zx\n", DBGC ( image, "SDI %p image at %08lx+%08zx\n",
image, user_to_phys ( image->data, 0 ), image->len ); image, virt_to_phys ( image->data ), image->len );
DBGC ( image, "SDI %p boot code at %08lx+%llx\n", image, DBGC ( image, "SDI %p boot code at %08llx+%llx\n", image,
user_to_phys ( image->data, sdi.boot_offset ), sdi.boot_size ); ( virt_to_phys ( image->data ) + sdi.boot_offset ),
sdi.boot_size );
/* Copy boot code */ /* Copy boot code */
memcpy ( real_to_user ( SDI_BOOT_SEG, SDI_BOOT_OFF ), memcpy ( real_to_user ( SDI_BOOT_SEG, SDI_BOOT_OFF ),
( image->data + sdi.boot_offset ), sdi.boot_size ); ( image->data + sdi.boot_offset ), sdi.boot_size );
/* Jump to boot code */ /* Jump to boot code */
sdiptr = ( user_to_phys ( image->data, 0 ) | SDI_WTF ); sdiptr = ( virt_to_phys ( image->data ) | SDI_WTF );
__asm__ __volatile__ ( REAL_CODE ( "ljmp %0, %1\n\t" ) __asm__ __volatile__ ( REAL_CODE ( "ljmp %0, %1\n\t" )
: : "i" ( SDI_BOOT_SEG ), : : "i" ( SDI_BOOT_SEG ),
"i" ( SDI_BOOT_OFF ), "i" ( SDI_BOOT_OFF ),

View File

@@ -165,7 +165,7 @@ static int ucode_status ( struct ucode_update *update,
assert ( id <= control->apic_max ); assert ( id <= control->apic_max );
/* Read status report */ /* Read status report */
copy_from_user ( &status, phys_to_user ( control->status ), copy_from_user ( &status, phys_to_virt ( control->status ),
( id * sizeof ( status ) ), sizeof ( status ) ); ( id * sizeof ( status ) ), sizeof ( status ) );
/* Ignore empty optional status reports */ /* Ignore empty optional status reports */
@@ -261,7 +261,7 @@ static int ucode_update_all ( struct image *image,
/* Construct control structure */ /* Construct control structure */
memset ( &control, 0, sizeof ( control ) ); memset ( &control, 0, sizeof ( control ) );
control.desc = virt_to_phys ( update->desc ); control.desc = virt_to_phys ( update->desc );
control.status = user_to_phys ( status, 0 ); control.status = virt_to_phys ( status );
vendor = update->vendor; vendor = update->vendor;
if ( vendor ) { if ( vendor ) {
control.ver_clear = vendor->ver_clear; control.ver_clear = vendor->ver_clear;
@@ -446,8 +446,8 @@ static int ucode_parse_intel ( struct image *image, size_t start,
/* Populate descriptor */ /* Populate descriptor */
desc.signature = hdr.signature; desc.signature = hdr.signature;
desc.version = hdr.version; desc.version = hdr.version;
desc.address = user_to_phys ( image->data, desc.address = ( virt_to_phys ( image->data ) +
( start + sizeof ( hdr ) ) ); start + sizeof ( hdr ) );
/* Add non-extended descriptor, if applicable */ /* Add non-extended descriptor, if applicable */
ucode_describe ( image, start, &ucode_intel, &desc, hdr.platforms, ucode_describe ( image, start, &ucode_intel, &desc, hdr.platforms,
@@ -589,7 +589,8 @@ static int ucode_parse_amd ( struct image *image, size_t start,
copy_from_user ( &patch, image->data, ( start + offset ), copy_from_user ( &patch, image->data, ( start + offset ),
sizeof ( patch ) ); sizeof ( patch ) );
desc.version = patch.version; desc.version = patch.version;
desc.address = user_to_phys ( image->data, ( start + offset ) ); desc.address = ( virt_to_phys ( image->data ) +
start + offset );
offset += phdr.len; offset += phdr.len;
/* Parse equivalence table to find matching signatures */ /* Parse equivalence table to find matching signatures */

View File

@@ -85,33 +85,32 @@ extern const unsigned long virt_offset;
/** /**
* Convert physical address to user pointer * Convert physical address to user pointer
* *
* @v phys_addr Physical address * @v phys Physical address
* @ret userptr User pointer * @ret virt Virtual address
*/ */
static inline __always_inline userptr_t static inline __always_inline void *
UACCESS_INLINE ( librm, phys_to_user ) ( unsigned long phys_addr ) { UACCESS_INLINE ( librm, phys_to_virt ) ( unsigned long phys ) {
/* In a 64-bit build, any valid physical address is directly /* In a 64-bit build, any valid physical address is directly
* usable as a virtual address, since the low 4GB is * usable as a virtual address, since the low 4GB is
* identity-mapped. * identity-mapped.
*/ */
if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) ) if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) )
return ( ( userptr_t ) phys_addr ); return ( ( void * ) phys );
/* In a 32-bit build, subtract virt_offset */ /* In a 32-bit build, subtract virt_offset */
return ( ( userptr_t ) ( phys_addr - virt_offset ) ); return ( ( void * ) ( phys - virt_offset ) );
} }
/** /**
* Convert user buffer to physical address * Convert virtual address to physical address
* *
* @v userptr User pointer * @v virt Virtual address
* @v offset Offset from user pointer * @ret phys Physical address
* @ret phys_addr Physical address
*/ */
static inline __always_inline unsigned long static inline __always_inline physaddr_t
UACCESS_INLINE ( librm, user_to_phys ) ( userptr_t userptr, off_t offset ) { UACCESS_INLINE ( librm, virt_to_phys ) ( volatile const void *virt ) {
unsigned long addr = ( ( unsigned long ) ( userptr + offset ) ); physaddr_t addr = ( ( physaddr_t ) virt );
/* In a 64-bit build, any virtual address in the low 4GB is /* In a 64-bit build, any virtual address in the low 4GB is
* directly usable as a physical address, since the low 4GB is * directly usable as a physical address, since the low 4GB is

View File

@@ -73,7 +73,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
*/ */
static inline __always_inline userptr_t static inline __always_inline userptr_t
real_to_user ( unsigned int segment, unsigned int offset ) { real_to_user ( unsigned int segment, unsigned int offset ) {
return ( phys_to_user ( ( segment << 4 ) + offset ) ); return ( phys_to_virt ( ( segment << 4 ) + offset ) );
} }
/** /**

View File

@@ -60,7 +60,7 @@ static void cachedhcp_init ( void ) {
/* Record cached DHCPACK */ /* Record cached DHCPACK */
if ( ( rc = cachedhcp_record ( &cached_dhcpack, 0, if ( ( rc = cachedhcp_record ( &cached_dhcpack, 0,
phys_to_user ( cached_dhcpack_phys ), phys_to_virt ( cached_dhcpack_phys ),
sizeof ( BOOTPLAYER_t ) ) ) != 0 ) { sizeof ( BOOTPLAYER_t ) ) ) != 0 ) {
DBGC ( colour, "CACHEDHCP could not record DHCPACK: %s\n", DBGC ( colour, "CACHEDHCP could not record DHCPACK: %s\n",
strerror ( rc ) ); strerror ( rc ) );

View File

@@ -54,7 +54,7 @@ static int bios_find_smbios2 ( struct smbios *smbios ) {
return rc; return rc;
/* Fill in entry point descriptor structure */ /* Fill in entry point descriptor structure */
smbios->address = phys_to_user ( entry.smbios_address ); smbios->address = phys_to_virt ( entry.smbios_address );
smbios->len = entry.smbios_len; smbios->len = entry.smbios_len;
smbios->count = entry.smbios_count; smbios->count = entry.smbios_count;
smbios->version = SMBIOS_VERSION ( entry.major, entry.minor ); smbios->version = SMBIOS_VERSION ( entry.major, entry.minor );
@@ -85,7 +85,7 @@ static int bios_find_smbios3 ( struct smbios *smbios ) {
} }
/* Fill in entry point descriptor structure */ /* Fill in entry point descriptor structure */
smbios->address = phys_to_user ( entry.smbios_address ); smbios->address = phys_to_virt ( entry.smbios_address );
smbios->len = entry.smbios_len; smbios->len = entry.smbios_len;
smbios->count = 0; smbios->count = 0;
smbios->version = SMBIOS_VERSION ( entry.major, entry.minor ); smbios->version = SMBIOS_VERSION ( entry.major, entry.minor );

View File

@@ -743,7 +743,7 @@ static int int13_extended_rw ( struct san_device *sandev,
if ( ( addr.count == 0xff ) || if ( ( addr.count == 0xff ) ||
( ( addr.buffer.segment == 0xffff ) && ( ( addr.buffer.segment == 0xffff ) &&
( addr.buffer.offset == 0xffff ) ) ) { ( addr.buffer.offset == 0xffff ) ) ) {
buffer = phys_to_user ( addr.buffer_phys ); buffer = phys_to_virt ( addr.buffer_phys );
DBGC2 ( sandev->drive, "%08llx", DBGC2 ( sandev->drive, "%08llx",
( ( unsigned long long ) addr.buffer_phys ) ); ( ( unsigned long long ) addr.buffer_phys ) );
} else { } else {
@@ -1058,7 +1058,7 @@ static int int13_cdrom_read_boot_catalog ( struct san_device *sandev,
/* Read from boot catalog */ /* Read from boot catalog */
if ( ( rc = sandev_read ( sandev, start, command.count, if ( ( rc = sandev_read ( sandev, start, command.count,
phys_to_user ( command.buffer ) ) ) != 0 ) { phys_to_virt ( command.buffer ) ) ) != 0 ) {
DBGC ( sandev->drive, "INT13 drive %02x could not read boot " DBGC ( sandev->drive, "INT13 drive %02x could not read boot "
"catalog: %s\n", sandev->drive, strerror ( rc ) ); "catalog: %s\n", sandev->drive, strerror ( rc ) );
return -INT13_STATUS_READ_ERROR; return -INT13_STATUS_READ_ERROR;
@@ -1455,7 +1455,7 @@ static int int13_load_eltorito ( unsigned int drive, struct segoff *address ) {
"catalog (status %04x)\n", drive, status ); "catalog (status %04x)\n", drive, status );
return -EIO; return -EIO;
} }
copy_from_user ( &catalog, phys_to_user ( eltorito_cmd.buffer ), 0, copy_from_user ( &catalog, phys_to_virt ( eltorito_cmd.buffer ), 0,
sizeof ( catalog ) ); sizeof ( catalog ) );
/* Sanity checks */ /* Sanity checks */

View File

@@ -106,7 +106,7 @@ size_t largest_memblock ( userptr_t *start ) {
/* Use largest block */ /* Use largest block */
if ( region_len > len ) { if ( region_len > len ) {
DBG ( "...new best block found\n" ); DBG ( "...new best block found\n" );
*start = phys_to_user ( region_start ); *start = phys_to_virt ( region_start );
len = region_len; len = region_len;
} }
} }
@@ -124,7 +124,7 @@ static void init_eheap ( void ) {
heap_size = largest_memblock ( &base ); heap_size = largest_memblock ( &base );
bottom = top = ( base + heap_size ); bottom = top = ( base + heap_size );
DBG ( "External heap grows downwards from %lx (size %zx)\n", DBG ( "External heap grows downwards from %lx (size %zx)\n",
user_to_phys ( top, 0 ), heap_size ); virt_to_phys ( top ), heap_size );
} }
/** /**
@@ -141,8 +141,8 @@ static void ecollect_free ( void ) {
sizeof ( extmem ) ); sizeof ( extmem ) );
if ( extmem.used ) if ( extmem.used )
break; break;
DBG ( "EXTMEM freeing [%lx,%lx)\n", user_to_phys ( bottom, 0 ), DBG ( "EXTMEM freeing [%lx,%lx)\n", virt_to_phys ( bottom ),
user_to_phys ( bottom, extmem.size ) ); ( virt_to_phys ( bottom ) + extmem.size ) );
len = ( extmem.size + sizeof ( extmem ) ); len = ( extmem.size + sizeof ( extmem ) );
bottom += len; bottom += len;
heap_size += len; heap_size += len;
@@ -182,7 +182,7 @@ static userptr_t memtop_urealloc ( userptr_t ptr, size_t new_size ) {
ptr = bottom = ( bottom - sizeof ( extmem ) ); ptr = bottom = ( bottom - sizeof ( extmem ) );
heap_size -= sizeof ( extmem ); heap_size -= sizeof ( extmem );
DBG ( "EXTMEM allocating [%lx,%lx)\n", DBG ( "EXTMEM allocating [%lx,%lx)\n",
user_to_phys ( ptr, 0 ), user_to_phys ( ptr, 0 ) ); virt_to_phys ( ptr ), virt_to_phys ( ptr ) );
extmem.size = 0; extmem.size = 0;
} }
extmem.used = ( new_size > 0 ); extmem.used = ( new_size > 0 );
@@ -191,7 +191,7 @@ static userptr_t memtop_urealloc ( userptr_t ptr, size_t new_size ) {
if ( ptr == bottom ) { if ( ptr == bottom ) {
/* Update block */ /* Update block */
new = ( ptr - ( new_size - extmem.size ) ); new = ( ptr - ( new_size - extmem.size ) );
align = ( user_to_phys ( new, 0 ) & ( EM_ALIGN - 1 ) ); align = ( virt_to_phys ( new ) & ( EM_ALIGN - 1 ) );
new_size += align; new_size += align;
new -= align; new -= align;
if ( new_size > ( heap_size + extmem.size ) ) { if ( new_size > ( heap_size + extmem.size ) ) {
@@ -199,10 +199,10 @@ static userptr_t memtop_urealloc ( userptr_t ptr, size_t new_size ) {
return UNULL; return UNULL;
} }
DBG ( "EXTMEM expanding [%lx,%lx) to [%lx,%lx)\n", DBG ( "EXTMEM expanding [%lx,%lx) to [%lx,%lx)\n",
user_to_phys ( ptr, 0 ), virt_to_phys ( ptr ),
user_to_phys ( ptr, extmem.size ), ( virt_to_phys ( ptr ) + extmem.size ),
user_to_phys ( new, 0 ), virt_to_phys ( new ),
user_to_phys ( new, new_size )); ( virt_to_phys ( new ) + new_size ) );
memmove ( new, ptr, ( ( extmem.size < new_size ) ? memmove ( new, ptr, ( ( extmem.size < new_size ) ?
extmem.size : new_size ) ); extmem.size : new_size ) );
bottom = new; bottom = new;
@@ -213,8 +213,8 @@ static userptr_t memtop_urealloc ( userptr_t ptr, size_t new_size ) {
if ( new_size > extmem.size ) { if ( new_size > extmem.size ) {
/* Refuse to expand */ /* Refuse to expand */
DBG ( "EXTMEM cannot expand [%lx,%lx)\n", DBG ( "EXTMEM cannot expand [%lx,%lx)\n",
user_to_phys ( ptr, 0 ), virt_to_phys ( ptr ),
user_to_phys ( ptr, extmem.size ) ); ( virt_to_phys ( ptr ) + extmem.size ) );
return UNULL; return UNULL;
} }
} }
@@ -225,9 +225,9 @@ static userptr_t memtop_urealloc ( userptr_t ptr, size_t new_size ) {
/* Collect any free blocks and update hidden memory region */ /* Collect any free blocks and update hidden memory region */
ecollect_free(); ecollect_free();
hide_umalloc ( user_to_phys ( bottom, ( ( bottom == top ) ? hide_umalloc ( ( virt_to_phys ( bottom ) -
0 : -sizeof ( extmem ) ) ), ( ( bottom == top ) ? 0 : sizeof ( extmem ) ) ),
user_to_phys ( top, 0 ) ); virt_to_phys ( top ) );
return ( new_size ? new : UNOWHERE ); return ( new_size ? new : UNOWHERE );
} }

View File

@@ -78,10 +78,10 @@ static userptr_t rsdp_find_rsdt_range ( userptr_t start, size_t len ) {
continue; continue;
/* Extract RSDT */ /* Extract RSDT */
rsdt = phys_to_user ( le32_to_cpu ( rsdp.rsdt ) ); rsdt = phys_to_virt ( le32_to_cpu ( rsdp.rsdt ) );
DBGC ( rsdt, "RSDT %#08lx found via RSDP %#08lx\n", DBGC ( rsdt, "RSDT %#08lx found via RSDP %#08lx\n",
user_to_phys ( rsdt, 0 ), virt_to_phys ( rsdt ),
user_to_phys ( start, offset ) ); ( virt_to_phys ( start ) + offset ) );
return rsdt; return rsdt;
} }
@@ -114,7 +114,7 @@ static userptr_t rsdp_find_rsdt ( void ) {
} }
/* Search fixed BIOS area */ /* Search fixed BIOS area */
rsdt = rsdp_find_rsdt_range ( phys_to_user ( RSDP_BIOS_START ), rsdt = rsdp_find_rsdt_range ( phys_to_virt ( RSDP_BIOS_START ),
RSDP_BIOS_LEN ); RSDP_BIOS_LEN );
if ( rsdt ) if ( rsdt )
return rsdt; return rsdt;

View File

@@ -473,7 +473,7 @@ static int vesafb_init ( struct console_configuration *config ) {
vesafb_font(); vesafb_font();
/* Initialise frame buffer console */ /* Initialise frame buffer console */
if ( ( rc = fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ), if ( ( rc = fbcon_init ( &vesafb.fbcon, phys_to_virt ( vesafb.start ),
&vesafb.pixel, &vesafb.map, &vesafb.font, &vesafb.pixel, &vesafb.map, &vesafb.font,
config ) ) != 0 ) config ) ) != 0 )
goto err_fbcon_init; goto err_fbcon_init;

View File

@@ -492,7 +492,7 @@ PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE
} }
/* Read entire file */ /* Read entire file */
pxe_tftp.buffer = phys_to_user ( tftp_read_file->Buffer ); pxe_tftp.buffer = phys_to_virt ( tftp_read_file->Buffer );
pxe_tftp.size = tftp_read_file->BufferSize; pxe_tftp.size = tftp_read_file->BufferSize;
while ( ( rc = pxe_tftp.rc ) == -EINPROGRESS ) while ( ( rc = pxe_tftp.rc ) == -EINPROGRESS )
step(); step();

View File

@@ -49,7 +49,7 @@ void __asmcall com32_intcall ( uint8_t interrupt, physaddr_t inregs_phys, physad
DBGC ( &com32_regs, "COM32 INT%x in %#08lx out %#08lx\n", DBGC ( &com32_regs, "COM32 INT%x in %#08lx out %#08lx\n",
interrupt, inregs_phys, outregs_phys ); interrupt, inregs_phys, outregs_phys );
memcpy ( virt_to_user( &com32_regs ), phys_to_user ( inregs_phys ), memcpy ( virt_to_user( &com32_regs ), phys_to_virt ( inregs_phys ),
sizeof ( com32sys_t ) ); sizeof ( com32sys_t ) );
com32_int_vector = interrupt; com32_int_vector = interrupt;
@@ -107,7 +107,7 @@ void __asmcall com32_intcall ( uint8_t interrupt, physaddr_t inregs_phys, physad
: : ); : : );
if ( outregs_phys ) { if ( outregs_phys ) {
memcpy ( phys_to_user ( outregs_phys ), memcpy ( phys_to_virt ( outregs_phys ),
virt_to_user ( &com32_regs ), sizeof ( com32sys_t ) ); virt_to_user ( &com32_regs ), sizeof ( com32sys_t ) );
} }
} }
@@ -120,7 +120,7 @@ void __asmcall com32_farcall ( uint32_t proc, physaddr_t inregs_phys, physaddr_t
DBGC ( &com32_regs, "COM32 farcall %04x:%04x in %#08lx out %#08lx\n", DBGC ( &com32_regs, "COM32 farcall %04x:%04x in %#08lx out %#08lx\n",
( proc >> 16 ), ( proc & 0xffff ), inregs_phys, outregs_phys ); ( proc >> 16 ), ( proc & 0xffff ), inregs_phys, outregs_phys );
memcpy ( virt_to_user( &com32_regs ), phys_to_user ( inregs_phys ), memcpy ( virt_to_user( &com32_regs ), phys_to_virt ( inregs_phys ),
sizeof ( com32sys_t ) ); sizeof ( com32sys_t ) );
com32_farcall_proc = proc; com32_farcall_proc = proc;
@@ -167,7 +167,7 @@ void __asmcall com32_farcall ( uint32_t proc, physaddr_t inregs_phys, physaddr_t
: : ); : : );
if ( outregs_phys ) { if ( outregs_phys ) {
memcpy ( phys_to_user ( outregs_phys ), memcpy ( phys_to_virt ( outregs_phys ),
virt_to_user ( &com32_regs ), sizeof ( com32sys_t ) ); virt_to_user ( &com32_regs ), sizeof ( com32sys_t ) );
} }
} }
@@ -181,7 +181,7 @@ int __asmcall com32_cfarcall ( uint32_t proc, physaddr_t stack, size_t stacksz )
DBGC ( &com32_regs, "COM32 cfarcall %04x:%04x params %#08lx+%#zx\n", DBGC ( &com32_regs, "COM32 cfarcall %04x:%04x params %#08lx+%#zx\n",
( proc >> 16 ), ( proc & 0xffff ), stack, stacksz ); ( proc >> 16 ), ( proc & 0xffff ), stack, stacksz );
copy_user_to_rm_stack ( phys_to_user ( stack ), stacksz ); copy_user_to_rm_stack ( phys_to_virt ( stack ), stacksz );
com32_farcall_proc = proc; com32_farcall_proc = proc;
__asm__ __volatile__ ( __asm__ __volatile__ (

View File

@@ -114,8 +114,8 @@ static void shuffle ( unsigned int list_segment, unsigned int list_offset, unsig
/* Do the copies */ /* Do the copies */
for ( i = 0; i < count; i++ ) { for ( i = 0; i < count; i++ ) {
userptr_t src_u = phys_to_user ( shuf[ i ].src ); userptr_t src_u = phys_to_virt ( shuf[ i ].src );
userptr_t dest_u = phys_to_user ( shuf[ i ].dest ); userptr_t dest_u = phys_to_virt ( shuf[ i ].dest );
if ( shuf[ i ].src == 0xFFFFFFFF ) { if ( shuf[ i ].src == 0xFFFFFFFF ) {
/* Fill with 0 instead of copying */ /* Fill with 0 instead of copying */

View File

@@ -428,8 +428,8 @@ void setup_sipi ( unsigned int vector, uint32_t handler,
copy_to_real ( ( vector << 8 ), 0, sipi, ( ( size_t ) sipi_len ) ); copy_to_real ( ( vector << 8 ), 0, sipi, ( ( size_t ) sipi_len ) );
} }
PROVIDE_UACCESS_INLINE ( librm, phys_to_user ); PROVIDE_UACCESS_INLINE ( librm, phys_to_virt );
PROVIDE_UACCESS_INLINE ( librm, user_to_phys ); PROVIDE_UACCESS_INLINE ( librm, virt_to_phys );
PROVIDE_UACCESS_INLINE ( librm, virt_to_user ); PROVIDE_UACCESS_INLINE ( librm, virt_to_user );
PROVIDE_UACCESS_INLINE ( librm, memchr_user ); PROVIDE_UACCESS_INLINE ( librm, memchr_user );
PROVIDE_IOMAP_INLINE ( pages, io_to_bus ); PROVIDE_IOMAP_INLINE ( pages, io_to_bus );

View File

@@ -128,16 +128,16 @@ userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
copy_from_user ( &acpi, rsdt, 0, sizeof ( acpi ) ); copy_from_user ( &acpi, rsdt, 0, sizeof ( acpi ) );
if ( acpi.signature != cpu_to_le32 ( RSDT_SIGNATURE ) ) { if ( acpi.signature != cpu_to_le32 ( RSDT_SIGNATURE ) ) {
DBGC ( colour, "RSDT %#08lx has invalid signature:\n", DBGC ( colour, "RSDT %#08lx has invalid signature:\n",
user_to_phys ( rsdt, 0 ) ); virt_to_phys ( rsdt ) );
DBGC_HDA ( colour, user_to_phys ( rsdt, 0 ), &acpi, DBGC_HDA ( colour, virt_to_phys ( rsdt ), &acpi,
sizeof ( acpi ) ); sizeof ( acpi ) );
return UNULL; return UNULL;
} }
len = le32_to_cpu ( acpi.length ); len = le32_to_cpu ( acpi.length );
if ( len < sizeof ( rsdtab->acpi ) ) { if ( len < sizeof ( rsdtab->acpi ) ) {
DBGC ( colour, "RSDT %#08lx has invalid length:\n", DBGC ( colour, "RSDT %#08lx has invalid length:\n",
user_to_phys ( rsdt, 0 ) ); virt_to_phys ( rsdt ) );
DBGC_HDA ( colour, user_to_phys ( rsdt, 0 ), &acpi, DBGC_HDA ( colour, virt_to_phys ( rsdt ), &acpi,
sizeof ( acpi ) ); sizeof ( acpi ) );
return UNULL; return UNULL;
} }
@@ -154,7 +154,7 @@ userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
sizeof ( entry ) ); sizeof ( entry ) );
/* Read table header */ /* Read table header */
table = phys_to_user ( entry ); table = phys_to_virt ( entry );
copy_from_user ( &acpi.signature, table, 0, copy_from_user ( &acpi.signature, table, 0,
sizeof ( acpi.signature ) ); sizeof ( acpi.signature ) );
@@ -169,20 +169,20 @@ userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
/* Check table integrity */ /* Check table integrity */
if ( acpi_checksum ( table ) != 0 ) { if ( acpi_checksum ( table ) != 0 ) {
DBGC ( colour, "RSDT %#08lx found %s with bad " DBGC ( colour, "RSDT %#08lx found %s with bad "
"checksum at %08lx\n", user_to_phys ( rsdt, 0 ), "checksum at %08lx\n", virt_to_phys ( rsdt ),
acpi_name ( signature ), acpi_name ( signature ),
user_to_phys ( table, 0 ) ); virt_to_phys ( table ) );
break; break;
} }
DBGC ( colour, "RSDT %#08lx found %s at %08lx\n", DBGC ( colour, "RSDT %#08lx found %s at %08lx\n",
user_to_phys ( rsdt, 0 ), acpi_name ( signature ), virt_to_phys ( rsdt ), acpi_name ( signature ),
user_to_phys ( table, 0 ) ); virt_to_phys ( table ) );
return table; return table;
} }
DBGC ( colour, "RSDT %#08lx could not find %s\n", DBGC ( colour, "RSDT %#08lx could not find %s\n",
user_to_phys ( rsdt, 0 ), acpi_name ( signature ) ); virt_to_phys ( rsdt ), acpi_name ( signature ) );
return UNULL; return UNULL;
} }
@@ -218,7 +218,7 @@ static int acpi_zsdt ( userptr_t zsdt, uint32_t signature, void *data,
if ( buf != cpu_to_le32 ( signature ) ) if ( buf != cpu_to_le32 ( signature ) )
continue; continue;
DBGC ( zsdt, "DSDT/SSDT %#08lx found %s at offset %#zx\n", DBGC ( zsdt, "DSDT/SSDT %#08lx found %s at offset %#zx\n",
user_to_phys ( zsdt, 0 ), acpi_name ( signature ), virt_to_phys ( zsdt ), acpi_name ( signature ),
offset ); offset );
/* Attempt to extract data */ /* Attempt to extract data */
@@ -251,7 +251,7 @@ int acpi_extract ( uint32_t signature, void *data,
fadt = acpi_table ( FADT_SIGNATURE, 0 ); fadt = acpi_table ( FADT_SIGNATURE, 0 );
if ( fadt ) { if ( fadt ) {
copy_from_user ( &fadtab, fadt, 0, sizeof ( fadtab ) ); copy_from_user ( &fadtab, fadt, 0, sizeof ( fadtab ) );
dsdt = phys_to_user ( fadtab.dsdt ); dsdt = phys_to_virt ( fadtab.dsdt );
if ( ( rc = acpi_zsdt ( dsdt, signature, data, if ( ( rc = acpi_zsdt ( dsdt, signature, data,
extract ) ) == 0 ) extract ) ) == 0 )
return 0; return 0;

View File

@@ -248,7 +248,7 @@ int block_translate ( struct interface *block, userptr_t buffer, size_t size ) {
DBGC2 ( blktrans, "BLKTRANS %p created", blktrans ); DBGC2 ( blktrans, "BLKTRANS %p created", blktrans );
if ( buffer ) { if ( buffer ) {
DBGC2 ( blktrans, " for %#lx+%#zx", DBGC2 ( blktrans, " for %#lx+%#zx",
user_to_phys ( buffer, 0 ), size ); virt_to_phys ( buffer ), size );
} }
DBGC2 ( blktrans, "\n" ); DBGC2 ( blktrans, "\n" );
return 0; return 0;

View File

@@ -251,7 +251,7 @@ int cachedhcp_record ( struct cached_dhcp_packet *cache, unsigned int vlan,
/* Store as cached packet */ /* Store as cached packet */
DBGC ( colour, "CACHEDHCP %s at %#08lx+%#zx/%#zx\n", cache->name, DBGC ( colour, "CACHEDHCP %s at %#08lx+%#zx/%#zx\n", cache->name,
user_to_phys ( data, 0 ), len, max_len ); virt_to_phys ( data ), len, max_len );
cache->dhcppkt = dhcppkt; cache->dhcppkt = dhcppkt;
cache->vlan = vlan; cache->vlan = vlan;

View File

@@ -613,8 +613,8 @@ int fbcon_init ( struct fbcon *fbcon, userptr_t start,
/* Derive overall length */ /* Derive overall length */
fbcon->len = ( pixel->height * pixel->stride ); fbcon->len = ( pixel->height * pixel->stride );
DBGC ( fbcon, "FBCON %p at [%08lx,%08lx)\n", fbcon, DBGC ( fbcon, "FBCON %p at [%08lx,%08lx)\n", fbcon,
user_to_phys ( fbcon->start, 0 ), virt_to_phys ( fbcon->start ),
user_to_phys ( fbcon->start, fbcon->len ) ); ( virt_to_phys ( fbcon->start ) + fbcon->len ) );
/* Calculate margin. If the actual screen size is larger than /* Calculate margin. If the actual screen size is larger than
* the requested screen size, then update the margins so that * the requested screen size, then update the margins so that

View File

@@ -300,8 +300,8 @@ int register_image ( struct image *image ) {
image->flags |= IMAGE_REGISTERED; image->flags |= IMAGE_REGISTERED;
list_add_tail ( &image->list, &images ); list_add_tail ( &image->list, &images );
DBGC ( image, "IMAGE %s at [%lx,%lx) registered\n", DBGC ( image, "IMAGE %s at [%lx,%lx) registered\n",
image->name, user_to_phys ( image->data, 0 ), image->name, virt_to_phys ( image->data ),
user_to_phys ( image->data, image->len ) ); ( virt_to_phys ( image->data ) + image->len ) );
/* Try to detect image type, if applicable. Ignore failures, /* Try to detect image type, if applicable. Ignore failures,
* since we expect to handle some unrecognised images * since we expect to handle some unrecognised images

View File

@@ -32,7 +32,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
*/ */
/* Flat address space user access API */ /* Flat address space user access API */
PROVIDE_UACCESS_INLINE ( flat, phys_to_user ); PROVIDE_UACCESS_INLINE ( flat, phys_to_virt );
PROVIDE_UACCESS_INLINE ( flat, user_to_phys ); PROVIDE_UACCESS_INLINE ( flat, virt_to_phys );
PROVIDE_UACCESS_INLINE ( flat, virt_to_user ); PROVIDE_UACCESS_INLINE ( flat, virt_to_user );
PROVIDE_UACCESS_INLINE ( flat, memchr_user ); PROVIDE_UACCESS_INLINE ( flat, memchr_user );

View File

@@ -428,7 +428,7 @@ static int srp_cmd ( struct srp_device *srpdev,
cmd->data_buffer_formats |= SRP_CMD_DO_FMT_DIRECT; cmd->data_buffer_formats |= SRP_CMD_DO_FMT_DIRECT;
data_out = iob_put ( iobuf, sizeof ( *data_out ) ); data_out = iob_put ( iobuf, sizeof ( *data_out ) );
data_out->address = data_out->address =
cpu_to_be64 ( user_to_phys ( command->data_out, 0 ) ); cpu_to_be64 ( virt_to_phys ( command->data_out ) );
data_out->handle = ntohl ( srpdev->memory_handle ); data_out->handle = ntohl ( srpdev->memory_handle );
data_out->len = ntohl ( command->data_out_len ); data_out->len = ntohl ( command->data_out_len );
} }
@@ -438,7 +438,7 @@ static int srp_cmd ( struct srp_device *srpdev,
cmd->data_buffer_formats |= SRP_CMD_DI_FMT_DIRECT; cmd->data_buffer_formats |= SRP_CMD_DI_FMT_DIRECT;
data_in = iob_put ( iobuf, sizeof ( *data_in ) ); data_in = iob_put ( iobuf, sizeof ( *data_in ) );
data_in->address = data_in->address =
cpu_to_be64 ( user_to_phys ( command->data_in, 0 ) ); cpu_to_be64 ( virt_to_phys ( command->data_in ) );
data_in->handle = ntohl ( srpdev->memory_handle ); data_in->handle = ntohl ( srpdev->memory_handle );
data_in->len = ntohl ( command->data_in_len ); data_in->len = ntohl ( command->data_in_len );
} }

View File

@@ -2079,7 +2079,7 @@ static int arbel_start_firmware ( struct arbel *arbel ) {
} else { } else {
assert ( arbel->firmware_len == fw_len ); assert ( arbel->firmware_len == fw_len );
} }
fw_base = user_to_phys ( arbel->firmware_area, 0 ); fw_base = virt_to_phys ( arbel->firmware_area );
DBGC ( arbel, "Arbel %p firmware area at [%08lx,%08lx)\n", DBGC ( arbel, "Arbel %p firmware area at [%08lx,%08lx)\n",
arbel, fw_base, ( fw_base + fw_len ) ); arbel, fw_base, ( fw_base + fw_len ) );
if ( ( rc = arbel_map_vpm ( arbel, arbel_cmd_map_fa, if ( ( rc = arbel_map_vpm ( arbel, arbel_cmd_map_fa,
@@ -2452,7 +2452,7 @@ static int arbel_alloc_icm ( struct arbel *arbel,
assert ( arbel->icm_len == icm_len ); assert ( arbel->icm_len == icm_len );
assert ( arbel->icm_aux_len == icm_aux_len ); assert ( arbel->icm_aux_len == icm_aux_len );
} }
icm_phys = user_to_phys ( arbel->icm, 0 ); icm_phys = virt_to_phys ( arbel->icm );
/* Allocate doorbell UAR */ /* Allocate doorbell UAR */
arbel->db_rec = malloc_phys ( ARBEL_PAGE_SIZE, ARBEL_PAGE_SIZE ); arbel->db_rec = malloc_phys ( ARBEL_PAGE_SIZE, ARBEL_PAGE_SIZE );

View File

@@ -486,8 +486,8 @@ static inline int golan_provide_pages ( struct golan *golan , uint32_t pages
for ( i = 0 , j = MANAGE_PAGES_PSA_OFFSET; i < pas_num; ++i ,++j, for ( i = 0 , j = MANAGE_PAGES_PSA_OFFSET; i < pas_num; ++i ,++j,
next_page_addr += GOLAN_PAGE_SIZE ) { next_page_addr += GOLAN_PAGE_SIZE ) {
addr = next_page_addr; addr = next_page_addr;
if (GOLAN_PAGE_MASK & user_to_phys(addr, 0)) { if (GOLAN_PAGE_MASK & virt_to_phys(addr)) {
DBGC (golan ,"Addr not Page alligned [%lx]\n", user_to_phys(addr, 0)); DBGC (golan ,"Addr not Page alligned [%lx]\n", virt_to_phys(addr));
} }
mailbox->mblock.data[j] = USR_2_BE64_BUS(addr); mailbox->mblock.data[j] = USR_2_BE64_BUS(addr);
} }

View File

@@ -69,8 +69,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define VIRT_2_BE64_BUS( addr ) cpu_to_be64(((unsigned long long )virt_to_bus(addr))) #define VIRT_2_BE64_BUS( addr ) cpu_to_be64(((unsigned long long )virt_to_bus(addr)))
#define BE64_BUS_2_VIRT( addr ) bus_to_virt(be64_to_cpu(addr)) #define BE64_BUS_2_VIRT( addr ) bus_to_virt(be64_to_cpu(addr))
#define USR_2_BE64_BUS( addr ) cpu_to_be64(((unsigned long long )user_to_phys(addr, 0))) #define USR_2_BE64_BUS( addr ) cpu_to_be64(((unsigned long long )virt_to_phys(addr)))
#define BE64_BUS_2_USR( addr ) be64_to_cpu(phys_to_user(addr)) #define BE64_BUS_2_USR( addr ) be64_to_cpu(phys_to_virt(addr))
#define GET_INBOX(golan, idx) (&(((struct mbox *)(golan->mboxes.inbox))[idx])) #define GET_INBOX(golan, idx) (&(((struct mbox *)(golan->mboxes.inbox))[idx]))
#define GET_OUTBOX(golan, idx) (&(((struct mbox *)(golan->mboxes.outbox))[idx])) #define GET_OUTBOX(golan, idx) (&(((struct mbox *)(golan->mboxes.outbox))[idx]))

View File

@@ -2382,7 +2382,7 @@ static int hermon_start_firmware ( struct hermon *hermon ) {
} else { } else {
assert ( hermon->firmware_len == fw_len ); assert ( hermon->firmware_len == fw_len );
} }
fw_base = user_to_phys ( hermon->firmware_area, 0 ); fw_base = virt_to_phys ( hermon->firmware_area );
DBGC ( hermon, "Hermon %p firmware area at physical [%08lx,%08lx)\n", DBGC ( hermon, "Hermon %p firmware area at physical [%08lx,%08lx)\n",
hermon, fw_base, ( fw_base + fw_len ) ); hermon, fw_base, ( fw_base + fw_len ) );
if ( ( rc = hermon_map_vpm ( hermon, hermon_cmd_map_fa, if ( ( rc = hermon_map_vpm ( hermon, hermon_cmd_map_fa,
@@ -2752,7 +2752,7 @@ static int hermon_map_icm ( struct hermon *hermon,
assert ( hermon->icm_len == icm_len ); assert ( hermon->icm_len == icm_len );
assert ( hermon->icm_aux_len == icm_aux_len ); assert ( hermon->icm_aux_len == icm_aux_len );
} }
icm_phys = user_to_phys ( hermon->icm, 0 ); icm_phys = virt_to_phys ( hermon->icm );
/* Map ICM auxiliary area */ /* Map ICM auxiliary area */
DBGC ( hermon, "Hermon %p mapping ICM AUX => %08lx\n", DBGC ( hermon, "Hermon %p mapping ICM AUX => %08lx\n",

View File

@@ -406,7 +406,7 @@ static int exanic_open ( struct net_device *netdev ) {
port->rx_cons = 0; port->rx_cons = 0;
/* Map receive region */ /* Map receive region */
exanic_write_base ( phys_to_bus ( user_to_phys ( port->rx, 0 ) ), exanic_write_base ( phys_to_bus ( virt_to_phys ( port->rx ) ),
( port->regs + EXANIC_PORT_RX_BASE ) ); ( port->regs + EXANIC_PORT_RX_BASE ) );
/* Enable promiscuous mode */ /* Enable promiscuous mode */
@@ -729,8 +729,8 @@ static int exanic_probe_port ( struct exanic *exanic, struct device *dev,
DBGC ( port, "EXANIC %s port %d TX [%#05zx,%#05zx) TXF %#02x RX " DBGC ( port, "EXANIC %s port %d TX [%#05zx,%#05zx) TXF %#02x RX "
"[%#lx,%#lx)\n", netdev->name, index, port->tx_offset, "[%#lx,%#lx)\n", netdev->name, index, port->tx_offset,
( port->tx_offset + tx_len ), port->txf_slot, ( port->tx_offset + tx_len ), port->txf_slot,
user_to_phys ( port->rx, 0 ), virt_to_phys ( port->rx ),
user_to_phys ( port->rx, EXANIC_RX_LEN ) ); ( virt_to_phys ( port->rx ) + EXANIC_RX_LEN ) );
/* Set initial link state */ /* Set initial link state */
exanic_check_link ( netdev ); exanic_check_link ( netdev );

View File

@@ -521,14 +521,14 @@ static int gve_deconfigure ( struct gve_nic *gve ) {
static int gve_register ( struct gve_nic *gve, struct gve_qpl *qpl ) { static int gve_register ( struct gve_nic *gve, struct gve_qpl *qpl ) {
struct gve_pages *pages = &gve->scratch.buf->pages; struct gve_pages *pages = &gve->scratch.buf->pages;
union gve_admin_command *cmd; union gve_admin_command *cmd;
physaddr_t addr; void *addr;
unsigned int i; unsigned int i;
int rc; int rc;
/* Build page address list */ /* Build page address list */
for ( i = 0 ; i < qpl->count ; i++ ) { for ( i = 0 ; i < qpl->count ; i++ ) {
addr = user_to_phys ( qpl->data, ( i * GVE_PAGE_SIZE ) ); addr = ( qpl->data + ( i * GVE_PAGE_SIZE ) );
pages->addr[i] = cpu_to_be64 ( dma_phys ( &qpl->map, addr ) ); pages->addr[i] = cpu_to_be64 ( dma ( &qpl->map, addr ) );
} }
/* Construct request */ /* Construct request */
@@ -575,11 +575,10 @@ static void gve_create_tx_param ( struct gve_queue *queue,
union gve_admin_command *cmd ) { union gve_admin_command *cmd ) {
struct gve_admin_create_tx *create = &cmd->create_tx; struct gve_admin_create_tx *create = &cmd->create_tx;
const struct gve_queue_type *type = queue->type; const struct gve_queue_type *type = queue->type;
physaddr_t desc = user_to_phys ( queue->desc, 0 );
/* Construct request parameters */ /* Construct request parameters */
create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) ); create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) );
create->desc = cpu_to_be64 ( dma_phys ( &queue->desc_map, desc ) ); create->desc = cpu_to_be64 ( dma ( &queue->desc_map, queue->desc ) );
create->qpl_id = cpu_to_be32 ( type->qpl ); create->qpl_id = cpu_to_be32 ( type->qpl );
create->notify_id = cpu_to_be32 ( type->irq ); create->notify_id = cpu_to_be32 ( type->irq );
} }
@@ -594,14 +593,12 @@ static void gve_create_rx_param ( struct gve_queue *queue,
union gve_admin_command *cmd ) { union gve_admin_command *cmd ) {
struct gve_admin_create_rx *create = &cmd->create_rx; struct gve_admin_create_rx *create = &cmd->create_rx;
const struct gve_queue_type *type = queue->type; const struct gve_queue_type *type = queue->type;
physaddr_t desc = user_to_phys ( queue->desc, 0 );
physaddr_t cmplt = user_to_phys ( queue->cmplt, 0 );
/* Construct request parameters */ /* Construct request parameters */
create->notify_id = cpu_to_be32 ( type->irq ); create->notify_id = cpu_to_be32 ( type->irq );
create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) ); create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) );
create->desc = cpu_to_be64 ( dma_phys ( &queue->desc_map, desc ) ); create->desc = cpu_to_be64 ( dma ( &queue->desc_map, queue->desc ) );
create->cmplt = cpu_to_be64 ( dma_phys ( &queue->cmplt_map, cmplt ) ); create->cmplt = cpu_to_be64 ( dma ( &queue->cmplt_map, queue->cmplt ));
create->qpl_id = cpu_to_be32 ( type->qpl ); create->qpl_id = cpu_to_be32 ( type->qpl );
create->bufsz = cpu_to_be16 ( GVE_BUF_SIZE ); create->bufsz = cpu_to_be16 ( GVE_BUF_SIZE );
} }
@@ -760,8 +757,8 @@ static int gve_alloc_qpl ( struct gve_nic *gve, struct gve_qpl *qpl,
return -ENOMEM; return -ENOMEM;
DBGC ( gve, "GVE %p QPL %#08x at [%08lx,%08lx)\n", DBGC ( gve, "GVE %p QPL %#08x at [%08lx,%08lx)\n",
gve, qpl->id, user_to_phys ( qpl->data, 0 ), gve, qpl->id, virt_to_phys ( qpl->data ),
user_to_phys ( qpl->data, len ) ); ( virt_to_phys ( qpl->data ) + len ) );
return 0; return 0;
} }
@@ -883,8 +880,8 @@ static int gve_alloc_queue ( struct gve_nic *gve, struct gve_queue *queue ) {
goto err_desc; goto err_desc;
} }
DBGC ( gve, "GVE %p %s descriptors at [%08lx,%08lx)\n", DBGC ( gve, "GVE %p %s descriptors at [%08lx,%08lx)\n",
gve, type->name, user_to_phys ( queue->desc, 0 ), gve, type->name, virt_to_phys ( queue->desc ),
user_to_phys ( queue->desc, desc_len ) ); ( virt_to_phys ( queue->desc ) + desc_len ) );
/* Allocate completions */ /* Allocate completions */
if ( cmplt_len ) { if ( cmplt_len ) {
@@ -895,8 +892,8 @@ static int gve_alloc_queue ( struct gve_nic *gve, struct gve_queue *queue ) {
goto err_cmplt; goto err_cmplt;
} }
DBGC ( gve, "GVE %p %s completions at [%08lx,%08lx)\n", DBGC ( gve, "GVE %p %s completions at [%08lx,%08lx)\n",
gve, type->name, user_to_phys ( queue->cmplt, 0 ), gve, type->name, virt_to_phys ( queue->cmplt ),
user_to_phys ( queue->cmplt, cmplt_len ) ); ( virt_to_phys ( queue->cmplt ) + cmplt_len ) );
} }
/* Allocate queue resources */ /* Allocate queue resources */

View File

@@ -118,14 +118,14 @@ static int txnic_create_sq ( struct txnic *vnic ) {
writeq ( TXNIC_QS_SQ_CFG_RESET, ( vnic->regs + TXNIC_QS_SQ_CFG(0) ) ); writeq ( TXNIC_QS_SQ_CFG_RESET, ( vnic->regs + TXNIC_QS_SQ_CFG(0) ) );
/* Configure and enable send queue */ /* Configure and enable send queue */
writeq ( user_to_phys ( vnic->sq.sqe, 0 ), writeq ( virt_to_phys ( vnic->sq.sqe ),
( vnic->regs + TXNIC_QS_SQ_BASE(0) ) ); ( vnic->regs + TXNIC_QS_SQ_BASE(0) ) );
writeq ( ( TXNIC_QS_SQ_CFG_ENA | TXNIC_QS_SQ_CFG_QSIZE_1K ), writeq ( ( TXNIC_QS_SQ_CFG_ENA | TXNIC_QS_SQ_CFG_QSIZE_1K ),
( vnic->regs + TXNIC_QS_SQ_CFG(0) ) ); ( vnic->regs + TXNIC_QS_SQ_CFG(0) ) );
DBGC ( vnic, "TXNIC %s SQ at [%08lx,%08lx)\n", DBGC ( vnic, "TXNIC %s SQ at [%08lx,%08lx)\n",
vnic->name, user_to_phys ( vnic->sq.sqe, 0 ), vnic->name, virt_to_phys ( vnic->sq.sqe ),
user_to_phys ( vnic->sq.sqe, TXNIC_SQ_SIZE ) ); ( virt_to_phys ( vnic->sq.sqe ) + TXNIC_SQ_SIZE ) );
return 0; return 0;
} }
@@ -277,7 +277,7 @@ static int txnic_create_rq ( struct txnic *vnic ) {
( vnic->regs + TXNIC_QS_RBDR_CFG(0) ) ); ( vnic->regs + TXNIC_QS_RBDR_CFG(0) ) );
/* Configure and enable receive buffer descriptor ring */ /* Configure and enable receive buffer descriptor ring */
writeq ( user_to_phys ( vnic->rq.rqe, 0 ), writeq ( virt_to_phys ( vnic->rq.rqe ),
( vnic->regs + TXNIC_QS_RBDR_BASE(0) ) ); ( vnic->regs + TXNIC_QS_RBDR_BASE(0) ) );
writeq ( ( TXNIC_QS_RBDR_CFG_ENA | TXNIC_QS_RBDR_CFG_QSIZE_8K | writeq ( ( TXNIC_QS_RBDR_CFG_ENA | TXNIC_QS_RBDR_CFG_QSIZE_8K |
TXNIC_QS_RBDR_CFG_LINES ( TXNIC_RQE_SIZE / TXNIC_QS_RBDR_CFG_LINES ( TXNIC_RQE_SIZE /
@@ -288,8 +288,8 @@ static int txnic_create_rq ( struct txnic *vnic ) {
writeq ( TXNIC_QS_RQ_CFG_ENA, ( vnic->regs + TXNIC_QS_RQ_CFG(0) ) ); writeq ( TXNIC_QS_RQ_CFG_ENA, ( vnic->regs + TXNIC_QS_RQ_CFG(0) ) );
DBGC ( vnic, "TXNIC %s RQ at [%08lx,%08lx)\n", DBGC ( vnic, "TXNIC %s RQ at [%08lx,%08lx)\n",
vnic->name, user_to_phys ( vnic->rq.rqe, 0 ), vnic->name, virt_to_phys ( vnic->rq.rqe ),
user_to_phys ( vnic->rq.rqe, TXNIC_RQ_SIZE ) ); ( virt_to_phys ( vnic->rq.rqe ) + TXNIC_RQ_SIZE ) );
return 0; return 0;
} }
@@ -463,14 +463,14 @@ static int txnic_create_cq ( struct txnic *vnic ) {
writeq ( TXNIC_QS_CQ_CFG_RESET, ( vnic->regs + TXNIC_QS_CQ_CFG(0) ) ); writeq ( TXNIC_QS_CQ_CFG_RESET, ( vnic->regs + TXNIC_QS_CQ_CFG(0) ) );
/* Configure and enable completion queue */ /* Configure and enable completion queue */
writeq ( user_to_phys ( vnic->cq.cqe, 0 ), writeq ( virt_to_phys ( vnic->cq.cqe ),
( vnic->regs + TXNIC_QS_CQ_BASE(0) ) ); ( vnic->regs + TXNIC_QS_CQ_BASE(0) ) );
writeq ( ( TXNIC_QS_CQ_CFG_ENA | TXNIC_QS_CQ_CFG_QSIZE_256 ), writeq ( ( TXNIC_QS_CQ_CFG_ENA | TXNIC_QS_CQ_CFG_QSIZE_256 ),
( vnic->regs + TXNIC_QS_CQ_CFG(0) ) ); ( vnic->regs + TXNIC_QS_CQ_CFG(0) ) );
DBGC ( vnic, "TXNIC %s CQ at [%08lx,%08lx)\n", DBGC ( vnic, "TXNIC %s CQ at [%08lx,%08lx)\n",
vnic->name, user_to_phys ( vnic->cq.cqe, 0 ), vnic->name, virt_to_phys ( vnic->cq.cqe ),
user_to_phys ( vnic->cq.cqe, TXNIC_CQ_SIZE ) ); ( virt_to_phys ( vnic->cq.cqe ) + TXNIC_CQ_SIZE ) );
return 0; return 0;
} }
@@ -559,7 +559,8 @@ static void txnic_poll_cq ( struct txnic *vnic ) {
default: default:
DBGC ( vnic, "TXNIC %s unknown completion type %d\n", DBGC ( vnic, "TXNIC %s unknown completion type %d\n",
vnic->name, cqe.common.cqe_type ); vnic->name, cqe.common.cqe_type );
DBGC_HDA ( vnic, user_to_phys ( vnic->cq.cqe, offset ), DBGC_HDA ( vnic,
( virt_to_phys ( vnic->cq.cqe ) + offset ),
&cqe, sizeof ( cqe ) ); &cqe, sizeof ( cqe ) );
break; break;
} }

View File

@@ -1014,8 +1014,7 @@ static int xhci_scratchpad_alloc ( struct xhci_device *xhci ) {
} }
/* Populate scratchpad array */ /* Populate scratchpad array */
addr = dma_phys ( &scratch->buffer_map, addr = dma ( &scratch->buffer_map, scratch->buffer );
user_to_phys ( scratch->buffer, 0 ) );
for ( i = 0 ; i < scratch->count ; i++ ) { for ( i = 0 ; i < scratch->count ; i++ ) {
scratch->array[i] = cpu_to_le64 ( addr ); scratch->array[i] = cpu_to_le64 ( addr );
addr += xhci->pagesize; addr += xhci->pagesize;
@@ -1027,8 +1026,8 @@ static int xhci_scratchpad_alloc ( struct xhci_device *xhci ) {
scratch->array ) ); scratch->array ) );
DBGC2 ( xhci, "XHCI %s scratchpad [%08lx,%08lx) array [%08lx,%08lx)\n", DBGC2 ( xhci, "XHCI %s scratchpad [%08lx,%08lx) array [%08lx,%08lx)\n",
xhci->name, user_to_phys ( scratch->buffer, 0 ), xhci->name, virt_to_phys ( scratch->buffer ),
user_to_phys ( scratch->buffer, buffer_len ), ( virt_to_phys ( scratch->buffer ) + buffer_len ),
virt_to_phys ( scratch->array ), virt_to_phys ( scratch->array ),
( virt_to_phys ( scratch->array ) + array_len ) ); ( virt_to_phys ( scratch->array ) + array_len ) );
return 0; return 0;

View File

@@ -81,7 +81,7 @@ static int imgmem_exec ( int argc, char **argv ) {
return rc; return rc;
/* Create image */ /* Create image */
if ( ( rc = imgmem ( opts.name, phys_to_user ( data ), len ) ) != 0 ) if ( ( rc = imgmem ( opts.name, phys_to_virt ( data ), len ) ) != 0 )
return rc; return rc;
return 0; return 0;

View File

@@ -50,7 +50,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
*/ */
static int elf_load_segment ( struct image *image, Elf_Phdr *phdr, static int elf_load_segment ( struct image *image, Elf_Phdr *phdr,
physaddr_t dest ) { physaddr_t dest ) {
userptr_t buffer = phys_to_user ( dest ); userptr_t buffer = phys_to_virt ( dest );
int rc; int rc;
DBGC ( image, "ELF %p loading segment [%x,%x) to [%lx,%lx,%lx)\n", DBGC ( image, "ELF %p loading segment [%x,%x) to [%lx,%lx,%lx)\n",

View File

@@ -59,9 +59,9 @@ struct errortab segment_errors[] __errortab = {
*/ */
int prep_segment ( userptr_t segment, size_t filesz, size_t memsz ) { int prep_segment ( userptr_t segment, size_t filesz, size_t memsz ) {
struct memory_map memmap; struct memory_map memmap;
physaddr_t start = user_to_phys ( segment, 0 ); physaddr_t start = virt_to_phys ( segment );
physaddr_t mid = user_to_phys ( segment, filesz ); physaddr_t mid = ( start + filesz );
physaddr_t end = user_to_phys ( segment, memsz ); physaddr_t end = ( start + memsz );
unsigned int i; unsigned int i;
DBG ( "Preparing segment [%lx,%lx,%lx)\n", start, mid, end ); DBG ( "Preparing segment [%lx,%lx,%lx)\n", start, mid, end );

View File

@@ -10,10 +10,9 @@
* *
* We have no concept of the underlying physical addresses, since * We have no concept of the underlying physical addresses, since
* these are not exposed to userspace. We provide a stub * these are not exposed to userspace. We provide a stub
* implementation of user_to_phys() since this is required by * implementation of virt_to_phys() since this is required by
* alloc_memblock(). We provide no implementation of phys_to_user(); * alloc_memblock(). We provide a matching stub implementation of
* any code attempting to access physical addresses will therefore * phys_to_virt().
* (correctly) fail to link.
*/ */
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
@@ -25,14 +24,13 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#endif #endif
/** /**
* Convert user pointer to physical address * Convert virtual address to physical address
* *
* @v userptr User pointer * @v virt Virtual address
* @v offset Offset from user pointer * @ret phys Physical address
* @ret phys_addr Physical address
*/ */
static inline __always_inline unsigned long static inline __always_inline physaddr_t
UACCESS_INLINE ( linux, user_to_phys ) ( userptr_t userptr, off_t offset ) { UACCESS_INLINE ( linux, virt_to_phys ) ( volatile const void *virt ) {
/* We do not know the real underlying physical address. We /* We do not know the real underlying physical address. We
* provide this stub implementation only because it is * provide this stub implementation only because it is
@@ -43,20 +41,20 @@ UACCESS_INLINE ( linux, user_to_phys ) ( userptr_t userptr, off_t offset ) {
* virtual address will suffice for the purpose of determining * virtual address will suffice for the purpose of determining
* alignment. * alignment.
*/ */
return ( ( unsigned long ) ( userptr + offset ) ); return ( ( physaddr_t ) virt );
} }
/** /**
* Convert physical address to user pointer * Convert physical address to virtual address
* *
* @v phys_addr Physical address * @v phys Physical address
* @ret userptr User pointer * @ret virt Virtual address
*/ */
static inline __always_inline userptr_t static inline __always_inline void *
UACCESS_INLINE ( linux, phys_to_user ) ( physaddr_t phys_addr ) { UACCESS_INLINE ( linux, phys_to_virt ) ( physaddr_t phys ) {
/* For symmetry with the stub user_to_phys() */ /* For symmetry with the stub virt_to_phys() */
return ( ( userptr_t ) phys_addr ); return ( ( void * ) phys );
} }
static inline __always_inline userptr_t static inline __always_inline userptr_t

View File

@@ -99,14 +99,14 @@ trivial_memchr_user ( userptr_t buffer, off_t offset, int c, size_t len ) {
#define PROVIDE_UACCESS_INLINE( _subsys, _api_func ) \ #define PROVIDE_UACCESS_INLINE( _subsys, _api_func ) \
PROVIDE_SINGLE_API_INLINE ( UACCESS_PREFIX_ ## _subsys, _api_func ) PROVIDE_SINGLE_API_INLINE ( UACCESS_PREFIX_ ## _subsys, _api_func )
static inline __always_inline userptr_t static inline __always_inline void *
UACCESS_INLINE ( flat, phys_to_user ) ( unsigned long phys_addr ) { UACCESS_INLINE ( flat, phys_to_virt ) ( physaddr_t phys ) {
return ( ( userptr_t ) phys_addr ); return ( ( void * ) phys );
} }
static inline __always_inline unsigned long static inline __always_inline physaddr_t
UACCESS_INLINE ( flat, user_to_phys ) ( userptr_t userptr, off_t offset ) { UACCESS_INLINE ( flat, virt_to_phys ) ( volatile const void *virt ) {
return ( ( unsigned long ) ( userptr + offset ) ); return ( ( physaddr_t ) virt );
} }
static inline __always_inline userptr_t static inline __always_inline userptr_t
@@ -126,23 +126,6 @@ UACCESS_INLINE ( flat, memchr_user ) ( userptr_t buffer, off_t offset,
/* Include all architecture-dependent user access API headers */ /* Include all architecture-dependent user access API headers */
#include <bits/uaccess.h> #include <bits/uaccess.h>
/**
* Convert physical address to user pointer
*
* @v phys_addr Physical address
* @ret userptr User pointer
*/
userptr_t phys_to_user ( unsigned long phys_addr );
/**
* Convert user pointer to physical address
*
* @v userptr User pointer
* @v offset Offset from user pointer
* @ret phys_addr Physical address
*/
unsigned long user_to_phys ( userptr_t userptr, off_t offset );
/** /**
* Convert virtual address to user pointer * Convert virtual address to user pointer
* *
@@ -154,25 +137,21 @@ userptr_t virt_to_user ( volatile const void *addr );
/** /**
* Convert virtual address to a physical address * Convert virtual address to a physical address
* *
* @v addr Virtual address * @v virt Virtual address
* @ret phys_addr Physical address * @ret phys Physical address
*/ */
static inline __always_inline unsigned long physaddr_t __attribute__ (( const ))
virt_to_phys ( volatile const void *addr ) { virt_to_phys ( volatile const void *virt );
return user_to_phys ( virt_to_user ( addr ), 0 );
}
/** /**
* Convert physical address to a virtual address * Convert physical address to a virtual address
* *
* @v addr Virtual address * @v phys Physical address
* @ret phys_addr Physical address * @ret virt Virtual address
* *
* This operation is not available under all memory models. * This operation is not available under all memory models.
*/ */
static inline __always_inline void * phys_to_virt ( unsigned long phys_addr ) { void * __attribute__ (( const )) phys_to_virt ( physaddr_t phys );
return ( phys_to_user ( phys_addr ) );
}
/** /**
* Copy data to user buffer * Copy data to user buffer

View File

@@ -48,7 +48,7 @@ static userptr_t efi_find_rsdt ( void ) {
/* Locate RSDT via ACPI configuration table, if available */ /* Locate RSDT via ACPI configuration table, if available */
if ( rsdp ) if ( rsdp )
return phys_to_user ( rsdp->RsdtAddress ); return phys_to_virt ( rsdp->RsdtAddress );
return UNULL; return UNULL;
} }

View File

@@ -583,7 +583,7 @@ static int efifb_init ( struct console_configuration *config ) {
mode, efifb.pixel.width, efifb.pixel.height, bpp, efifb.start ); mode, efifb.pixel.width, efifb.pixel.height, bpp, efifb.start );
/* Initialise frame buffer console */ /* Initialise frame buffer console */
if ( ( rc = fbcon_init ( &efifb.fbcon, phys_to_user ( efifb.start ), if ( ( rc = fbcon_init ( &efifb.fbcon, phys_to_virt ( efifb.start ),
&efifb.pixel, &efifb.map, &efifb.font, &efifb.pixel, &efifb.map, &efifb.font,
config ) ) != 0 ) config ) ) != 0 )
goto err_fbcon_init; goto err_fbcon_init;

View File

@@ -48,27 +48,27 @@ static int efi_find_smbios ( struct smbios *smbios ) {
/* Use 64-bit table if present */ /* Use 64-bit table if present */
if ( smbios3_entry && ( smbios3_entry->signature == SMBIOS3_SIGNATURE ) ) { if ( smbios3_entry && ( smbios3_entry->signature == SMBIOS3_SIGNATURE ) ) {
smbios->address = phys_to_user ( smbios3_entry->smbios_address ); smbios->address = phys_to_virt ( smbios3_entry->smbios_address );
smbios->len = smbios3_entry->smbios_len; smbios->len = smbios3_entry->smbios_len;
smbios->count = 0; smbios->count = 0;
smbios->version = smbios->version =
SMBIOS_VERSION ( smbios3_entry->major, smbios3_entry->minor ); SMBIOS_VERSION ( smbios3_entry->major, smbios3_entry->minor );
DBG ( "Found 64-bit SMBIOS v%d.%d entry point at %p (%lx+%zx)\n", DBG ( "Found 64-bit SMBIOS v%d.%d entry point at %p (%lx+%zx)\n",
smbios3_entry->major, smbios3_entry->minor, smbios3_entry, smbios3_entry->major, smbios3_entry->minor, smbios3_entry,
user_to_phys ( smbios->address, 0 ), smbios->len ); virt_to_phys ( smbios->address ), smbios->len );
return 0; return 0;
} }
/* Otherwise, use 32-bit table if present */ /* Otherwise, use 32-bit table if present */
if ( smbios_entry && ( smbios_entry->signature == SMBIOS_SIGNATURE ) ) { if ( smbios_entry && ( smbios_entry->signature == SMBIOS_SIGNATURE ) ) {
smbios->address = phys_to_user ( smbios_entry->smbios_address ); smbios->address = phys_to_virt ( smbios_entry->smbios_address );
smbios->len = smbios_entry->smbios_len; smbios->len = smbios_entry->smbios_len;
smbios->count = smbios_entry->smbios_count; smbios->count = smbios_entry->smbios_count;
smbios->version = smbios->version =
SMBIOS_VERSION ( smbios_entry->major, smbios_entry->minor ); SMBIOS_VERSION ( smbios_entry->major, smbios_entry->minor );
DBG ( "Found 32-bit SMBIOS v%d.%d entry point at %p (%lx+%zx)\n", DBG ( "Found 32-bit SMBIOS v%d.%d entry point at %p (%lx+%zx)\n",
smbios_entry->major, smbios_entry->minor, smbios_entry, smbios_entry->major, smbios_entry->minor, smbios_entry,
user_to_phys ( smbios->address, 0 ), smbios->len ); virt_to_phys ( smbios->address ), smbios->len );
return 0; return 0;
} }

View File

@@ -72,7 +72,7 @@ static userptr_t efi_urealloc ( userptr_t old_ptr, size_t new_size ) {
return UNULL; return UNULL;
} }
assert ( phys_addr != 0 ); assert ( phys_addr != 0 );
new_ptr = phys_to_user ( phys_addr + EFI_PAGE_SIZE ); new_ptr = phys_to_virt ( phys_addr + EFI_PAGE_SIZE );
copy_to_user ( new_ptr, -EFI_PAGE_SIZE, copy_to_user ( new_ptr, -EFI_PAGE_SIZE,
&new_size, sizeof ( new_size ) ); &new_size, sizeof ( new_size ) );
DBG ( "EFI allocated %d pages at %llx\n", DBG ( "EFI allocated %d pages at %llx\n",
@@ -90,7 +90,7 @@ static userptr_t efi_urealloc ( userptr_t old_ptr, size_t new_size ) {
memcpy ( new_ptr, old_ptr, memcpy ( new_ptr, old_ptr,
( (old_size < new_size) ? old_size : new_size ) ); ( (old_size < new_size) ? old_size : new_size ) );
old_pages = ( EFI_SIZE_TO_PAGES ( old_size ) + 1 ); old_pages = ( EFI_SIZE_TO_PAGES ( old_size ) + 1 );
phys_addr = user_to_phys ( old_ptr, -EFI_PAGE_SIZE ); phys_addr = virt_to_phys ( old_ptr - EFI_PAGE_SIZE );
if ( ( efirc = bs->FreePages ( phys_addr, old_pages ) ) != 0 ){ if ( ( efirc = bs->FreePages ( phys_addr, old_pages ) ) != 0 ){
rc = -EEFI ( efirc ); rc = -EEFI ( efirc );
DBG ( "EFI could not free %d pages at %llx: %s\n", DBG ( "EFI could not free %d pages at %llx: %s\n",

View File

@@ -277,7 +277,7 @@ int vmbus_establish_gpadl ( struct vmbus_device *vmdev, userptr_t data,
size_t len ) { size_t len ) {
struct hv_hypervisor *hv = vmdev->hv; struct hv_hypervisor *hv = vmdev->hv;
struct vmbus *vmbus = hv->vmbus; struct vmbus *vmbus = hv->vmbus;
physaddr_t addr = user_to_phys ( data, 0 ); physaddr_t addr = virt_to_phys ( data );
unsigned int pfn_count = hv_pfn_count ( addr, len ); unsigned int pfn_count = hv_pfn_count ( addr, len );
struct { struct {
struct vmbus_gpadl_header gpadlhdr; struct vmbus_gpadl_header gpadlhdr;

View File

@@ -27,6 +27,7 @@ FILE_LICENCE(GPL2_OR_LATER);
* *
*/ */
PROVIDE_UACCESS_INLINE(linux, user_to_phys); PROVIDE_UACCESS_INLINE(linux, phys_to_virt);
PROVIDE_UACCESS_INLINE(linux, virt_to_phys);
PROVIDE_UACCESS_INLINE(linux, virt_to_user); PROVIDE_UACCESS_INLINE(linux, virt_to_user);
PROVIDE_UACCESS_INLINE(linux, memchr_user); PROVIDE_UACCESS_INLINE(linux, memchr_user);

View File

@@ -86,14 +86,14 @@ int find_smbios_entry ( userptr_t start, size_t len,
if ( ( sum = smbios_checksum ( start, offset, if ( ( sum = smbios_checksum ( start, offset,
entry->len ) ) != 0 ) { entry->len ) ) != 0 ) {
DBG ( "SMBIOS at %08lx has bad checksum %02x\n", DBG ( "SMBIOS at %08lx has bad checksum %02x\n",
user_to_phys ( start, offset ), sum ); virt_to_phys ( start + offset ), sum );
continue; continue;
} }
/* Fill result structure */ /* Fill result structure */
DBG ( "Found SMBIOS v%d.%d entry point at %08lx\n", DBG ( "Found SMBIOS v%d.%d entry point at %08lx\n",
entry->major, entry->minor, entry->major, entry->minor,
user_to_phys ( start, offset ) ); virt_to_phys ( start + offset ) );
return 0; return 0;
} }
@@ -126,14 +126,14 @@ int find_smbios3_entry ( userptr_t start, size_t len,
if ( ( sum = smbios_checksum ( start, offset, if ( ( sum = smbios_checksum ( start, offset,
entry->len ) ) != 0 ) { entry->len ) ) != 0 ) {
DBG ( "SMBIOS3 at %08lx has bad checksum %02x\n", DBG ( "SMBIOS3 at %08lx has bad checksum %02x\n",
user_to_phys ( start, offset ), sum ); virt_to_phys ( start + offset ), sum );
continue; continue;
} }
/* Fill result structure */ /* Fill result structure */
DBG ( "Found SMBIOS3 v%d.%d entry point at %08lx\n", DBG ( "Found SMBIOS3 v%d.%d entry point at %08lx\n",
entry->major, entry->minor, entry->major, entry->minor,
user_to_phys ( start, offset ) ); virt_to_phys ( start + offset ) );
return 0; return 0;
} }