d0ff4ea59e6bf407d4f22449f860fb3bac92dccd
[people/pcmattman/gpxe.git] / src / arch / i386 / transitions / librm_mgmt.c
1 /*
2  * librm: a library for interfacing to real-mode code
3  *
4  * Michael Brown <mbrown@fensystems.co.uk>
5  *
6  */
7
8 #ifdef KEEP_IT_REAL
9 /* Build a null object under -DKEEP_IT_REAL */
10 #else
11
12 #include <stdint.h>
13 #include <librm.h>
14
15 /*
16  * This file provides functions for managing librm.
17  *
18  */
19
20 /*
21  * Allocate space on the real-mode stack and copy data there.
22  *
23  */
24 uint16_t copy_to_rm_stack ( void *data, size_t size ) {
25 #ifdef DEBUG_LIBRM
26         if ( rm_sp <= size ) {
27                 printf ( "librm: out of space in RM stack\n" );
28                 lockup();
29         }
30 #endif
31         rm_sp -= size;
32         copy_to_real ( rm_ss, rm_sp, data, size );
33         return rm_sp;
34 };
35
36 /*
37  * Deallocate space on the real-mode stack, optionally copying back
38  * data.
39  *
40  */
41 void remove_from_rm_stack ( void *data, size_t size ) {
42         if ( data ) {
43                 copy_from_real ( data, rm_ss, rm_sp, size );
44         }
45         rm_sp += size;
46 };
47
48 #endif /* KEEP_IT_REAL */