mirror of
https://github.com/kenshineto/kern.git
synced 2025-04-21 20:57:25 +00:00
157 lines
3.3 KiB
C
157 lines
3.3 KiB
C
/**
|
|
** @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
|