From aa2854437330161176435730c743c5387a95037f Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Fri, 15 Aug 2008 14:16:16 -0400 Subject: [librm] Add rm stack copying functions --- src/arch/i386/include/librm.h | 3 +++ src/arch/i386/transitions/librm_mgmt.c | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100755 src/arch/i386/transitions/librm_mgmt.c diff --git a/src/arch/i386/include/librm.h b/src/arch/i386/include/librm.h index e9827de8..07a85c59 100755 --- a/src/arch/i386/include/librm.h +++ b/src/arch/i386/include/librm.h @@ -279,6 +279,9 @@ user_to_phys ( userptr_t buffer, off_t offset ) { return virt_to_phys ( ( void * ) buffer + offset ); } +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 ); + /* TEXT16_CODE: declare a fragment of code that resides in .text16 */ #define TEXT16_CODE( asm_code_str ) \ ".section \".text16\", \"ax\", @progbits\n\t" \ diff --git a/src/arch/i386/transitions/librm_mgmt.c b/src/arch/i386/transitions/librm_mgmt.c new file mode 100755 index 00000000..59b2eabc --- /dev/null +++ b/src/arch/i386/transitions/librm_mgmt.c @@ -0,0 +1,45 @@ +/* + * librm: a library for interfacing to real-mode code + * + * Michael Brown + * + */ + +#include +#include + +/* + * This file provides functions for managing librm. + * + */ + +/** + * Allocate space on the real-mode stack and copy data there from a + * user buffer + * + * @v data User buffer + * @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; + rm_sp -= size; + rm_stack = real_to_user ( rm_ss, rm_sp ); + memcpy_user ( rm_stack, 0, data, 0, size ); + return rm_sp; +}; + +/** + * Deallocate space on the real-mode stack, optionally copying back + * data to a user buffer. + * + * @v data User buffer + * @v size Size of stack data + */ +void remove_user_from_rm_stack ( userptr_t data, size_t size ) { + if ( data ) { + userptr_t rm_stack = real_to_user ( rm_ss, rm_sp ); + memcpy_user ( rm_stack, 0, data, 0, size ); + } + rm_sp += size; +}; -- cgit v1.2.3-55-g7522