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