blob: 1d4a6e083c4dc41aab6d10795440d8be486cb587 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/* 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 <kmi/sizes.h>
/* --- START ARCH USER CONFIG VALUES --- */
/** Physical address to where the OS image will be loaded. */
#define RAM_BASE 0x80000000
/* --- 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)
/** Physical address to where the kernel proper will be relocated. */
#define PM_KERN_BASE (RAM_BASE + FW_MAX_SIZE + PM_KERN_SIZE)
/** Highest allowed physical address where kernel stuff may lie. */
#define PM_KERN_TOP (PM_KERN_BASE + PM_KERN_SIZE)
/** Physical memory stack base. In this case, right after the kernel. */
#define PM_STACK_BASE (PM_KERN_BASE + PM_KERN_SIZE)
/** Size of physical memory stack. */
#define PM_STACK_SIZE (SZ_256K)
/** Top of physical memory stack. */
#define PM_STACK_TOP (PM_STACK_BASE + PM_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. */
#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 top. */
#define RPC_STACK_TOP (UVMEM_END + SZ_1G)
/** 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 */
|