xref: /titanic_51/usr/src/grub/grub-0.97/netboot/segoff.h (revision 1b8adde7ba7d5e04395c141c5400dc2cffd7d809)
1*1b8adde7SWilliam Kucharski /*
2*1b8adde7SWilliam Kucharski  * Segment:offset types and macros
3*1b8adde7SWilliam Kucharski  *
4*1b8adde7SWilliam Kucharski  * Initially written by Michael Brown (mcb30).
5*1b8adde7SWilliam Kucharski  */
6*1b8adde7SWilliam Kucharski 
7*1b8adde7SWilliam Kucharski #ifndef SEGOFF_H
8*1b8adde7SWilliam Kucharski #define SEGOFF_H
9*1b8adde7SWilliam Kucharski 
10*1b8adde7SWilliam Kucharski #include <stdint.h>
11*1b8adde7SWilliam Kucharski #include <io.h>
12*1b8adde7SWilliam Kucharski 
13*1b8adde7SWilliam Kucharski /* Segment:offset structure.  Note that the order within the structure
14*1b8adde7SWilliam Kucharski  * is offset:segment.
15*1b8adde7SWilliam Kucharski  */
16*1b8adde7SWilliam Kucharski typedef struct {
17*1b8adde7SWilliam Kucharski 	uint16_t offset;
18*1b8adde7SWilliam Kucharski 	uint16_t segment;
19*1b8adde7SWilliam Kucharski } segoff_t;
20*1b8adde7SWilliam Kucharski 
21*1b8adde7SWilliam Kucharski /* For PXE stuff */
22*1b8adde7SWilliam Kucharski typedef segoff_t SEGOFF16_t;
23*1b8adde7SWilliam Kucharski 
24*1b8adde7SWilliam Kucharski /* Macros for converting from virtual to segment:offset addresses,
25*1b8adde7SWilliam Kucharski  * when we don't actually care which of the many isomorphic results we
26*1b8adde7SWilliam Kucharski  * get.
27*1b8adde7SWilliam Kucharski  */
28*1b8adde7SWilliam Kucharski #ifdef DEBUG_SEGMENT
29*1b8adde7SWilliam Kucharski uint16_t SEGMENT ( const void * const ptr ) {
30*1b8adde7SWilliam Kucharski 	uint32_t phys = virt_to_phys ( ptr );
31*1b8adde7SWilliam Kucharski 	if ( phys > 0xfffff ) {
32*1b8adde7SWilliam Kucharski 		printf ( "FATAL ERROR: segment address out of range\n" );
33*1b8adde7SWilliam Kucharski 	}
34*1b8adde7SWilliam Kucharski 	return phys >> 4;
35*1b8adde7SWilliam Kucharski }
36*1b8adde7SWilliam Kucharski #else
37*1b8adde7SWilliam Kucharski #define SEGMENT(x) ( virt_to_phys ( x ) >> 4 )
38*1b8adde7SWilliam Kucharski #endif
39*1b8adde7SWilliam Kucharski #define OFFSET(x) ( virt_to_phys ( x ) & 0xf )
40*1b8adde7SWilliam Kucharski #define SEGOFF(x) { OFFSET(x), SEGMENT(x) }
41*1b8adde7SWilliam Kucharski #define VIRTUAL(x,y) ( phys_to_virt ( ( ( x ) << 4 ) + ( y ) ) )
42*1b8adde7SWilliam Kucharski 
43*1b8adde7SWilliam Kucharski #endif /* SEGOFF_H */
44