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