/*
 * @author  xamidev <xamidev@riseup.net>
 * @brief   Global Descriptor Table
 * @license GPL-3.0-only
 */

#ifndef GDT_H
#define GDT_H

#include <stdint.h>

// We're using the GDT for segmentation, but as we want to target Long Mode,
// we'll only use this as a requirement for paging, not more.
// This means base 0 and no limit (whole address space)

#define NUM_GDT_ENTRIES 7

#define NULL_SELECTOR 0x00
#define KERNEL_CODE_SEGMENT 0x08
#define KERNEL_DATA_SEGMENT 0x10
#define USER_CODE_SEGMENT 0x18
#define USER_DATA_SEGMENT 0x20
#define TSS_SEGMENT 0x28

struct GDTR {
    uint16_t limit;
    uint64_t address;
} __attribute__((packed));

struct tss {
    uint32_t reserved0;
    uint64_t rsp0;
    uint64_t rsp1;
    uint64_t rsp2;
    uint64_t reserved1;
    uint64_t ist[7];
    uint64_t reserved2;
    uint16_t reserved3;
    uint16_t iopb;
} __attribute__((packed));

void gdt_init(void);

#endif