[librm] Add rm stack copying functions
authorDaniel Verkamp <daniel@drv.nu>
Fri, 15 Aug 2008 18:16:16 +0000 (14:16 -0400)
committerMichael Brown <mcb30@etherboot.org>
Thu, 28 Aug 2008 22:09:08 +0000 (23:09 +0100)
src/arch/i386/include/librm.h
src/arch/i386/transitions/librm_mgmt.c [new file with mode: 0755]

index e9827de..07a85c5 100755 (executable)
@@ -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 (executable)
index 0000000..59b2eab
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * librm: a library for interfacing to real-mode code\r
+ *\r
+ * Michael Brown <mbrown@fensystems.co.uk>\r
+ *\r
+ */\r
+\r
+#include <stdint.h>\r
+#include <librm.h>\r
+\r
+/*\r
+ * This file provides functions for managing librm.\r
+ *\r
+ */\r
+\r
+/**\r
+ * Allocate space on the real-mode stack and copy data there from a\r
+ * user buffer\r
+ *\r
+ * @v data                     User buffer\r
+ * @v size                     Size of stack data\r
+ * @ret sp                     New value of real-mode stack pointer\r
+ */\r
+uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) {\r
+       userptr_t rm_stack;\r
+       rm_sp -= size;\r
+       rm_stack = real_to_user ( rm_ss, rm_sp );\r
+       memcpy_user ( rm_stack, 0, data, 0, size );\r
+       return rm_sp;\r
+};\r
+\r
+/**\r
+ * Deallocate space on the real-mode stack, optionally copying back\r
+ * data to a user buffer.\r
+ *\r
+ * @v data                     User buffer\r
+ * @v size                     Size of stack data\r
+ */\r
+void remove_user_from_rm_stack ( userptr_t data, size_t size ) {\r
+       if ( data ) {\r
+               userptr_t rm_stack = real_to_user ( rm_ss, rm_sp );\r
+               memcpy_user ( rm_stack, 0, data, 0, size );\r
+       }\r
+       rm_sp += size;\r
+};\r