diff options
author | Tyler Murphy <=> | 2023-07-17 19:34:52 -0400 |
---|---|---|
committer | Tyler Murphy <=> | 2023-07-17 19:34:52 -0400 |
commit | 7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5 (patch) | |
tree | 4e86ff20e73171285156631db043e12aaf63bf04 /kernel/include/arch/i686 | |
parent | paging (diff) | |
download | finix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.tar.gz finix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.tar.bz2 finix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.zip |
refactoring
Diffstat (limited to 'kernel/include/arch/i686')
-rw-r--r-- | kernel/include/arch/i686/acpi.h | 106 | ||||
-rw-r--r-- | kernel/include/arch/i686/asm.h | 13 | ||||
-rw-r--r-- | kernel/include/arch/i686/drivers/ps2ctrl.h | 14 | ||||
-rw-r--r-- | kernel/include/arch/i686/drivers/rtc.h | 7 | ||||
-rw-r--r-- | kernel/include/arch/i686/idt.h | 6 | ||||
-rw-r--r-- | kernel/include/arch/i686/mboot.h | 34 | ||||
-rw-r--r-- | kernel/include/arch/i686/memory.h | 22 | ||||
-rw-r--r-- | kernel/include/arch/i686/pic.h | 11 |
8 files changed, 213 insertions, 0 deletions
diff --git a/kernel/include/arch/i686/acpi.h b/kernel/include/arch/i686/acpi.h new file mode 100644 index 0000000..bb35010 --- /dev/null +++ b/kernel/include/arch/i686/acpi.h @@ -0,0 +1,106 @@ +#pragma once + +#include <stdint.h> + +struct RootSystemDescriptionPointer { + char signature[8]; + uint8_t checksum; + char oemid[6]; + uint8_t revision; + uint32_t rsdt_address; +}; + +struct SystemDescriptionTableHeader { + char signature[4]; + uint32_t length; + uint8_t revision; + uint8_t checksum; + char oem_id[6]; + char oem_table_id[8]; + uint32_t oem_revision; + uint32_t creator_id; + uint32_t creator_revision; +}; + +struct RootSystemDescriptionTable { + struct SystemDescriptionTableHeader header; + uint32_t sdt_table[]; +}; + +struct GenericAddressStructure { + uint8_t address_space; + uint8_t bit_width; + uint8_t bit_offset; + uint8_t access_size; + uint64_t address; +}; + +struct FixedACPIDescriptionTable { + struct SystemDescriptionTableHeader header; + uint32_t firmware_ctrl; + uint32_t dsdt; + + // field used in ACPI 1.0; no longer in use, for compatibility only + uint8_t reserved; + + uint8_t preferred_power_management_profile; + uint16_t sci_interrupt; + uint32_t smi_command_port; + uint8_t acpi_enable; + uint8_t acpi_disable; + uint8_t s4bios_req; + uint8_t pstate_control; + uint32_t pm1_a_event_block; + uint32_t pm1_b_event_block; + uint32_t pm1_a_control_block; + uint32_t pm1_b_control_block; + uint32_t pm2_control_block; + uint32_t pm_timer_block; + uint32_t gpe0_block; + uint32_t gpe1_block; + uint8_t pm1_event_length; + uint8_t pm1_control_length; + uint8_t pm2_control_length; + uint8_t pm_timer_length; + uint8_t gpe0_length; + uint8_t gpe1_length; + uint8_t gpe1_base; + uint8_t cstate_control; + uint16_t worst_c2_latency; + uint16_t worst_c3_latency; + uint16_t flush_size; + uint16_t flush_stride; + uint8_t duty_offset; + uint8_t duty_width; + uint8_t day_alarm; + uint8_t month_alarm; + uint8_t century; + + // reserved in ACPI 1.0; used since ACPI 2.0+ + uint16_t boot_architecture_flags; + + uint8_t reserved_2; + uint32_t flags; + + // 12 byte structure; see below for details + struct GenericAddressStructure reset_reg; + + uint8_t reset_value; + uint8_t reserved_3[3]; + + // 64bit pointers - Available on ACPI 2.0+ + uint64_t x_firmware_control; + uint64_t x_dsdt; + + struct GenericAddressStructure x_pm1_a_event_block; + struct GenericAddressStructure x_pm1_b_event_block; + struct GenericAddressStructure x_pm1_a_control_block; + struct GenericAddressStructure x_pm1_b_control_block; + struct GenericAddressStructure x_pm2_control_block; + struct GenericAddressStructure x_pm_timer_block; + struct GenericAddressStructure x_gpe0_block; + struct GenericAddressStructure x_gpe1_block; +}; + +void acpi_init(void *rsdp); +void acpi_poweroff(void); diff --git a/kernel/include/arch/i686/asm.h b/kernel/include/arch/i686/asm.h new file mode 100644 index 0000000..0e2d9db --- /dev/null +++ b/kernel/include/arch/i686/asm.h @@ -0,0 +1,13 @@ +#include <stdint.h> + +extern uint8_t inb(uint16_t port); +extern void outb(uint16_t port, uint8_t val); +extern uint16_t inw(uint16_t port); +extern void outw(uint16_t port, uint16_t val); +extern uint32_t inl(uint16_t port); +extern void outl(uint16_t port, uint32_t val); +extern void io_wait(void); +extern void int_enable(void); +extern void int_disable(void); +extern void int_wait(void); +extern void halt(void); diff --git a/kernel/include/arch/i686/drivers/ps2ctrl.h b/kernel/include/arch/i686/drivers/ps2ctrl.h new file mode 100644 index 0000000..a674c57 --- /dev/null +++ b/kernel/include/arch/i686/drivers/ps2ctrl.h @@ -0,0 +1,14 @@ +#pragma once + +#include <stdbool.h> +#include <stdint.h> + +uint8_t ps2ctrl_in(void); +uint8_t ps2ctrl_in_status(void); +void ps2ctrl_out_cmd(uint8_t cmd); +void ps2ctrl_out_data(uint8_t data); +void ps2ctrl_set_port2(void); + +void ps2ctrl_init(void); + +bool ps2ctrl_is_init(void); diff --git a/kernel/include/arch/i686/drivers/rtc.h b/kernel/include/arch/i686/drivers/rtc.h new file mode 100644 index 0000000..29dbf8f --- /dev/null +++ b/kernel/include/arch/i686/drivers/rtc.h @@ -0,0 +1,7 @@ +#pragma once + +#include <time.h> + +extern void rtc_update(void); +extern struct Time rtc_utctime(void); +extern struct Time rtc_localtime(enum Timezone tz); diff --git a/kernel/include/arch/i686/idt.h b/kernel/include/arch/i686/idt.h new file mode 100644 index 0000000..8dcee02 --- /dev/null +++ b/kernel/include/arch/i686/idt.h @@ -0,0 +1,6 @@ +#pragma once + +#define IDT_SIZE 256 +#define IDT_INTERRUPTS 256 + +void idt_init(void); diff --git a/kernel/include/arch/i686/mboot.h b/kernel/include/arch/i686/mboot.h new file mode 100644 index 0000000..394071f --- /dev/null +++ b/kernel/include/arch/i686/mboot.h @@ -0,0 +1,34 @@ +#pragma once + +#include <stdbool.h> +#include <stdint.h> +#include <arch/i686/mboot.h> +#include <arch/i686/memory.h> + +#define CMDLINE_MAX 32 + +struct BootTag { + uint8_t valid; + uint32_t type; + uint32_t size; + union { + char cmdline[CMDLINE_MAX]; + struct MemoryMap *memory_map; + struct RootSystemDescriptionPointer *rsdp; + } data; +}; + +struct BootInfo { + uint32_t total_size; + uint32_t reserved; + struct BootTag tags[21]; +}; + +enum BootTagID { + ID_CMDLINE = 0, + iD_MEMORYMAP = 6, + ID_RSDP = 14 +}; + +void load_boot_info(void* boot_info); +bool get_boot_tag(enum BootTagID id, struct BootTag **tag); diff --git a/kernel/include/arch/i686/memory.h b/kernel/include/arch/i686/memory.h new file mode 100644 index 0000000..5d99025 --- /dev/null +++ b/kernel/include/arch/i686/memory.h @@ -0,0 +1,22 @@ +#pragma once + +#include <stdint.h> + +struct MemorySegment { + uint64_t addr; + uint64_t len; + uint32_t type; + uint32_t reserved; +} __attribute__((packed)); + +struct MemoryMap { + uint32_t entry_size; + uint32_t entry_version; + struct MemorySegment entries[]; +} __attribute__((packed)); + +uint32_t memory_total(void); +uint32_t memory_free(void); +uint32_t memory_used(void); + +void memory_init(void); diff --git a/kernel/include/arch/i686/pic.h b/kernel/include/arch/i686/pic.h new file mode 100644 index 0000000..593a33a --- /dev/null +++ b/kernel/include/arch/i686/pic.h @@ -0,0 +1,11 @@ +#pragma once + +#include <stdint.h> + +#define PIC_REMAP_OFFSET 0x20 + +void pic_remap(void); +void pic_mask(int irq); +void pic_unmask(int irq); +void pic_disable(void); +void pic_eoi(int irq); |