/* * General data structures and routines for segmentation * Copyright (c) 2001, David H. Hovemeyer * $Revision: 1.1 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". */ /* * Source: _Protected Mode Software Architecture_ by Tom Shanley, * ISBN 020155447X. */ #ifndef GEEKOS_SEGMENT_H #define GEEKOS_SEGMENT_H #include struct TSS; #if __TINYC__ #define PACKED #else #define PACKED __attribute__((packed)) #endif /* * The general format of a segment descriptor. */ struct Segment_Descriptor { ushort_t sizeLow PACKED ; uint_t baseLow : 24 PACKED ; uint_t type : 4 PACKED ; uint_t system : 1 PACKED ; uint_t dpl : 2 PACKED ; uint_t present : 1 PACKED ; uint_t sizeHigh : 4 PACKED ; uint_t avail : 1 PACKED ; uint_t reserved : 1 PACKED ; /* set to zero */ uint_t dbBit : 1 PACKED ; uint_t granularity : 1 PACKED ; uchar_t baseHigh PACKED ; }; /** * Construct a segment selector. * @param rpl requestor privilege level; should be KERNEL_PRIVILEGE * for kernel segments and USER_PRIVILEGE for user segments * @param segmentIsInGDT true if the referenced segment descriptor * is defined in the GDT, false if it is defined in the LDT * @param index index of the segment descriptor * @return the segment selector */ static __inline__ ushort_t Selector(int rpl, bool segmentIsInGDT, int index) { ushort_t selector = 0; selector = (rpl & 0x3) | ((segmentIsInGDT ? 0 : 1) << 2) | ((index & 0x1FFF) << 3); return selector; } /* * Routines to initialize segment descriptors. * Code and data segments must start on a page-aligned address * and are sized in pages. */ void Init_Null_Segment_Descriptor(struct Segment_Descriptor* desc); void Init_Code_Segment_Descriptor( struct Segment_Descriptor* desc, ulong_t baseAddr, ulong_t numPages, int privilegeLevel ); void Init_Data_Segment_Descriptor( struct Segment_Descriptor* desc, ulong_t baseAddr, ulong_t numPages, int privilegeLevel ); void Init_TSS_Descriptor(struct Segment_Descriptor* desc, struct TSS* theTSS); void Init_LDT_Descriptor( struct Segment_Descriptor* desc, struct Segment_Descriptor theLDT[], int numEntries ); #endif /* GEEKOS_SEGMENT_H */