[comboot] Remove userptr_t from COM32 API implementation

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-04-29 00:24:55 +01:00
parent f001e61a68
commit c9fb94dbaa
3 changed files with 22 additions and 21 deletions

View File

@@ -188,8 +188,8 @@ extern const uint16_t __text16 ( rm_cs );
extern const uint16_t __text16 ( rm_ds ); extern const uint16_t __text16 ( rm_ds );
#define rm_ds __use_text16 ( rm_ds ) #define rm_ds __use_text16 ( rm_ds )
extern uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ); extern uint16_t copy_to_rm_stack ( const void *data, size_t size );
extern void remove_user_from_rm_stack ( userptr_t data, size_t size ); extern void remove_from_rm_stack ( void *data, size_t size );
/* CODE_DEFAULT: restore default .code32/.code64 directive */ /* CODE_DEFAULT: restore default .code32/.code64 directive */
#ifdef __x86_64__ #ifdef __x86_64__

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_virt ( inregs_phys ), memcpy ( &com32_regs, phys_to_virt ( inregs_phys ),
sizeof ( com32sys_t ) ); sizeof ( com32sys_t ) );
com32_int_vector = interrupt; com32_int_vector = interrupt;
@@ -108,7 +108,7 @@ void __asmcall com32_intcall ( uint8_t interrupt, physaddr_t inregs_phys, physad
if ( outregs_phys ) { if ( outregs_phys ) {
memcpy ( phys_to_virt ( outregs_phys ), memcpy ( phys_to_virt ( outregs_phys ),
virt_to_user ( &com32_regs ), sizeof ( com32sys_t ) ); &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_virt ( inregs_phys ), memcpy ( &com32_regs, phys_to_virt ( inregs_phys ),
sizeof ( com32sys_t ) ); sizeof ( com32sys_t ) );
com32_farcall_proc = proc; com32_farcall_proc = proc;
@@ -168,7 +168,7 @@ void __asmcall com32_farcall ( uint32_t proc, physaddr_t inregs_phys, physaddr_t
if ( outregs_phys ) { if ( outregs_phys ) {
memcpy ( phys_to_virt ( outregs_phys ), memcpy ( phys_to_virt ( outregs_phys ),
virt_to_user ( &com32_regs ), sizeof ( com32sys_t ) ); &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_virt ( stack ), stacksz ); copy_to_rm_stack ( phys_to_virt ( stack ), stacksz );
com32_farcall_proc = proc; com32_farcall_proc = proc;
__asm__ __volatile__ ( __asm__ __volatile__ (
@@ -190,7 +190,7 @@ int __asmcall com32_cfarcall ( uint32_t proc, physaddr_t stack, size_t stacksz )
: :
: "ecx", "edx" ); : "ecx", "edx" );
remove_user_from_rm_stack ( 0, stacksz ); remove_from_rm_stack ( NULL, stacksz );
return eax; return eax;
} }

View File

@@ -58,35 +58,36 @@ static struct profiler timer_irq_profiler __profiler = { .name = "irq.timer" };
static struct profiler other_irq_profiler __profiler = { .name = "irq.other" }; static struct profiler other_irq_profiler __profiler = { .name = "irq.other" };
/** /**
* Allocate space on the real-mode stack and copy data there from a * Allocate space on the real-mode stack and copy data there
* user buffer
* *
* @v data User buffer * @v data Stack data
* @v size Size of stack data * @v size Size of stack data
* @ret sp New value of real-mode stack pointer * @ret sp New value of real-mode stack pointer
*/ */
uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) { uint16_t copy_to_rm_stack ( const void *data, size_t size ) {
userptr_t rm_stack; void *rm_stack;
rm_sp -= size; rm_sp -= size;
rm_stack = real_to_virt ( rm_ss, rm_sp ); rm_stack = real_to_virt ( rm_ss, rm_sp );
memcpy ( rm_stack, data, size ); memcpy ( rm_stack, data, size );
return rm_sp; return rm_sp;
}; }
/** /**
* Deallocate space on the real-mode stack, optionally copying back * Deallocate space on the real-mode stack, optionally copying back data
* data to a user buffer.
* *
* @v data User buffer * @v data Stack data buffer, or NULL
* @v size Size of stack data * @v size Size of stack data
*/ */
void remove_user_from_rm_stack ( userptr_t data, size_t size ) { void remove_from_rm_stack ( void *data, size_t size ) {
const void *rm_stack;
if ( data ) { if ( data ) {
userptr_t rm_stack = real_to_virt ( rm_ss, rm_sp ); rm_stack = real_to_virt ( rm_ss, rm_sp );
memcpy ( rm_stack, data, size ); memcpy ( data, rm_stack, size );
} }
rm_sp += size; rm_sp += size;
}; }
/** /**
* Set interrupt vector * Set interrupt vector