pactor64.h

Commit: 04a7ec25 Author: jokerz Raw Copy
1
/* ============================================================================
2
 * Pactor64 — Common Header for x86-64 Kernel
3
 * All types, port I/O, and function declarations
4
 * ============================================================================ */
5
#ifndef PACTOR64_H
6
#define PACTOR64_H
7
8
/* === Type Definitions === */
9
typedef unsigned char      uint8_t;
10
typedef unsigned short     uint16_t;
11
typedef unsigned int       uint32_t;
12
typedef unsigned long      uint64_t;
13
typedef signed char        int8_t;
14
typedef signed short       int16_t;
15
typedef signed int         int32_t;
16
typedef signed long        int64_t;
17
typedef unsigned long      size_t;
18
typedef signed long        ssize_t;
19
typedef unsigned long      uintptr_t;
20
21
#define NULL ((void *)0)
22
#define true  1
23
#define false 0
24
25
#define asm __asm__ volatile
26
27
/* === GCC Built-in va_list === */
28
typedef __builtin_va_list va_list;
29
#define va_start(v,l) __builtin_va_start(v,l)
30
#define va_end(v)     __builtin_va_end(v)
31
#define va_arg(v,t)   __builtin_va_arg(v,t)
32
33
/* === Port I/O === */
34
static inline void outb(uint16_t port, uint8_t val) {
35
    __asm__ volatile ("outb %0, %1" : : "a"(val), "Nd"(port));
36
}
37
static inline uint8_t inb(uint16_t port) {
38
    uint8_t val;
39
    __asm__ volatile ("inb %1, %0" : "=a"(val) : "Nd"(port));
40
    return val;
41
}
42
static inline void outw(uint16_t port, uint16_t val) {
43
    __asm__ volatile ("outw %0, %1" : : "a"(val), "Nd"(port));
44
}
45
static inline uint16_t inw(uint16_t port) {
46
    uint16_t val;
47
    __asm__ volatile ("inw %1, %0" : "=a"(val) : "Nd"(port));
48
    return val;
49
}
50
static inline void io_wait(void) {
51
    outb(0x80, 0);
52
}
53
static inline void cli(void) {
54
    __asm__ volatile ("cli");
55
}
56
static inline void sti(void) {
57
    __asm__ volatile ("sti");
58
}
59
static inline void hlt(void) {
60
    __asm__ volatile ("hlt");
61
}
62
63
/* === Serial (COM1) === */
64
#define COM1 0x3F8
65
66
void serial_init(void);
67
void serial_putc(char c);
68
void serial_puts(const char *s);
69
int  serial_getc(void);
70
int  serial_poll(void);
71
void serial_print_hex(uint64_t val);
72
void serial_print_dec(uint64_t val);
73
void kprintf(const char *fmt, ...);
74
75
/* === String Utilities (no libc) === */
76
int    kstrcmp(const char *a, const char *b);
77
int    kstrncmp(const char *a, const char *b, size_t n);
78
size_t kstrlen(const char *s);
79
void  *kmemset(void *dst, int c, size_t n);
80
void  *kmemcpy(void *dst, const void *src, size_t n);
81
82
/* === IDT === */
83
struct idt_entry {
84
    uint16_t offset_low;
85
    uint16_t selector;
86
    uint8_t  ist;
87
    uint8_t  type_attr;
88
    uint16_t offset_mid;
89
    uint32_t offset_high;
90
    uint32_t reserved;
91
} __attribute__((packed));
92
93
struct idtr {
94
    uint16_t limit;
95
    uint64_t base;
96
} __attribute__((packed));
97
98
typedef struct {
99
    uint64_t r15, r14, r13, r12, r11, r10, r9, r8;
100
    uint64_t rbp, rdi, rsi, rdx, rcx, rbx, rax;
101
    uint64_t int_no, err_code;
102
    /* Pushed by CPU */
103
    uint64_t rip, cs, rflags, rsp, ss;
104
} registers_t;
105
106
/* From isr.asm */
107
extern uint64_t isr_stub_table[256];
108
extern void idt_load(struct idtr *idtr);
109
110
void idt_init(void);
111
void isr_dispatch(registers_t *regs);
112
113
/* === PIC === */
114
#define PIC1_CMD   0x20
115
#define PIC1_DATA  0x21
116
#define PIC2_CMD   0xA0
117
#define PIC2_DATA  0xA1
118
#define PIC_EOI    0x20
119
120
void pic_remap(int offset1, int offset2);
121
void pic_mask_all(void);
122
void pic_unmask_irq(int irq);
123
void pic_send_eoi(int irq);
124
125
/* === Timer (PIT) === */
126
void     timer_init(uint32_t hz);
127
uint64_t timer_get_ticks(void);
128
uint64_t timer_get_seconds(void);
129
130
/* === Keyboard === */
131
#define KBD_DATA_PORT 0x60
132
#define KBD_STATUS_PORT 0x64
133
134
void keyboard_init(void);
135
int  keyboard_getchar(void);
136
137
/* === Physical Memory Manager (bitmap) === */
138
void     pmm_init(uint64_t mb2_info);
139
void    *pmm_alloc_page(void);
140
void     pmm_free_page(void *page);
141
uint64_t pmm_get_free_pages(void);
142
uint64_t pmm_get_total_pages(void);
143
144
/* === Kernel Heap === */
145
#define HEAP_SIZE (8 * 1024 * 1024)  /* 8 MB */
146
147
void  heap_init(void);
148
void *kmalloc(size_t size);
149
void *kcalloc(size_t count, size_t size);
150
void  kfree(void *ptr);
151
152
/* === VGA Text Mode === */
153
#define VGA_BUFFER 0xB8000
154
#define VGA_WIDTH  80
155
#define VGA_HEIGHT 25
156
157
void vga_init(void);
158
void vga_clear(void);
159
void vga_putc(char c);
160
void vga_puts(const char *s);
161
void vga_printf(const char *fmt, ...);
162
163
/* === Shell === */
164
void shell_init(void);
165
void shell_run(void);
166
167
/* === ATA PIO Block Device === */
168
#define ATA_DATA        0x1F0
169
#define ATA_ERROR       0x1F1
170
#define ATA_FEATURES    0x1F1
171
#define ATA_SECCOUNT    0x1F2
172
#define ATA_LBA_LO      0x1F3
173
#define ATA_LBA_MID     0x1F4
174
#define ATA_LBA_HI      0x1F5
175
#define ATA_DRIVE_HEAD  0x1F6
176
#define ATA_STATUS      0x1F7
177
#define ATA_COMMAND     0x1F7
178
#define ATA_ALT_STATUS  0x3F6
179
#define ATA_DEV_CTRL    0x3F6
180
181
void     ata_init(void);
182
int      ata_read_sectors(uint32_t lba, uint32_t count, void *buf);
183
int      ata_write_sectors(uint32_t lba, uint32_t count, const void *buf);
184
int      ata_is_present(void);
185
uint32_t ata_get_sector_count(void);
186
const char *ata_get_model(void);
187
const char *ata_get_serial(void);
188
int      ata_block_read(uint64_t lba, uint32_t count, void *buf);
189
190
/* === Multiboot2 Structures === */
191
struct mb2_tag {
192
    uint32_t type;
193
    uint32_t size;
194
} __attribute__((packed));
195
196
struct mb2_mmap_entry {
197
    uint64_t base_addr;
198
    uint64_t length;
199
    uint32_t type;
200
    uint32_t zero;
201
} __attribute__((packed));
202
203
struct mb2_tag_mmap {
204
    uint32_t type;
205
    uint32_t size;
206
    uint32_t entry_size;
207
    uint32_t entry_version;
208
    struct mb2_mmap_entry entries[];
209
} __attribute__((packed));
210
211
/* === Linker-defined symbols === */
212
extern char kernel_end[];
213
214
#endif /* PACTOR64_H */
215