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.COMuint16_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