summaryrefslogtreecommitdiff
path: root/src/aplos.h
blob: bed0d7a3d258c828f0a0cf72ce4827e24473781d (plain) (blame)
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <stdint.h>
#include <stddef.h>
#include <stdarg.h>
#include <uchar.h>

#define PAGE_SIZE 4096

#define nelem(arr) (sizeof(arr)/sizeof(*(arr)))

struct framebuffer
{
	void *addr;
	uint64_t width;
	uint64_t height;
	uint64_t pitch;
};

struct memmap
{
	uintptr_t start;
	uint64_t size;
};

struct ioapic_info
{
	uint32_t base;
	uint32_t interrupt_base;
};

struct boot_info
{
	struct framebuffer framebuffer;
	struct ioapic_info ioapic;
	uint64_t memmap_count;
	struct memmap *memmaps;
	uint64_t physbase;
	uint64_t rsdp;
};

struct cpu_regs
{
	/* Keep this in sync with dump_regs in nasty.S */
	uint64_t rax;
	uint64_t rbx;
	uint64_t rcx;
	uint64_t rdx;
	uint64_t rsi;
	uint64_t rdi;
	uint64_t rsp;
	uint64_t rbp;
	uint64_t r8;
	uint64_t r9;
	uint64_t r10;
	uint64_t r11;
	uint64_t r12;
	uint64_t r13;
	uint64_t r14;
	uint64_t r15;
	uint64_t rip;
	uint64_t rflags;
	uint64_t cr0;
	uint64_t cr2;
	uint64_t cr3;
	uint64_t cr4;
	uint64_t cr8;
	uint16_t cs;
	uint16_t ds;
	uint16_t ss;
	uint16_t es;
	uint16_t fs;
	uint16_t gs;
};

struct ioapic_redirection
{
	uint8_t vector;
	uint8_t delivery_mode;
	uint8_t destination_mode;
	uint8_t delivery_status;
	uint8_t pin_polarity;
	uint8_t remote_irr;
	uint8_t trigger_mode;
	uint8_t mask;
	uint8_t destination;

	uint64_t reserved;
};

/* acpi.c */
void setup_acpi(uint64_t, struct ioapic_info *);

/* apic.c */
void setup_apic(struct ioapic_info *);
void apic_end_of_interrupt(void);
struct ioapic_redirection read_redirection(uint8_t);
void write_redirection(uint8_t, struct ioapic_redirection);

/* boot.c */
uint64_t cpu_count(void);
uint8_t boot_apic_id(void);

/* descriptors */
void setup_descriptors(void);

/* error.c */
void assert(bool);

/* font.c */
void font_init(void);
void font_draw(char8_t *, uint32_t, uint32_t, uint32_t, uint32_t);

/* keyboard.c */
void setup_keyboard(void);
bool keyboard_interrupt_handler(uint32_t);

/* main.c */
void main(struct boot_info *);

/* nasty.S */
struct table_reg;
[[noreturn]] void halt(void);
void disable_interrupts(void);
void enable_interrupts(void);
void set_gdt(struct table_reg *, uint64_t, uint64_t, uint64_t);
void set_idt(struct table_reg *);
uint64_t get_cr2(void);
uint64_t get_cr3(void);
extern void (*isr_stubs[33])(void);
void dump_regs(struct cpu_regs *);
uint64_t get_msr(uint32_t);
uint8_t in_uint8(uint8_t);

/* paging.c */
void setup_paging(struct boot_info *);
bool page_fault_handler(uint32_t);
uint64_t map_page(uint64_t, uint64_t, bool);

/* panic.c */
[[noreturn]] void panic(void);

/* screen.c */
void screen_init(struct framebuffer *);
void screen_draw_pixel(uint32_t, uint32_t, uint32_t);
void print(char8_t *, ...);

/* utf8.c */
int utf8_char_length(const char8_t *);
int utf8_cmp_n(const char8_t *, const char8_t *, uint64_t);
uint32_t utf8_value(const char8_t *);

/* util.c */
uint16_t read_uint16_le(const uint8_t *);
uint16_t read_uint16_be(const uint8_t *);
uint32_t read_uint32_le(const uint8_t *);
void write_uint16_le(uint8_t *, uint16_t);
void write_uint32_le(uint8_t *, uint32_t);
void write_uint64_le(uint8_t *, uint64_t);
int memcmp(const void *, const void *, size_t);
void memset(void *, uint8_t, size_t);
void memcpy(void *, void *, size_t);