miniOS
x86_64 hobby kernel with SMP, VFS, and POSIX process model
Loading...
Searching...
No Matches
segment.h File Reference
#include <miniOS/types.h>
Include dependency graph for segment.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  segment_descriptor

Macros

#define KERN_PRIVILEGE_LEVEL   0
#define USER_PRIVILEGE_LEVEL   3
#define GDT_CS_TYPE   0x9A
#define GDT_DS_TYPE   0x92
#define GDT_TSS_TYPE   0x89
#define GDT_LDT_TYPE   0x82
#define USER_CS_TYPE   0xFA
#define USER_DS_TYPE   0xF2
#define GDT_CS_INDEX   1
#define GDT_DS_INDEX   2
#define USER_DS_INDEX   3
#define USER_CS_INDEX   4
#define GDT_TSS_INDEX   5
#define GDT_LDT_INDEX   6
#define KERNEL_CS_SEL   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_CS_INDEX) /* 0x08 */
#define KERNEL_SS_SEL   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_DS_INDEX) /* 0x10 */
#define USER_CS_SEL   SEG_REG_VAL(USER_PRIVILEGE_LEVEL, 0, USER_CS_INDEX) /* 0x23 */
#define USER_DS_SEL   SEG_REG_VAL(USER_PRIVILEGE_LEVEL, 0, USER_DS_INDEX) /* 0x1B */
#define RFLAGS_IF   0x202ULL
#define GDT_CS   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_CS_INDEX)
#define GDT_DS   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_DS_INDEX)
#define GDT_TSS   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_TSS_INDEX)
#define GDT_LDT   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_LDT_INDEX)
#define NR_LDT_ENTRIES   2
#define LDT_CS_INDEX   0
#define LDT_DS_INDEX   1
#define __BUILD_SEG_DESC(base_addr, limit, _access, _long_mode, _size, _granularity)
#define BUILD_SEG_DESC(base_addr, limit, access, long_mode, size)
#define BUILD_4KB_SEG_DESC(base_addr, limit, access, long_mode, size)
#define SEG_ADDR(seg_desc)
#define SEG_SIZE(seg_desc)
#define SEG_REG_VAL(privilege, in_ldt, segment_index)
#define SEG_REG_RPL(seg_reg_val)
#define restore_system_segments

Functions

struct segment_descriptor __attribute__ ((__packed__))

Variables

uint16_t limit_15_0
uint16_t base_addr_15_0
uint8_t base_addr_23_16
uint8_t access
uint8_t limit_19_16
uint8_t u
uint8_t long_mode
uint8_t size
uint8_t granularity
uint8_t base_addr_31_24

Macro Definition Documentation

◆ __BUILD_SEG_DESC

#define __BUILD_SEG_DESC ( base_addr,
limit,
_access,
_long_mode,
_size,
_granularity )
Value:
((struct segment_descriptor) { \
.limit_15_0 = (limit) & 0xffff, \
.limit_19_16 = ((limit) >> 16) & 0xf, \
.base_addr_15_0 = (base_addr) & 0xffff, \
.base_addr_23_16 = ((base_addr) >> 16) & 0xff, \
.base_addr_31_24 = ((base_addr) >> 24) & 0xff, \
.u = 0, \
.long_mode = (_long_mode), \
.size = (_size), \
.granularity = (_granularity), \
.access = (_access) \
})
Definition segment.h:99

◆ BUILD_4KB_SEG_DESC

#define BUILD_4KB_SEG_DESC ( base_addr,
limit,
access,
long_mode,
size )
Value:
__BUILD_SEG_DESC(base_addr, (limit >> 12), access, long_mode, size, 1)
uint16_t size
Definition irq.h:0
uint8_t long_mode
Definition segment.h:7
#define __BUILD_SEG_DESC(base_addr, limit, _access, _long_mode, _size, _granularity)
Definition segment.h:113
uint8_t access
Definition segment.h:4

◆ BUILD_SEG_DESC

#define BUILD_SEG_DESC ( base_addr,
limit,
access,
long_mode,
size )
Value:
__BUILD_SEG_DESC(base_addr, limit, access, long_mode, size, 0)

◆ GDT_CS

#define GDT_CS   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_CS_INDEX)

◆ GDT_CS_INDEX

#define GDT_CS_INDEX   1

◆ GDT_CS_TYPE

#define GDT_CS_TYPE   0x9A

◆ GDT_DS

#define GDT_DS   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_DS_INDEX)

◆ GDT_DS_INDEX

#define GDT_DS_INDEX   2

◆ GDT_DS_TYPE

#define GDT_DS_TYPE   0x92

◆ GDT_LDT

#define GDT_LDT   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_LDT_INDEX)

◆ GDT_LDT_INDEX

#define GDT_LDT_INDEX   6

◆ GDT_LDT_TYPE

#define GDT_LDT_TYPE   0x82

◆ GDT_TSS

#define GDT_TSS   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_TSS_INDEX)

◆ GDT_TSS_INDEX

#define GDT_TSS_INDEX   5

◆ GDT_TSS_TYPE

#define GDT_TSS_TYPE   0x89

◆ KERN_PRIVILEGE_LEVEL

#define KERN_PRIVILEGE_LEVEL   0

◆ KERNEL_CS_SEL

#define KERNEL_CS_SEL   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_CS_INDEX) /* 0x08 */

◆ KERNEL_SS_SEL

#define KERNEL_SS_SEL   SEG_REG_VAL(KERN_PRIVILEGE_LEVEL, 0, GDT_DS_INDEX) /* 0x10 */

◆ LDT_CS_INDEX

#define LDT_CS_INDEX   0

◆ LDT_DS_INDEX

#define LDT_DS_INDEX   1

◆ NR_LDT_ENTRIES

#define NR_LDT_ENTRIES   2

◆ restore_system_segments

#define restore_system_segments
Value:
pushq %rax; \
mov $GDT_DS, %ax; \
mov %ax, %ds; \
mov %ax, %es; \
mov %ax, %fs; \
mov %ax, %gs; \
popq %rax;
uint64_t rax
Definition context.h:0

◆ RFLAGS_IF

#define RFLAGS_IF   0x202ULL

◆ SEG_ADDR

#define SEG_ADDR ( seg_desc)
Value:
(((seg_desc)->base_addr_31_24 << 24) | \
((seg_desc)->base_addr_23_16 << 16) | \
(seg_desc)->base_15_0)

◆ SEG_REG_RPL

#define SEG_REG_RPL ( seg_reg_val)
Value:
((seg_reg_val) & 0x3)

◆ SEG_REG_VAL

#define SEG_REG_VAL ( privilege,
in_ldt,
segment_index )
Value:
(((segment_index) << 3) | ((in_ldt) << 2) | (privilege))

◆ SEG_SIZE

#define SEG_SIZE ( seg_desc)
Value:
((seg_desc)->granularity ? \
((((seg_desc)->limit_19_16 << 16) | (seg_desc)->limit_15_0) << 12) : \
(((seg_desc)->limit_19_16 << 16) | (seg_desc)->limit_15_0))

◆ USER_CS_INDEX

#define USER_CS_INDEX   4

◆ USER_CS_SEL

#define USER_CS_SEL   SEG_REG_VAL(USER_PRIVILEGE_LEVEL, 0, USER_CS_INDEX) /* 0x23 */

◆ USER_CS_TYPE

#define USER_CS_TYPE   0xFA

◆ USER_DS_INDEX

#define USER_DS_INDEX   3

◆ USER_DS_SEL

#define USER_DS_SEL   SEG_REG_VAL(USER_PRIVILEGE_LEVEL, 0, USER_DS_INDEX) /* 0x1B */

◆ USER_DS_TYPE

#define USER_DS_TYPE   0xF2

◆ USER_PRIVILEGE_LEVEL

#define USER_PRIVILEGE_LEVEL   3

Function Documentation

◆ __attribute__()

struct segment_descriptor __attribute__ ( (__packed__) )

Variable Documentation

◆ access

uint8_t access

◆ base_addr_15_0

uint16_t base_addr_15_0

◆ base_addr_23_16

uint8_t base_addr_23_16

◆ base_addr_31_24

uint8_t base_addr_31_24

◆ granularity

uint8_t granularity

◆ limit_15_0

uint16_t limit_15_0

◆ limit_19_16

uint8_t limit_19_16

◆ long_mode

uint8_t long_mode

◆ size

uint8_t size

◆ u