More validation with "i" extension and gdb like command interface

This commit is contained in:
Benjamin Kyd
2023-07-20 22:53:23 +01:00
parent 6bf5ccf7c8
commit ee8710c317
9 changed files with 110 additions and 504 deletions

View File

@@ -6,6 +6,7 @@ use std::io::BufReader;
use std::io::Read;
use std::{cell::RefCell, rc::Rc};
mod management;
mod cpu;
mod err;
mod ext;
@@ -20,6 +21,7 @@ struct VMRV32I {
bus: Rc<RefCell<bus::Bus>>,
cpu: cpu::CPU,
instruction_decoder: Rc<RefCell<decode::DecodeCycle>>,
manager: management::Management,
}
impl VMRV32I {
@@ -40,6 +42,7 @@ impl VMRV32I {
cpu,
bus,
instruction_decoder,
manager: management::Management::new(),
}
}
@@ -96,9 +99,11 @@ impl VMRV32I {
fn main() {
println!("VM Starting Up");
println!("VM Loading CPU Management Engine");
let mut vm = VMRV32I::new();
let size = vm.load_prog("./test/c_test.bin");
vm.manager.prompt();
let size = vm.load_prog("./test/test.bin");
vm.dump_prog(size);
vm.dispatch();
}

50
src/management.rs Normal file
View File

@@ -0,0 +1,50 @@
use std::io::{stdin, Write};
pub struct VMAction {
action: Action,
}
pub enum Action {
Load,
Step,
Run,
Inspect,
Dump,
Reg,
}
pub struct Management {
pause: bool,
}
impl Management {
pub fn new() -> Management {
Management { pause: true }
}
pub fn vm_params() -> Vec<VMAction> {
vec![VMAction { action: Action::Load }]
}
pub fn prompt(&self) -> Action {
print!("VM >> ");
std::io::stdout().flush().unwrap();
let mut input = String::new();
stdin().read_line(&mut input).unwrap();
let mut parts = input.trim().split_whitespace();
let command = parts.next().unwrap();
let args = parts;
match command {
"load" => Action::Load,
"step" => Action::Step,
"run" => Action::Run,
_ => {
println!("VM > Command {} not found", command);
self.prompt()
}
}
}
}

View File

@@ -1,10 +1,10 @@
TARGET=c_test
TARGET=test
GCC_PREFIX=riscv32-unknown-elf
CFLAGS:=-fno-stack-protector
CFLAGS+=-static-libgcc -fdata-sections -ffunction-sections
CFLAGS+=-g -O0 -march=rv32ia -mabi=ilp32 -static
LDFLAGS:= -T flatfile.lds -nostdlib
LDFLAGS:= -T flatfile.lds -nostdlib
all: build

BIN
test/test

Binary file not shown.

View File

@@ -1,236 +1,16 @@
.file "binary_search.c"
.option nopic
.text
.align 2
.globl binary_search
.type binary_search, @function
binary_search:
addi sp,sp,-48
sw ra,44(sp)
sw s0,40(sp)
addi s0,sp,48
sw a0,-36(s0)
sw a1,-40(s0)
sw a2,-44(s0)
sw a3,-48(s0)
lw a4,-48(s0)
lw a5,-44(s0)
sub a5,a4,a5
srli a4,a5,31
add a5,a4,a5
srai a5,a5,1
mv a4,a5
lw a5,-44(s0)
add a5,a5,a4
sw a5,-20(s0)
lw a4,-44(s0)
lw a5,-48(s0)
ble a4,a5,.L2
li a5,-1
j .L3
.L2:
lw a5,-20(s0)
slli a5,a5,2
lw a4,-36(s0)
add a5,a4,a5
lw a5,0(a5)
lw a4,-40(s0)
bne a4,a5,.L4
lw a5,-20(s0)
j .L3
.L4:
lw a5,-20(s0)
slli a5,a5,2
lw a4,-36(s0)
add a5,a4,a5
lw a5,0(a5)
lw a4,-40(s0)
bge a4,a5,.L5
lw a5,-20(s0)
addi a5,a5,-1
mv a3,a5
lw a2,-44(s0)
lw a1,-40(s0)
lw a0,-36(s0)
call binary_search
mv a5,a0
j .L3
.L5:
lw a5,-20(s0)
addi a5,a5,1
lw a3,-48(s0)
mv a2,a5
lw a1,-40(s0)
lw a0,-36(s0)
call binary_search
mv a5,a0
.L3:
mv a0,a5
lw ra,44(sp)
lw s0,40(sp)
addi sp,sp,48
jr ra
.size binary_search, .-binary_search
.align 2
.globl search
.type search, @function
search:
addi sp,sp,-32
sw ra,28(sp)
sw s0,24(sp)
addi s0,sp,32
sw a0,-20(s0)
sw a1,-24(s0)
sw a2,-28(s0)
lw a5,-28(s0)
addi a5,a5,-1
mv a3,a5
li a2,0
lw a1,-24(s0)
lw a0,-20(s0)
call binary_search
mv a5,a0
mv a0,a5
lw ra,28(sp)
lw s0,24(sp)
addi sp,sp,32
jr ra
.size search, .-search
.align 2
.globl sort
.type sort, @function
sort:
addi sp,sp,-48
sw s0,44(sp)
addi s0,sp,48
sw a0,-36(s0)
sw a1,-40(s0)
sw zero,-20(s0)
j .L9
.L13:
sw zero,-24(s0)
j .L10
.L12:
lw a5,-24(s0)
addi a5,a5,1
slli a5,a5,2
lw a4,-36(s0)
add a5,a4,a5
lw a4,0(a5)
lw a5,-24(s0)
slli a5,a5,2
lw a3,-36(s0)
add a5,a3,a5
lw a5,0(a5)
bge a4,a5,.L11
lw a5,-24(s0)
slli a5,a5,2
lw a4,-36(s0)
add a5,a4,a5
lw a5,0(a5)
sw a5,-28(s0)
lw a5,-24(s0)
addi a5,a5,1
slli a5,a5,2
lw a4,-36(s0)
add a4,a4,a5
lw a5,-24(s0)
slli a5,a5,2
lw a3,-36(s0)
add a5,a3,a5
lw a4,0(a4)
sw a4,0(a5)
lw a5,-24(s0)
addi a5,a5,1
slli a5,a5,2
lw a4,-36(s0)
add a5,a4,a5
lw a4,-28(s0)
sw a4,0(a5)
.L11:
lw a5,-24(s0)
addi a5,a5,1
sw a5,-24(s0)
.L10:
lw a4,-40(s0)
lw a5,-20(s0)
sub a5,a4,a5
addi a5,a5,-1
lw a4,-24(s0)
blt a4,a5,.L12
lw a5,-20(s0)
addi a5,a5,1
sw a5,-20(s0)
.L9:
lw a5,-40(s0)
addi a5,a5,-1
lw a4,-20(s0)
blt a4,a5,.L13
nop
mv a0,a5
lw s0,44(sp)
addi sp,sp,48
jr ra
.size sort, .-sort
.section .rodata
.align 2
.LC0:
.word 0
.word 6
.word 8
.word 4
.word 3
.word 9
.word 7
.word 5
.text
.align 2
.globl main
.type main, @function
main:
addi sp,sp,-64
sw ra,60(sp)
sw s0,56(sp)
addi s0,sp,64
lui a5,%hi(.LC0)
lw a7,%lo(.LC0)(a5)
addi a4,a5,%lo(.LC0)
lw a6,4(a4)
addi a4,a5,%lo(.LC0)
lw a0,8(a4)
addi a4,a5,%lo(.LC0)
lw a1,12(a4)
addi a4,a5,%lo(.LC0)
lw a2,16(a4)
addi a4,a5,%lo(.LC0)
lw a3,20(a4)
addi a4,a5,%lo(.LC0)
lw a4,24(a4)
addi a5,a5,%lo(.LC0)
lw a5,28(a5)
sw a7,-52(s0)
sw a6,-48(s0)
sw a0,-44(s0)
sw a1,-40(s0)
sw a2,-36(s0)
sw a3,-32(s0)
sw a4,-28(s0)
sw a5,-24(s0)
addi a5,s0,-52
li a1,8
mv a0,a5
call sort
addi a5,s0,-52
li a2,8
li a1,9
mv a0,a5
call search
sw a0,-20(s0)
lw a5,-20(s0)
mv a0,a5
lw ra,60(sp)
lw s0,56(sp)
addi sp,sp,64
jr ra
.size main, .-main
.ident "GCC: (GNU) 7.2.0"
addi x3,x0,0 # s = 0
addi x4,x0,0 # i = 0
addi x5,x0,5 # const 5
lui x6, 0x80000
addi x6,x6,0x100 # base address of ax[]
addi x8,x0,0 # offset = 0
loop:
bge x4, x5, exit
add x7, x6, x8 # compute effective address
lw x9, 0(x7) # get ax[i]
add x3, x3, x9 # s = s + ax[i]
addi x8, x8, 4 # next element
addi x4, x4, 1 # increment index
j loop
exit:

Binary file not shown.

View File

@@ -1,51 +1,7 @@
:10000000130101FD2326110223248102130401039D
:10001000232EA4FC232CB4FC232AC4FC2328D4FCC8
:10002000032704FD832744FDB307F74013D7F701E7
:10003000B307F70093D7174013870700832744FDC2
:10004000B387E7002326F4FE032744FD832704FD3E
:1000500063D6E7009307F0FF6F0080088327C4FE94
:10006000939727000327C4FDB307F70083A7070072
:10007000032784FD6316F7008327C4FE6F00400644
:100080008327C4FE939727000327C4FDB307F70017
:1000900083A70700032784FD6354F7028327C4FE68
:1000A0009387F7FF93860700032644FD832584FD8D
:1000B0000325C4FDEFF0DFF4930705006F00400255
:1000C0008327C4FE93871700832604FD1386070049
:1000D000832584FD0325C4FDEFF09FF293070500FF
:1000E000138507008320C102032481021301010349
:1000F00067800000130101FE232E1100232C8100D4
:10010000130401022326A4FE2324B4FE2322C4FEEA
:10011000832744FE9387F7FF9386070013060000AA
:10012000832584FE0325C4FEEFF09FED93070500B1
:10013000138507008320C1010324810113010102FB
:1001400067800000130101FD2326810213040103CF
:10015000232EA4FC232CB4FC232604FE6F00C00C29
:10016000232404FE6F00000A832784FE9387170070
:10017000939727000327C4FDB307F70003A70700E1
:10018000832784FE939727008326C4FDB387F60058
:1001900083A707006352F706832784FE93972700FF
:1001A0000327C4FDB307F70083A707002322F4FE4B
:1001B000832784FE93871700939727000327C4FDA6
:1001C0003307F700832784FE939727008326C4FD17
:1001D000B387F6000327070023A0E700832784FEE8
:1001E00093871700939727000327C4FDB307F700F1
:1001F000032744FE23A0E700832784FE938717008C
:100200002324F4FE032784FD8327C4FEB307F740AD
:100210009387F7FF032784FEE348F7F48327C4FEA0
:10022000938717002326F4FE832784FD9387F7FF27
:100230000327C4FEE346F7F213000000138507000E
:100240000324C1021301010367800000130101FCB4
:10025000232E1102232C8102130401048328802FF2
:100260001307802F032847001307802F03258700DB
:100270001307802F8325C7001307802F032607014C
:100280001307802F832647011307802F0327870139
:100290009307802F83A7C701232614FD232804FD7D
:1002A000232AA4FC232CB4FC232EC4FC2320D4FE3C
:1002B0002322E4FE2324F4FE9307C4FC930580006C
:1002C00013850700EFF01FE89307C4FC13068000B6
:1002D0009305900013850700EFF0DFE12326A4FECD
:1002E0008327C4FE138507008320C10303248103F1
:0802F000130101046780000006
:1002F80000000000060000000800000004000000E4
:1003080003000000090000000700000005000000CD
:0200000480007A
:1000000093010000130200009302500037030080A8
:100010001303031013040000635E5200B303830054
:1000200083A40300B381910013044400130212005F
:040030006FF09FFED0
:040000058000000077
:00000001FF

View File

@@ -1,203 +1,22 @@
test: file format elf64-littleriscv
test: file format elf32-littleriscv
Disassembly of section .text:
0000000000000000 <binary_search>:
0: fd010113 addi sp,sp,-48
4: 02112623 sw ra,44(sp)
8: 02812423 sw s0,40(sp)
c: 03010413 addi s0,sp,48
10: fca42e23 sw a0,-36(s0)
14: fcb42c23 sw a1,-40(s0)
18: fcc42a23 sw a2,-44(s0)
1c: fcd42823 sw a3,-48(s0)
20: fd042703 lw a4,-48(s0)
24: fd442783 lw a5,-44(s0)
28: 40f707b3 sub a5,a4,a5
2c: 01f7d713 srli a4,a5,0x1f
30: 00f707b3 add a5,a4,a5
34: 4017d793 srai a5,a5,0x1
38: 00078713 addi a4,a5,0
3c: fd442783 lw a5,-44(s0)
40: 00e787b3 add a5,a5,a4
44: fef42623 sw a5,-20(s0)
48: fd442703 lw a4,-44(s0)
4c: fd042783 lw a5,-48(s0)
50: 00e7d663 bge a5,a4,5c <binary_search+0x5c>
54: fff00793 addi a5,zero,-1
58: 0880006f jal zero,e0 <binary_search+0xe0>
5c: fec42783 lw a5,-20(s0)
60: 00279793 slli a5,a5,0x2
64: fdc42703 lw a4,-36(s0)
68: 00f707b3 add a5,a4,a5
6c: 0007a783 lw a5,0(a5)
70: fd842703 lw a4,-40(s0)
74: 00f71663 bne a4,a5,80 <binary_search+0x80>
78: fec42783 lw a5,-20(s0)
7c: 0640006f jal zero,e0 <binary_search+0xe0>
80: fec42783 lw a5,-20(s0)
84: 00279793 slli a5,a5,0x2
88: fdc42703 lw a4,-36(s0)
8c: 00f707b3 add a5,a4,a5
90: 0007a783 lw a5,0(a5)
94: fd842703 lw a4,-40(s0)
98: 02f75463 bge a4,a5,c0 <binary_search+0xc0>
9c: fec42783 lw a5,-20(s0)
a0: fff78793 addi a5,a5,-1
a4: 00078693 addi a3,a5,0
a8: fd442603 lw a2,-44(s0)
ac: fd842583 lw a1,-40(s0)
b0: fdc42503 lw a0,-36(s0)
b4: f4dff0ef jal ra,0 <binary_search>
b8: 00050793 addi a5,a0,0
bc: 0240006f jal zero,e0 <binary_search+0xe0>
c0: fec42783 lw a5,-20(s0)
c4: 00178793 addi a5,a5,1
c8: fd042683 lw a3,-48(s0)
cc: 00078613 addi a2,a5,0
d0: fd842583 lw a1,-40(s0)
d4: fdc42503 lw a0,-36(s0)
d8: f29ff0ef jal ra,0 <binary_search>
dc: 00050793 addi a5,a0,0
e0: 00078513 addi a0,a5,0
e4: 02c12083 lw ra,44(sp)
e8: 02812403 lw s0,40(sp)
ec: 03010113 addi sp,sp,48
f0: 00008067 jalr zero,0(ra)
80000000 <main>:
80000000: 00000193 addi gp,zero,0
80000004: 00000213 addi tp,zero,0
80000008: 00500293 addi t0,zero,5
8000000c: 80000337 lui t1,0x80000
80000010: 10030313 addi t1,t1,256 # 80000100 <exit+0xcc>
80000014: 00000413 addi s0,zero,0
00000000000000f4 <search>:
f4: fe010113 addi sp,sp,-32
f8: 00112e23 sw ra,28(sp)
fc: 00812c23 sw s0,24(sp)
100: 02010413 addi s0,sp,32
104: fea42623 sw a0,-20(s0)
108: feb42423 sw a1,-24(s0)
10c: fec42223 sw a2,-28(s0)
110: fe442783 lw a5,-28(s0)
114: fff78793 addi a5,a5,-1
118: 00078693 addi a3,a5,0
11c: 00000613 addi a2,zero,0
120: fe842583 lw a1,-24(s0)
124: fec42503 lw a0,-20(s0)
128: ed9ff0ef jal ra,0 <binary_search>
12c: 00050793 addi a5,a0,0
130: 00078513 addi a0,a5,0
134: 01c12083 lw ra,28(sp)
138: 01812403 lw s0,24(sp)
13c: 02010113 addi sp,sp,32
140: 00008067 jalr zero,0(ra)
0000000000000144 <sort>:
144: fd010113 addi sp,sp,-48
148: 02812623 sw s0,44(sp)
14c: 03010413 addi s0,sp,48
150: fca42e23 sw a0,-36(s0)
154: fcb42c23 sw a1,-40(s0)
158: fe042623 sw zero,-20(s0)
15c: 0cc0006f jal zero,228 <sort+0xe4>
160: fe042423 sw zero,-24(s0)
164: 0a00006f jal zero,204 <sort+0xc0>
168: fe842783 lw a5,-24(s0)
16c: 00178793 addi a5,a5,1
170: 00279793 slli a5,a5,0x2
174: fdc42703 lw a4,-36(s0)
178: 00f707b3 add a5,a4,a5
17c: 0007a703 lw a4,0(a5)
180: fe842783 lw a5,-24(s0)
184: 00279793 slli a5,a5,0x2
188: fdc42683 lw a3,-36(s0)
18c: 00f687b3 add a5,a3,a5
190: 0007a783 lw a5,0(a5)
194: 06f75263 bge a4,a5,1f8 <sort+0xb4>
198: fe842783 lw a5,-24(s0)
19c: 00279793 slli a5,a5,0x2
1a0: fdc42703 lw a4,-36(s0)
1a4: 00f707b3 add a5,a4,a5
1a8: 0007a783 lw a5,0(a5)
1ac: fef42223 sw a5,-28(s0)
1b0: fe842783 lw a5,-24(s0)
1b4: 00178793 addi a5,a5,1
1b8: 00279793 slli a5,a5,0x2
1bc: fdc42703 lw a4,-36(s0)
1c0: 00f70733 add a4,a4,a5
1c4: fe842783 lw a5,-24(s0)
1c8: 00279793 slli a5,a5,0x2
1cc: fdc42683 lw a3,-36(s0)
1d0: 00f687b3 add a5,a3,a5
1d4: 00072703 lw a4,0(a4)
1d8: 00e7a023 sw a4,0(a5)
1dc: fe842783 lw a5,-24(s0)
1e0: 00178793 addi a5,a5,1
1e4: 00279793 slli a5,a5,0x2
1e8: fdc42703 lw a4,-36(s0)
1ec: 00f707b3 add a5,a4,a5
1f0: fe442703 lw a4,-28(s0)
1f4: 00e7a023 sw a4,0(a5)
1f8: fe842783 lw a5,-24(s0)
1fc: 00178793 addi a5,a5,1
200: fef42423 sw a5,-24(s0)
204: fd842703 lw a4,-40(s0)
208: fec42783 lw a5,-20(s0)
20c: 40f707b3 sub a5,a4,a5
210: fff78793 addi a5,a5,-1
214: fe842703 lw a4,-24(s0)
218: f4f748e3 blt a4,a5,168 <sort+0x24>
21c: fec42783 lw a5,-20(s0)
220: 00178793 addi a5,a5,1
224: fef42623 sw a5,-20(s0)
228: fd842783 lw a5,-40(s0)
22c: fff78793 addi a5,a5,-1
230: fec42703 lw a4,-20(s0)
234: f2f746e3 blt a4,a5,160 <sort+0x1c>
238: 00000013 addi zero,zero,0
23c: 00078513 addi a0,a5,0
240: 02c12403 lw s0,44(sp)
244: 03010113 addi sp,sp,48
248: 00008067 jalr zero,0(ra)
000000000000024c <main>:
24c: fc010113 addi sp,sp,-64
250: 02112e23 sw ra,60(sp)
254: 02812c23 sw s0,56(sp)
258: 04010413 addi s0,sp,64
25c: 2f802883 lw a7,760(zero) # 2f8 <main+0xac>
260: 2f800713 addi a4,zero,760
264: 00472803 lw a6,4(a4)
268: 2f800713 addi a4,zero,760
26c: 00872503 lw a0,8(a4)
270: 2f800713 addi a4,zero,760
274: 00c72583 lw a1,12(a4)
278: 2f800713 addi a4,zero,760
27c: 01072603 lw a2,16(a4)
280: 2f800713 addi a4,zero,760
284: 01472683 lw a3,20(a4)
288: 2f800713 addi a4,zero,760
28c: 01872703 lw a4,24(a4)
290: 2f800793 addi a5,zero,760
294: 01c7a783 lw a5,28(a5)
298: fd142623 sw a7,-52(s0)
29c: fd042823 sw a6,-48(s0)
2a0: fca42a23 sw a0,-44(s0)
2a4: fcb42c23 sw a1,-40(s0)
2a8: fcc42e23 sw a2,-36(s0)
2ac: fed42023 sw a3,-32(s0)
2b0: fee42223 sw a4,-28(s0)
2b4: fef42423 sw a5,-24(s0)
2b8: fcc40793 addi a5,s0,-52
2bc: 00800593 addi a1,zero,8
2c0: 00078513 addi a0,a5,0
2c4: e81ff0ef jal ra,144 <sort>
2c8: fcc40793 addi a5,s0,-52
2cc: 00800613 addi a2,zero,8
2d0: 00900593 addi a1,zero,9
2d4: 00078513 addi a0,a5,0
2d8: e1dff0ef jal ra,f4 <search>
2dc: fea42623 sw a0,-20(s0)
2e0: fec42783 lw a5,-20(s0)
2e4: 00078513 addi a0,a5,0
2e8: 03c12083 lw ra,60(sp)
2ec: 03812403 lw s0,56(sp)
2f0: 04010113 addi sp,sp,64
2f4: 00008067 jalr zero,0(ra)
80000018 <loop>:
80000018: 00525e63 bge tp,t0,80000034 <exit>
8000001c: 008303b3 add t2,t1,s0
80000020: 0003a483 lw s1,0(t2)
80000024: 009181b3 add gp,gp,s1
80000028: 00440413 addi s0,s0,4
8000002c: 00120213 addi tp,tp,1 # 1 <main-0x7fffffff>
80000030: fe9ff06f jal zero,80000018 <loop>

View File

@@ -1,23 +1,19 @@
test: file format elf64-littleriscv
test: file format elf32-littleriscv
SYMBOL TABLE:
0000000000000000 l d .text 0000000000000000 .text
00000000000002f8 l d .rodata 0000000000000000 .rodata
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 l d .riscv.attributes 0000000000000000 .riscv.attributes
0000000000000000 l df *ABS* 0000000000000000 binary_search.c
0000000000001b18 g *ABS* 0000000000000000 __global_pointer$
00000000000000f4 g F .text 0000000000000050 search
0000000000001318 g .rodata 0000000000000000 __SDATA_BEGIN__
0000000000000144 g F .text 0000000000000108 sort
0000000000000000 *UND* 0000000000000000 _start
0000000000001318 g .rodata 0000000000000000 __BSS_END__
0000000000001318 g .rodata 0000000000000000 __bss_start
000000000000024c g F .text 00000000000000ac main
0000000000001318 g .rodata 0000000000000000 __DATA_BEGIN__
0000000000001318 g .rodata 0000000000000000 _edata
0000000000001318 g .rodata 0000000000000000 _end
0000000000000000 g F .text 00000000000000f4 binary_search
80000000 l d .text 00000000 .text
00000000 l d .riscv.attributes 00000000 .riscv.attributes
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_line_str 00000000 .debug_line_str
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d .debug_str 00000000 .debug_str
00000000 l df *ABS* 00000000 ccSaJ0Sk.o
80000000 l .text 00000000 main
80000018 l .text 00000000 loop
80000034 l .text 00000000 exit
00000000 *UND* 00000000 _start