diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/common.zig | 4 | ||||
| -rw-r--r-- | common/constants/constants.zig | 5 | ||||
| -rw-r--r-- | common/constants/memory/flags.zig | 25 | ||||
| -rw-r--r-- | common/constants/memory/layout.zig | 17 | ||||
| -rw-r--r-- | common/constants/memory/memory.zig | 5 | ||||
| -rw-r--r-- | common/constants/memory/sizes.zig | 21 | ||||
| -rw-r--r-- | common/constants/paging/flags.zig | 27 | ||||
| -rw-r--r-- | common/constants/paging/indices.zig | 36 | ||||
| -rw-r--r-- | common/constants/paging/paging.zig | 4 | ||||
| -rw-r--r-- | common/constants/serial/ports.zig | 16 | ||||
| -rw-r--r-- | common/constants/serial/registers.zig | 30 | ||||
| -rw-r--r-- | common/constants/serial/serial.zig | 4 | ||||
| -rw-r--r-- | common/errors/errors.zig | 3 | ||||
| -rw-r--r-- | common/errors/memory/allocation.zig | 9 | ||||
| -rw-r--r-- | common/errors/memory/mapping.zig | 11 | ||||
| -rw-r--r-- | common/errors/memory/memory.zig | 7 |
16 files changed, 224 insertions, 0 deletions
diff --git a/common/common.zig b/common/common.zig new file mode 100644 index 0000000..fd9945e --- /dev/null +++ b/common/common.zig @@ -0,0 +1,4 @@ +//! Common Definitions + +pub const constants = @import("constants/constants.zig"); +pub const errors = @import("errors/errors.zig"); diff --git a/common/constants/constants.zig b/common/constants/constants.zig new file mode 100644 index 0000000..b4344fb --- /dev/null +++ b/common/constants/constants.zig @@ -0,0 +1,5 @@ +//! Common Constants + +pub const memory = @import("memory/memory.zig"); +pub const paging = @import("paging/paging.zig"); +pub const serial = @import("serial/serial.zig"); diff --git a/common/constants/memory/flags.zig b/common/constants/memory/flags.zig new file mode 100644 index 0000000..a057cf9 --- /dev/null +++ b/common/constants/memory/flags.zig @@ -0,0 +1,25 @@ +//! Memory Flag Constants + +pub const protection_read: u8 = 0x01; +pub const protection_write: u8 = 0x02; +pub const protection_execute: u8 = 0x04; +pub const protection_user: u8 = 0x08; + +pub const protection_kernel_read_only: u8 = protection_read; +pub const protection_kernel_read_write: u8 = protection_read | protection_write; +pub const protection_kernel_execute: u8 = protection_read | protection_execute; +pub const protection_user_read_only: u8 = protection_read | protection_user; +pub const protection_user_read_write: u8 = protection_read | protection_write | protection_user; +pub const protection_user_execute: u8 = protection_read | protection_execute | protection_user; + +pub const allocation_wired: u32 = 0x00000001; +pub const allocation_contiguous: u32 = 0x00000002; +pub const allocation_zero_fill: u32 = 0x00000004; +pub const allocation_no_cache: u32 = 0x00000008; +pub const allocation_write_combine: u32 = 0x00000010; + +pub const region_anonymous: u32 = 0x00000001; +pub const region_shared: u32 = 0x00000002; +pub const region_copy_on_write: u32 = 0x00000004; +pub const region_stack: u32 = 0x00000008; +pub const region_guard: u32 = 0x00000010; diff --git a/common/constants/memory/layout.zig b/common/constants/memory/layout.zig new file mode 100644 index 0000000..0e3780f --- /dev/null +++ b/common/constants/memory/layout.zig @@ -0,0 +1,17 @@ +//! Memory Layout Constants + +pub const kernel_base: u64 = 0xFFFFFE0000000000; +pub const kernel_text: u64 = 0xFFFFFE0001000000; +pub const kernel_heap: u64 = 0xFFFFFE1000000000; +pub const physmap_base: u64 = 0xFFFFFF0000000000; +pub const mmio_base: u64 = 0xFFFFFF8000000000; + +pub const kernel_physical_base: u64 = 0x100000; + +pub const user_space_start: u64 = 0x0000000000000000; +pub const user_space_end: u64 = 0x00007FFFFFFFFFFF; + +pub const kernel_stack_size: u64 = 64 * 1024; +pub const kernel_stack_pages: u64 = kernel_stack_size / 4096; + +pub const physmap_max_size: u64 = 512 * 1024 * 1024 * 1024; diff --git a/common/constants/memory/memory.zig b/common/constants/memory/memory.zig new file mode 100644 index 0000000..9d82b78 --- /dev/null +++ b/common/constants/memory/memory.zig @@ -0,0 +1,5 @@ +//! Memory Constants + +pub const layout = @import("layout.zig"); +pub const sizes = @import("sizes.zig"); +pub const flags = @import("flags.zig"); diff --git a/common/constants/memory/sizes.zig b/common/constants/memory/sizes.zig new file mode 100644 index 0000000..049b087 --- /dev/null +++ b/common/constants/memory/sizes.zig @@ -0,0 +1,21 @@ +//! Memory Size Constants + +pub const page_size: u64 = 4096; +pub const page_shift: u6 = 12; +pub const page_mask: u64 = page_size - 1; + +pub const large_page_size: u64 = 2 * 1024 * 1024; +pub const large_page_shift: u6 = 21; +pub const large_page_mask: u64 = large_page_size - 1; + +pub const huge_page_size: u64 = 1024 * 1024 * 1024; +pub const huge_page_shift: u6 = 30; +pub const huge_page_mask: u64 = huge_page_size - 1; + +pub const kilobyte: u64 = 1024; +pub const megabyte: u64 = 1024 * kilobyte; +pub const gigabyte: u64 = 1024 * megabyte; +pub const terabyte: u64 = 1024 * gigabyte; + +pub const entries_per_page_table: u64 = 512; +pub const page_table_levels: u8 = 4; diff --git a/common/constants/paging/flags.zig b/common/constants/paging/flags.zig new file mode 100644 index 0000000..e6acad3 --- /dev/null +++ b/common/constants/paging/flags.zig @@ -0,0 +1,27 @@ +//! Paging Flag Constants + +pub const present: u64 = 1 << 0; +pub const writable: u64 = 1 << 1; +pub const user_accessible: u64 = 1 << 2; +pub const write_through: u64 = 1 << 3; +pub const cache_disabled: u64 = 1 << 4; +pub const accessed: u64 = 1 << 5; +pub const dirty: u64 = 1 << 6; +pub const huge_page: u64 = 1 << 7; +pub const global: u64 = 1 << 8; +pub const no_execute: u64 = 1 << 63; + +pub const kernel_read_only: u64 = present | global; +pub const kernel_read_write: u64 = present | writable | global; +pub const kernel_execute: u64 = present | global; +pub const kernel_read_write_no_execute: u64 = present | writable | global | no_execute; + +pub const user_read_only: u64 = present | user_accessible; +pub const user_read_write: u64 = present | writable | user_accessible; +pub const user_execute: u64 = present | user_accessible; +pub const user_read_write_no_execute: u64 = present | writable | user_accessible | no_execute; + +pub const table_flags: u64 = present | writable | user_accessible; +pub const kernel_table_flags: u64 = present | writable; + +pub const mmio_flags: u64 = present | writable | cache_disabled | no_execute; diff --git a/common/constants/paging/indices.zig b/common/constants/paging/indices.zig new file mode 100644 index 0000000..9d82bfa --- /dev/null +++ b/common/constants/paging/indices.zig @@ -0,0 +1,36 @@ +//! Paging Index Constants + +pub const pml4_shift: u6 = 39; +pub const pdpt_shift: u6 = 30; +pub const pd_shift: u6 = 21; +pub const pt_shift: u6 = 12; + +pub const index_mask: u64 = 0x1FF; + +pub const pml4_index_mask: u64 = index_mask << pml4_shift; +pub const pdpt_index_mask: u64 = index_mask << pdpt_shift; +pub const pd_index_mask: u64 = index_mask << pd_shift; +pub const pt_index_mask: u64 = index_mask << pt_shift; + +pub const address_mask: u64 = 0x000FFFFFFFFFF000; +pub const offset_mask: u64 = 0xFFF; + +pub fn extract_pml4_index(virtual_address: u64) u9 { + return @truncate((virtual_address >> pml4_shift) & index_mask); +} + +pub fn extract_pdpt_index(virtual_address: u64) u9 { + return @truncate((virtual_address >> pdpt_shift) & index_mask); +} + +pub fn extract_pd_index(virtual_address: u64) u9 { + return @truncate((virtual_address >> pd_shift) & index_mask); +} + +pub fn extract_pt_index(virtual_address: u64) u9 { + return @truncate((virtual_address >> pt_shift) & index_mask); +} + +pub fn extract_offset(virtual_address: u64) u12 { + return @truncate(virtual_address & offset_mask); +} diff --git a/common/constants/paging/paging.zig b/common/constants/paging/paging.zig new file mode 100644 index 0000000..2c98f52 --- /dev/null +++ b/common/constants/paging/paging.zig @@ -0,0 +1,4 @@ +//! Paging Constants + +pub const indices = @import("indices.zig"); +pub const flags = @import("flags.zig"); diff --git a/common/constants/serial/ports.zig b/common/constants/serial/ports.zig new file mode 100644 index 0000000..e9c11f4 --- /dev/null +++ b/common/constants/serial/ports.zig @@ -0,0 +1,16 @@ +//! Serial Port Constants + +pub const com1: u16 = 0x3F8; +pub const com2: u16 = 0x2F8; +pub const com3: u16 = 0x3E8; +pub const com4: u16 = 0x2E8; + +pub const default_port: u16 = com1; + +pub const baud_rate_115200: u16 = 1; +pub const baud_rate_57600: u16 = 2; +pub const baud_rate_38400: u16 = 3; +pub const baud_rate_19200: u16 = 6; +pub const baud_rate_9600: u16 = 12; + +pub const default_baud_divisor: u16 = baud_rate_115200; diff --git a/common/constants/serial/registers.zig b/common/constants/serial/registers.zig new file mode 100644 index 0000000..633bc45 --- /dev/null +++ b/common/constants/serial/registers.zig @@ -0,0 +1,30 @@ +//! Serial Register Constants + +pub const data_register: u16 = 0; +pub const interrupt_enable_register: u16 = 1; +pub const fifo_control_register: u16 = 2; +pub const line_control_register: u16 = 3; +pub const modem_control_register: u16 = 4; +pub const line_status_register: u16 = 5; +pub const modem_status_register: u16 = 6; +pub const scratch_register: u16 = 7; + +pub const divisor_latch_low: u16 = 0; +pub const divisor_latch_high: u16 = 1; + +pub const line_control_8_bits: u8 = 0x03; +pub const line_control_dlab: u8 = 0x80; + +pub const fifo_enable: u8 = 0x01; +pub const fifo_clear_receive: u8 = 0x02; +pub const fifo_clear_transmit: u8 = 0x04; +pub const fifo_trigger_14: u8 = 0xC0; + +pub const modem_dtr: u8 = 0x01; +pub const modem_rts: u8 = 0x02; +pub const modem_out1: u8 = 0x04; +pub const modem_out2: u8 = 0x08; +pub const modem_loopback: u8 = 0x10; + +pub const line_status_data_ready: u8 = 0x01; +pub const line_status_transmit_empty: u8 = 0x20; diff --git a/common/constants/serial/serial.zig b/common/constants/serial/serial.zig new file mode 100644 index 0000000..883bd02 --- /dev/null +++ b/common/constants/serial/serial.zig @@ -0,0 +1,4 @@ +//! Serial Constants + +pub const ports = @import("ports.zig"); +pub const registers = @import("registers.zig"); diff --git a/common/errors/errors.zig b/common/errors/errors.zig new file mode 100644 index 0000000..38cd106 --- /dev/null +++ b/common/errors/errors.zig @@ -0,0 +1,3 @@ +//! Common Errors + +pub const memory = @import("memory/memory.zig"); diff --git a/common/errors/memory/allocation.zig b/common/errors/memory/allocation.zig new file mode 100644 index 0000000..2359cac --- /dev/null +++ b/common/errors/memory/allocation.zig @@ -0,0 +1,9 @@ +//! Memory Allocation Errors + +pub const AllocationError = error{ + OutOfMemory, + InvalidSize, + InvalidAlignment, + RegionExhausted, + ZoneExhausted, +}; diff --git a/common/errors/memory/mapping.zig b/common/errors/memory/mapping.zig new file mode 100644 index 0000000..3f24216 --- /dev/null +++ b/common/errors/memory/mapping.zig @@ -0,0 +1,11 @@ +//! Memory Mapping Errors + +pub const MappingError = error{ + InvalidAddress, + AddressNotAligned, + RegionOverlap, + PermissionDenied, + PageTableAllocationFailed, + AlreadyMapped, + NotMapped, +}; diff --git a/common/errors/memory/memory.zig b/common/errors/memory/memory.zig new file mode 100644 index 0000000..de76bf2 --- /dev/null +++ b/common/errors/memory/memory.zig @@ -0,0 +1,7 @@ +//! Memory Errors + +pub const allocation = @import("allocation.zig"); +pub const mapping = @import("mapping.zig"); + +pub const AllocationError = allocation.AllocationError; +pub const MappingError = mapping.MappingError; |
