[librm] Add rm stack copying functions
[people/mcb30/gpxe.git] / src / arch / i386 / transitions / librm_mgmt.c
1 /*\r
2  * librm: a library for interfacing to real-mode code\r
3  *\r
4  * Michael Brown <mbrown@fensystems.co.uk>\r
5  *\r
6  */\r
7 \r
8 #include <stdint.h>\r
9 #include <librm.h>\r
10 \r
11 /*\r
12  * This file provides functions for managing librm.\r
13  *\r
14  */\r
15 \r
16 /**\r
17  * Allocate space on the real-mode stack and copy data there from a\r
18  * user buffer\r
19  *\r
20  * @v data                      User buffer\r
21  * @v size                      Size of stack data\r
22  * @ret sp                      New value of real-mode stack pointer\r
23  */\r
24 uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) {\r
25         userptr_t rm_stack;\r
26         rm_sp -= size;\r
27         rm_stack = real_to_user ( rm_ss, rm_sp );\r
28         memcpy_user ( rm_stack, 0, data, 0, size );\r
29         return rm_sp;\r
30 };\r
31 \r
32 /**\r
33  * Deallocate space on the real-mode stack, optionally copying back\r
34  * data to a user buffer.\r
35  *\r
36  * @v data                      User buffer\r
37  * @v size                      Size of stack data\r
38  */\r
39 void remove_user_from_rm_stack ( userptr_t data, size_t size ) {\r
40         if ( data ) {\r
41                 userptr_t rm_stack = real_to_user ( rm_ss, rm_sp );\r
42                 memcpy_user ( rm_stack, 0, data, 0, size );\r
43         }\r
44         rm_sp += size;\r
45 };\r