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