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