summaryrefslogtreecommitdiff
path: root/kernel/old/include/kdefs.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/old/include/kdefs.h')
-rw-r--r--kernel/old/include/kdefs.h157
1 files changed, 157 insertions, 0 deletions
diff --git a/kernel/old/include/kdefs.h b/kernel/old/include/kdefs.h
new file mode 100644
index 0000000..d26fa3d
--- /dev/null
+++ b/kernel/old/include/kdefs.h
@@ -0,0 +1,157 @@
+/**
+** @file kdefs.h
+**
+** @author CSCI-452 class of 20245
+**
+** @brief Kernel-only declarations.
+*/
+
+#ifndef KDEFS_H_
+#define KDEFS_H_
+
+// debugging macros
+#include <debug.h>
+
+/*
+** General (C and/or assembly) definitions
+*/
+
+// page sizes
+#define SZ_PAGE NUM_4KB
+#define SZ_BIGPAGE NUM_4MB
+
+// kernel stack size (bytes)
+#define N_KSTKPAGES 1
+#define SZ_KSTACK (N_KSTKPAGES * SZ_PAGE)
+
+// user stack size
+#define N_USTKPAGES 2
+#define SZ_USTACK (N_USTKPAGES * SZ_PAGE)
+
+// declarations for modulus checking of (e.g.) sizes and addresses
+
+#define LOW_9_BITS 0x00000fff
+#define LOW_22_BITS 0x003fffff
+#define HIGH_20_BITS 0xfffff000
+#define HIGH_10_BITS 0xffc00000
+
+#define MOD4_BITS 0x00000003
+#define MOD4_MASK 0xfffffffc
+#define MOD4_INC 0x00000004
+#define MOD4_SHIFT 2
+
+#define MOD16_BITS 0x0000000f
+#define MOD16_MASK 0xfffffff0
+#define MOD16_INC 0x00000010
+#define MOD16_SHIFT 4
+
+#define MOD1K_BITS 0x000003ff
+#define MOD1K_MASK 0xfffffc00
+#define MOD1K_INC 0x00000400
+#define MOD1K_SHIFT 10
+
+#define MOD4K_BITS 0x00000fff
+#define MOD4K_MASK 0xfffff000
+#define MOD4K_INC 0x00001000
+#define MOD4K_SHIFT 12
+
+#define MOD1M_BITS 0x000fffff
+#define MOD1M_MASK 0xfff00000
+#define MOD1M_INC 0x00100000
+#define MOD1M_SHIFT 20
+
+#define MOD4M_BITS 0x003fffff
+#define MOD4M_MASK 0xffc00000
+#define MOD4M_INC 0x00400000
+#define MOD4M_SHIFT 22
+
+#define MOD1G_BITS 0x3fffffff
+#define MOD1G_MASK 0xc0000000
+#define MOD1G_INC 0x40000000
+#define MOD1G_SHIFT 30
+
+#ifndef ASM_SRC
+
+/*
+** Start of C-only definitions
+*/
+
+// unit conversion macros
+#define B_TO_KB(x) (((uint_t)(x)) >> 10)
+#define B_TO_MB(x) (((uint_t)(x)) >> 20)
+#define B_TO_GB(x) (((uint_t)(x)) >> 30)
+
+#define KB_TO_B(x) (((uint_t)(x)) << 10)
+#define KB_TO_MB(x) (((uint_t)(x)) >> 10)
+#define KB_TO_GB(x) (((uint_t)(x)) >> 20)
+
+#define MB_TO_B(x) (((uint_t)(x)) << 20)
+#define MB_TO_KB(x) (((uint_t)(x)) << 10)
+#define MB_TO_GB(x) (((uint_t)(x)) >> 10)
+
+#define GB_TO_B(x) (((uint_t)(x)) << 30)
+#define GB_TO_KB(x) (((uint_t)(x)) << 20)
+#define GB_TO_MB(x) (((uint_t)(x)) << 10)
+
+// potetially useful compiler attributes
+#define ATTR_ALIGNED(x) __attribute__((__aligned__(x)))
+#define ATTR_PACKED __attribute__((__packed__))
+#define ATTR_UNUSED __attribute__((__unused__))
+
+/*
+** Utility macros
+*/
+
+//
+// macros to clear data structures
+//
+// these are usable for clearing single-valued data items (e.g.,
+// a PCB, etc.)
+#define CLEAR(v) memclr(&v, sizeof(v))
+#define CLEAR_PTR(p) memclr(p, sizeof(*p))
+
+//
+// macros for access registers and system call arguments
+//
+
+// REG(pcb,x) -- access a specific register in a process context
+#define REG(pcb, x) ((pcb)->context->x)
+
+// RET(pcb) -- access return value register in a process context
+#define RET(pcb) ((pcb)->context->eax)
+
+// ARG(pcb,n) -- access argument #n from the indicated process
+//
+// ARG(pcb,0) --> return address
+// ARG(pcb,1) --> first parameter
+// ARG(pcb,2) --> second parameter
+// etc.
+//
+// ASSUMES THE STANDARD 32-BIT ABI, WITH PARAMETERS PUSHED ONTO THE
+// STACK. IF THE PARAMETER PASSING MECHANISM CHANGES, SO MUST THIS!
+#define ARG(pcb, n) (((uint32_t *)(((pcb)->context) + 1))[(n)])
+
+/*
+** Types
+*/
+
+/*
+** Globals
+*/
+
+// general-purpose character buffer
+extern char b256[256];
+
+// buffer for use by PANIC() macro
+extern char b512[512];
+
+// kernel stack
+extern uint8_t kstack[SZ_KSTACK];
+
+/*
+** Prototypes
+*/
+
+#endif /* !ASM_SRC */
+
+#endif