diff options
author | Daniel Verkamp <daniel@drv.nu> | 2008-08-15 14:16:16 -0400 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2008-08-28 23:09:08 +0100 |
commit | aa2854437330161176435730c743c5387a95037f (patch) | |
tree | d44f09936e952570c2b9ecc0ccbf753b17507348 | |
parent | 2539f5fa4a2d9da5ee803fd99fd655b5d9abb3e7 (diff) | |
download | ipxe-aa2854437330161176435730c743c5387a95037f.tar.gz |
[librm] Add rm stack copying functions
-rwxr-xr-x | src/arch/i386/include/librm.h | 3 | ||||
-rwxr-xr-x | src/arch/i386/transitions/librm_mgmt.c | 45 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/arch/i386/include/librm.h b/src/arch/i386/include/librm.h index e9827de8a..07a85c590 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 000000000..59b2eabcb --- /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 <mbrown@fensystems.co.uk>
+ *
+ */
+
+#include <stdint.h>
+#include <librm.h>
+
+/*
+ * 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;
+};
|