aboutsummaryrefslogtreecommitdiff
path: root/common/constants
diff options
context:
space:
mode:
Diffstat (limited to 'common/constants')
-rw-r--r--common/constants/constants.zig5
-rw-r--r--common/constants/memory/flags.zig25
-rw-r--r--common/constants/memory/layout.zig17
-rw-r--r--common/constants/memory/memory.zig5
-rw-r--r--common/constants/memory/sizes.zig21
-rw-r--r--common/constants/paging/flags.zig27
-rw-r--r--common/constants/paging/indices.zig36
-rw-r--r--common/constants/paging/paging.zig4
-rw-r--r--common/constants/serial/ports.zig16
-rw-r--r--common/constants/serial/registers.zig30
-rw-r--r--common/constants/serial/serial.zig4
11 files changed, 190 insertions, 0 deletions
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");