d641869f85f948ce1443d950bbf65f7e61d4999f
[people/balajirrao/gpxe.git] / src / arch / i386 / include / realmode.h
1 #ifndef REALMODE_H
2 #define REALMODE_H
3
4 #ifndef ASSEMBLY
5
6 #include "stdint.h"
7 #include "compiler.h"
8 #include "registers.h"
9 #include "io.h"
10
11 /*
12  * Data structures and type definitions
13  *
14  */
15
16 /* All i386 registers, as passed in by prot_call or kir_call */
17 struct real_mode_regs {
18         struct i386_all_regs;
19 } PACKED;
20
21 /* Segment:offset structure.  Note that the order within the structure
22  * is offset:segment.
23  */
24 typedef struct {
25         uint16_t offset;
26         uint16_t segment;
27 } segoff_t PACKED;
28
29 /* Macro hackery needed to stringify bits of inline assembly */
30 #define RM_XSTR(x) #x
31 #define RM_STR(x) RM_XSTR(x)
32
33 /* Drag in the selected real-mode transition library header */
34 #ifdef KEEP_IT_REAL
35 #include "libkir.h"
36 #else
37 #include "librm.h"
38 #endif
39
40 /*
41  * The API to some functions is identical between librm and libkir, so
42  * they are documented here, even though the prototypes are in librm.h
43  * and libkir.h.
44  *
45  */
46
47 /*
48  * void copy_to_real ( uint16_t dest_seg, uint16_t dest_off,
49  *                     void *src, size_t n )
50  * void copy_from_real ( void *dest, uint16_t src_seg, uint16_t src_off,
51  *                       size_t n )
52  *
53  * These functions can be used to copy data to and from arbitrary
54  * locations in base memory.
55  */
56
57 /*
58  * put_real ( variable, uint16_t dest_seg, uint16_t dest_off )
59  * get_real ( variable, uint16_t src_seg, uint16_t src_off )
60  *
61  * These macros can be used to read or write single variables to and
62  * from arbitrary locations in base memory.  "variable" must be a
63  * variable of either 1, 2 or 4 bytes in length.
64  */
65
66 /*
67  * REAL_CALL ( routine, num_out_constraints, out_constraints,
68  *             in_constraints, clobber )
69  * REAL_EXEC ( name, asm_code_str, num_out_constraints, out_constraints,
70  *             in_constraints, clobber )
71  *
72  * If you have a pre-existing real-mode routine that you want to make
73  * a far call to, use REAL_CALL.  If you have a code fragment that you
74  * want to copy down to base memory, execute, and then remove, use
75  * REAL_EXEC.
76  *
77  * out_constraints must be of the form OUT_CONSTRAINTS(constraints),
78  * and in_constraints must be of the form IN_CONSTRAINTS(constraints),
79  * where "constraints" is a constraints list as would be used in an
80  * inline __asm__()
81  *
82  * clobber must be of the form CLOBBER ( clobber_list ), where
83  * "clobber_list" is a clobber list as would be used in an inline
84  * __asm__().
85  *
86  * These are best illustrated by example.  To write a character to the
87  * console using INT 10, you would do something like:
88  *
89  *      REAL_EXEC ( rm_test_librm,
90  *                  "int $0x10",
91  *                  1,
92  *                  OUT_CONSTRAINTS ( "=a" ( discard ) ),
93  *                  IN_CONSTRAINTS ( "a" ( 0x0e00 + character ),
94  *                                   "b" ( 1 ) ),
95  *                  CLOBBER ( "ebx", "ecx", "edx", "ebp", "esi", "edi" ) );
96  *
97  * IMPORTANT: gcc does not automatically assume that input operands
98  * get clobbered.  The only way to specify that an input operand may
99  * be modified is to also specify it as an output operand; hence the
100  * "(discard)" in the above code.
101  */
102
103 #warning "realmode.h contains placeholders for obsolete macros"
104
105
106 /* Just for now */
107 #define SEGMENT(x) ( virt_to_phys ( x ) >> 4 )
108 #define OFFSET(x) ( virt_to_phys ( x ) & 0xf )
109 #define SEGOFF(x) { OFFSET(x), SEGMENT(x) }
110
111 /* To make basemem.c compile */
112 extern int lock_real_mode_stack;
113 extern char *real_mode_stack;
114 extern char real_mode_stack_size[];
115
116 #define RM_FRAGMENT(name,asm) \
117         void name ( void ) {} \
118         extern char name ## _size[];
119
120
121
122 #endif /* ASSEMBLY */
123
124 #endif /* REALMODE_H */