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
|
#include <triscv/uart.h>
#include <triscv/cpu.h>
#include <triscv/mmu.h>
#include <triscv/tmb.h>
#include <triscv/mem.h>
#define OPCODE(t) (t)
#define RD(t) ((t) << 10)
#define RS1(t) ((t) << 28)
#define RS2(t) ((t) << 36)
#define IMM4(t) ((t) << 10)
#define IMM5(t) ((t) << 44)
#define IMM9(t) ((t) << 36)
#define IMM18(t) ((t) << 18)
static const tri_t prog[] = {
/* li x1, '0' (48) */
/* or in this case, lui x1, 0, addi x1, 48 */
OPCODE(0b0100ULL) | RD(0b01ULL) | IMM18(0b0ULL),
OPCODE(0b0000ULL) | RD(0b01ULL) | RS1(0b01ULL) | IMM9(0b0110100100ULL),
/* li x2, 19683 (uart base reg) */
OPCODE(0b0100ULL) | RD(0b10ULL) | IMM18(0b1ULL),
OPCODE(0b0000ULL) | RD(0b10ULL) | RS1(0b10ULL) | IMM9(0ULL),
/* sw x1, 0(x2) */
OPCODE(0b0010ULL) | RS2(0b01ULL) | RS1(0b10ULL),
/* li x1, 3 (mpower)*/
OPCODE(0b0100ULL) | RD(0b01ULL),
OPCODE(0b0000ULL) | RD(0b01ULL) | RS1(0b01ULL) | IMM9(0b0100ULL),
/* csrrw mpower, x0, x1 */
/* mpower = -9841, which is then internally converted to 0 */
/* NOT FINAL CSR VALUE */
OPCODE(0b0001ULL) | RD(0b00ULL) | RS1(0b01ULL) | IMM9(0b101010101010101010UL)
};
int main()
{
/* add memory regions etc. */
struct mmu *mmu = mmu_create();
/* map one trinary page */
struct mem *mem = mem_create(19683);
mem_init(mem, prog, 8);
mmu_map_dev(mmu, 0, mem_dev(mem));
struct uart *uart = uart_create();
mmu_map_dev(mmu, 19683, uart_dev(uart));
struct tmb *tmb = tmb_create();
/* one cpu for each core we want */
struct cpu *cpu = cpu_create(mmu, tmb);
cpu_run(cpu, 0);
uart_destroy(uart);
cpu_destroy(cpu);
tmb_destroy(tmb);
mmu_destroy(mmu);
mem_destroy(mem);
return 0;
}
|