/* * 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; /* * The general format of a segment descriptor. */ struct Segment_Descriptor { ushort_t sizeLow; uint_t baseLow : 24; uint_t type : 4; uint_t system : 1; uint_t dpl : 2; uint_t present : 1; uint_t sizeHigh : 4; uint_t avail : 1; uint_t reserved : 1; /* set to zero */ uint_t dbBit : 1; uint_t granularity : 1; uchar_t baseHigh ; } __attribute__((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 */