[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 );
#define rm_ds __use_text16 ( rm_ds )
extern uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size );
extern void remove_user_from_rm_stack ( userptr_t data, size_t size );
extern uint16_t copy_to_rm_stack ( const void *data, size_t size );
extern void remove_from_rm_stack ( void *data, size_t size );
/* CODE_DEFAULT: restore default .code32/.code64 directive */
#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",
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 ) );
com32_int_vector = interrupt;
@@ -108,7 +108,7 @@ void __asmcall com32_intcall ( uint8_t interrupt, physaddr_t inregs_phys, physad
if ( 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",
( 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 ) );
com32_farcall_proc = proc;
@@ -168,7 +168,7 @@ void __asmcall com32_farcall ( uint32_t proc, physaddr_t inregs_phys, physaddr_t
if ( 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",
( 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;
__asm__ __volatile__ (
@@ -190,7 +190,7 @@ int __asmcall com32_cfarcall ( uint32_t proc, physaddr_t stack, size_t stacksz )
:
: "ecx", "edx" );
remove_user_from_rm_stack ( 0, stacksz );
remove_from_rm_stack ( NULL, stacksz );
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" };
/**
* Allocate space on the real-mode stack and copy data there from a
* user buffer
* Allocate space on the real-mode stack and copy data there
*
* @v data User buffer
* @v data Stack data
* @v size Size of stack data
* @ret sp New value of real-mode stack pointer
*/
uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) {
userptr_t rm_stack;
uint16_t copy_to_rm_stack ( const void *data, size_t size ) {
void *rm_stack;
rm_sp -= size;
rm_stack = real_to_virt ( rm_ss, rm_sp );
memcpy ( rm_stack, data, size );
return rm_sp;
};
}
/**
* Deallocate space on the real-mode stack, optionally copying back
* data to a user buffer.
* Deallocate space on the real-mode stack, optionally copying back data
*
* @v data User buffer
* @v data Stack data buffer, or NULL
* @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 ) {
userptr_t rm_stack = real_to_virt ( rm_ss, rm_sp );
memcpy ( rm_stack, data, size );
rm_stack = real_to_virt ( rm_ss, rm_sp );
memcpy ( data, rm_stack, size );
}
rm_sp += size;
};
}
/**
* Set interrupt vector