mirror of
https://github.com/ipxe/ipxe
synced 2025-12-17 01:52:08 +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 );
|
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__
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user