2 * General data structures and routines for segmentation
3 * Copyright (c) 2001, David H. Hovemeyer <daveho@cs.umd.edu>
6 * This is free software. You are permitted to use,
7 * redistribute, and modify it as specified in the file "COPYING".
11 * Source: _Protected Mode Software Architecture_ by Tom Shanley,
15 #ifndef GEEKOS_SEGMENT_H
16 #define GEEKOS_SEGMENT_H
18 #include <geekos/ktypes.h>
23 * The general format of a segment descriptor.
25 struct Segment_Descriptor {
34 uint_t reserved : 1; /* set to zero */
36 uint_t granularity : 1;
38 } __attribute__((packed));
41 * Construct a segment selector.
42 * @param rpl requestor privilege level; should be KERNEL_PRIVILEGE
43 * for kernel segments and USER_PRIVILEGE for user segments
44 * @param segmentIsInGDT true if the referenced segment descriptor
45 * is defined in the GDT, false if it is defined in the LDT
46 * @param index index of the segment descriptor
47 * @return the segment selector
49 static __inline__ ushort_t Selector(int rpl, bool segmentIsInGDT, int index)
51 ushort_t selector = 0;
52 selector = (rpl & 0x3) | ((segmentIsInGDT ? 0 : 1) << 2) | ((index & 0x1FFF) << 3);
57 * Routines to initialize segment descriptors.
58 * Code and data segments must start on a page-aligned address
59 * and are sized in pages.
62 void Init_Null_Segment_Descriptor(struct Segment_Descriptor* desc);
64 void Init_Code_Segment_Descriptor(
65 struct Segment_Descriptor* desc,
70 void Init_Data_Segment_Descriptor(
71 struct Segment_Descriptor* desc,
76 void Init_TSS_Descriptor(struct Segment_Descriptor* desc, struct TSS* theTSS);
78 void Init_LDT_Descriptor(
79 struct Segment_Descriptor* desc,
80 struct Segment_Descriptor theLDT[],
84 #endif /* GEEKOS_SEGMENT_H */