aboutsummaryrefslogtreecommitdiff
path: root/src/utils/gdt.h
blob: 85a75aa4c25c1c74f966d46557546818cc17a7fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#ifndef GDT_H
#define GDT_H

#include "types.h"

// Access byte
#define GDT_AC 1            // Access bit
#define GDT_RW 1 << 1       // Read/Write bit
#define GDT_DC 1 << 2       // Direction bit/Conforming bit
#define GDT_EXEC 1 << 3     // Executable bit
#define GDT_S 1 << 4        // Descriptor type
#define GDT_PRVL_0 0        // Privilege (from 0 to 3)
#define GDT_PRVL_1 1 << 5
#define GDT_PRVL_2 2 << 5
#define GDT_PRVL_3 3 << 5
#define GDT_PR 1 << 7       // Present Bit

// Flags
#define GDT_SZ 1 << 2       // Size bit
#define GDT_GR 1 << 3       // Granularity bit

typedef struct GDT_ENTRY {
  u32 base;
  u32 limit;
  u8 flags;
  u8 access;
} GDT_ENTRY;

struct GDT_REGISTER {
  u16 limit;
  u32 base;
} __attribute__((packed));

/**
 * Copy GDT in memory
 */
void gdt_memcpy();

/**
 * Write a GDT entry at address addr
 */
void gdt_write_entry(GDT_ENTRY entry, u32 addr);

#endif