mirror of
https://github.com/ipxe/ipxe
synced 2025-12-15 00:12:19 +03:00
[comboot] Remove userptr_t from COM32 API implementation
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -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__
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user