/* SPDX-License-Identifier: copyleft-next-0.3.1 */ /* Copyright 2021 - 2022, Kim Kuparinen < kimi.h.kuparinen@gmail.com > */ #ifndef KMI_RISCV_CONFIG_H #define KMI_RISCV_CONFIG_H /** * @file config.h * riscv64 specific configuration parameters, currently mixing user-specified * and immutable parameters. Included on the command line by * -include. * * Assume Sv39, probably wouldn't be too difficult to use runtime parameters * instead. First 4K is reserved for NULL, but I suppose it could be mapped * later if *absolutely* necessary. * * \todo Consider separating user-specified and immutable parameters. * \todo Write more thorough documentation, maybe a separate .md file? */ #include /* --- START ARCH USER CONFIG VALUES --- */ /* nada for now */ /* --- END ARCH USER CONFIG VALUES --- */ /* don't touch >:( */ /** * How much space to reserve for possible firmware region. * Assumed to be at start of RAM. */ #define FW_MAX_SIZE (SZ_2M) /** Maximum size of the kernel proper. Largely arbitrary. */ /** \todo UBSAN is getting pretty close to this limit, should it be raised? */ #define PM_KERN_SIZE (SZ_256K) /** Virtual memory stack base. In this case, right after the kernel. */ #define VM_STACK_BASE (VM_KERN + PM_KERN_SIZE) /** Size of virtual memory stack. */ #define VM_STACK_SIZE (SZ_4K) /** Top of virtual memory stack. */ #define VM_STACK_TOP (VM_STACK_BASE + VM_STACK_SIZE) #if defined(riscv64) /* 64bit */ /** Direct map offset. */ #define VM_DMAP (0xffffffc000000000) /* testing for now */ /** Virtual address of kernel proper inside direct mapping. */ #define VM_KERN (VM_DMAP + FW_MAX_SIZE) /** Page reserved for kernel I/O. */ #define IO_PAGE 511UL /** Direct mapping starts from this page. */ #define KSTART_PAGE 256UL /** * The RPC stack page. * @todo this should be page before KSTART, but currently * RPC_STACK_TOP is too low (why? was there a reason to place it so low?) and overlaps. */ #define CSTACK_PAGE 248UL /** User virtual memory space start. */ #define UVMEM_START (SZ_4K) /** User virtual memory space end. */ #define UVMEM_END (SZ_256G - SZ_8G) /** RPC stack base. */ #define RPC_STACK_BASE (UVMEM_END) /** * Size of the default top page. * For now we're only targeting Sv39, so this can easily be a macro. * Eventually it might have to be turned into a function call to support Sv48 * etc. */ #define TOP_PAGE_SIZE SZ_1G /** Default Sv mode on rv64 in kmi. */ #define DEFAULT_Sv_MODE Sv39 #else /* 32bit */ /** \todo figure this stuff out */ #define VM_DMAP 0x80000000 /* works on qemu at least */ #define VM_KERN (VM_DMAP + FW_MAX_SIZE) #define IO_PAGE 1023UL #define KSTART_PAGE 512UL #define CSTACK_PAGE 511UL #define UVMEM_START (SZ_4K) #define UVMEM_END (SZ_2G - SZ_8M) #define RPC_STACK_TOP (UVMEM_END) #define RPC_STACK_BASE (RPC_STACK_TOP - SZ_8M) #define TOP_PAGE_SIZE SZ_4M #define DEFAULT_Sv_MODE Sv32 #endif #endif /* KMI_RISCV_CONFIG_H */