mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	revamp linux testvector generation for refactoring checkpoint generation
This commit is contained in:
		
							parent
							
								
									5d60a3a9df
								
							
						
					
					
						commit
						d445095f1b
					
				@ -1,25 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# Oftentimes this script runs so long you'll go to sleep.
 | 
			
		||||
# But you don't want the script to die when your computer goes to sleep.
 | 
			
		||||
# So consider invoking this with nohup (i.e. "nohup ./logAllBuildroot.sh")
 | 
			
		||||
# You can run "tail -f nohup.out" to see what would've
 | 
			
		||||
# outputted to the terminal if you didn't use nohup
 | 
			
		||||
 | 
			
		||||
# use on tera.
 | 
			
		||||
customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64"
 | 
			
		||||
# use on other systems
 | 
			
		||||
#customQemu="qemu-system-riscv64"
 | 
			
		||||
imageDir="../buildroot-image-output"
 | 
			
		||||
intermedDir="../linux-testvectors/intermediate-outputs"
 | 
			
		||||
outDir="../linux-testvectors"
 | 
			
		||||
 | 
			
		||||
# - Logs info needed by buildroot testbench
 | 
			
		||||
 | 
			
		||||
read -p "Warning: running this script will overwrite the contents of $outDir/all.txt.
 | 
			
		||||
Would you like to proceed? (y/n) " -n 1 -r
 | 
			
		||||
echo
 | 
			
		||||
if [[ $REPLY =~ ^[Yy]$ ]]
 | 
			
		||||
then
 | 
			
		||||
    ($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -rtc clock=vm -icount shift=1 -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1236 -S 2>&1 >/dev/null | ./parse_qemu.py | ./parseNew.py | ./remove_dup.awk > $outDir/all.txt) & riscv64-unknown-elf-gdb -x gdbinit_qemulog
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -1,35 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# Oftentimes this script runs so long you'll go to sleep.
 | 
			
		||||
# But you don't want the script to die when your computer goes to sleep.
 | 
			
		||||
# So consider invoking this with nohup (i.e. "nohup ./logAllBuildroot.sh")
 | 
			
		||||
# You can run "tail -f nohup.out" to see what would've
 | 
			
		||||
# outputted to the terminal if you didn't use nohup
 | 
			
		||||
 | 
			
		||||
# use on tera.
 | 
			
		||||
customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64"
 | 
			
		||||
# use on other systems
 | 
			
		||||
#customQemu="qemu-system-riscv64"
 | 
			
		||||
 | 
			
		||||
instrs=50000000
 | 
			
		||||
 | 
			
		||||
imageDir="../buildroot-image-output"
 | 
			
		||||
outDir="../linux-testvectors/checkpoint$instrs"
 | 
			
		||||
intermedDir="$outDir/intermediate-outputs"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
read -p "This scripts is going to create a checkpoint at $instrs instrs.
 | 
			
		||||
Is that what you wanted? (y/n) " -n 1 -r
 | 
			
		||||
echo
 | 
			
		||||
if [[ $REPLY =~ ^[Yy]$ ]]
 | 
			
		||||
then
 | 
			
		||||
    mkdir -p $outDir
 | 
			
		||||
    mkdir -p $intermedDir
 | 
			
		||||
    # Simulate QEMU, parse QEMU trace, run GDB script which logs a bunch of data at the checkpoint
 | 
			
		||||
    ($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -rtc clock=vm -icount shift=1 -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1240 -S 2>&1 1>&2 | ./parse_qemu.py | ./parseNew.py | ./remove_dup.awk > $intermedDir/rawTrace.txt) & riscv64-unknown-elf-gdb -x ./checkpoint.gdb -ex "createCheckpoint $instrs \"$intermedDir\""
 | 
			
		||||
    # Post-Process GDB outputs
 | 
			
		||||
    ./parseState.py "$outDir"
 | 
			
		||||
    ./fix_mem.py "$intermedDir/ramGDB.txt" "$outDir/ram.txt"
 | 
			
		||||
else
 | 
			
		||||
    echo "You can change the number of instructions by editing the \"instrs\" variable in this script."
 | 
			
		||||
    echo "Have a nice day!"
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										30
									
								
								wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										30
									
								
								wally-pipelined/linux-testgen/testvector-generation/checkpoint.gdb
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
define createCheckpoint 
 | 
			
		||||
define genCheckpoint 
 | 
			
		||||
    # GDB config
 | 
			
		||||
    set pagination off
 | 
			
		||||
    set logging overwrite on
 | 
			
		||||
@ -11,24 +11,32 @@ define createCheckpoint
 | 
			
		||||
    # QEMU Config
 | 
			
		||||
    maintenance packet Qqemu.PhyMemMode:1
 | 
			
		||||
 | 
			
		||||
    # Argument Parsing
 | 
			
		||||
    set $statePath=$arg1
 | 
			
		||||
    set $ramPath=$arg1
 | 
			
		||||
    eval "set $statePath = \"%s/stateGDB.txt\"", $statePath
 | 
			
		||||
    eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath
 | 
			
		||||
 | 
			
		||||
    # Symbol file
 | 
			
		||||
    file ../buildroot-image-output/vmlinux
 | 
			
		||||
 | 
			
		||||
    # Argument Parsing
 | 
			
		||||
    set $tcpPort=$arg0
 | 
			
		||||
    set $instrCount=$arg1
 | 
			
		||||
    set $statePath=$arg2
 | 
			
		||||
    set $ramPath=$arg3
 | 
			
		||||
    set $checkPC=$arg4
 | 
			
		||||
    set $checkPCoccurences=$arg5
 | 
			
		||||
    eval "set $statePath = \"%s/stateGDB.txt\"", $statePath
 | 
			
		||||
    eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    # Step over reset vector into actual code
 | 
			
		||||
    stepi 1000
 | 
			
		||||
    stepi 100
 | 
			
		||||
    # Set breakpoint for where to stop
 | 
			
		||||
    b do_idle
 | 
			
		||||
    # Proceed to checkpoint 
 | 
			
		||||
    printf "GDB proceeding to checkpoint at %d instrs\n", $arg0
 | 
			
		||||
    stepi $arg0-1000
 | 
			
		||||
    printf "GDB proceeding to checkpoint at %d instrs\n", $instrCount
 | 
			
		||||
    #stepi $instrCount-1000
 | 
			
		||||
    b *$checkPC
 | 
			
		||||
    ignore 2 $checkPCoccurences
 | 
			
		||||
    c
 | 
			
		||||
 
 | 
			
		||||
    printf "Reached checkpoint at %d instrs\n", $arg0
 | 
			
		||||
    printf "Reached checkpoint at %d instrs\n", $instrCount
 | 
			
		||||
 | 
			
		||||
    # Log all registers to a file
 | 
			
		||||
    printf "GDB storing state to %s\n", $statePath
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,18 @@
 | 
			
		||||
set pagination off
 | 
			
		||||
file ../buildroot-image-output/fw_jump.elf
 | 
			
		||||
file ../buildroot-image-output/vmlinux
 | 
			
		||||
target extended-remote :1237
 | 
			
		||||
b *0x80200040
 | 
			
		||||
c
 | 
			
		||||
file ../buildroot-image-output/vmlinux
 | 
			
		||||
#del 1
 | 
			
		||||
#stepi 500
 | 
			
		||||
#b irqchip_plic_warm_init
 | 
			
		||||
#c
 | 
			
		||||
#b plic_init
 | 
			
		||||
#c
 | 
			
		||||
b do_idle
 | 
			
		||||
c
 | 
			
		||||
#b do_idle
 | 
			
		||||
#c
 | 
			
		||||
#b *0xffffffff80202e58
 | 
			
		||||
#ignore 2 87
 | 
			
		||||
#c
 | 
			
		||||
#del 2
 | 
			
		||||
 | 
			
		||||
@ -1,11 +0,0 @@
 | 
			
		||||
set pagination off
 | 
			
		||||
target extended-remote :1236
 | 
			
		||||
file ../buildroot-image-output/vmlinux
 | 
			
		||||
stepi 1000
 | 
			
		||||
b do_idle
 | 
			
		||||
ignore 1 2
 | 
			
		||||
c
 | 
			
		||||
# using 3 continues didn't work because the first breakpoint hit causes a pipe break error
 | 
			
		||||
set confirm off
 | 
			
		||||
kill
 | 
			
		||||
q
 | 
			
		||||
							
								
								
									
										56
									
								
								wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										56
									
								
								wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.gdb
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,56 @@
 | 
			
		||||
define genCheckpoint 
 | 
			
		||||
    # GDB config
 | 
			
		||||
    set pagination off
 | 
			
		||||
    set logging overwrite on
 | 
			
		||||
    set logging redirect on
 | 
			
		||||
    set confirm off
 | 
			
		||||
 | 
			
		||||
    # Argument Parsing
 | 
			
		||||
    set $tcpPort=$arg0
 | 
			
		||||
    set $instrCount=$arg1
 | 
			
		||||
    set $statePath=$arg2
 | 
			
		||||
    set $ramPath=$arg3
 | 
			
		||||
    set $checkPC=$arg4
 | 
			
		||||
    set $checkPCoccurences=$arg5
 | 
			
		||||
    eval "set $statePath = \"%s/stateGDB.txt\"", $statePath
 | 
			
		||||
    eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath
 | 
			
		||||
 | 
			
		||||
    # Connect to QEMU session
 | 
			
		||||
    eval "target extended-remote :%d",$tcpPort
 | 
			
		||||
 | 
			
		||||
    # QEMU Config
 | 
			
		||||
    maintenance packet Qqemu.PhyMemMode:1
 | 
			
		||||
 | 
			
		||||
    # Symbol file
 | 
			
		||||
    file ../buildroot-image-output/vmlinux
 | 
			
		||||
 | 
			
		||||
    # Step over reset vector into actual code
 | 
			
		||||
    stepi 100
 | 
			
		||||
    # Set breakpoint for where to stop
 | 
			
		||||
    b do_idle
 | 
			
		||||
    # Proceed to checkpoint 
 | 
			
		||||
    printf "GDB proceeding to checkpoint at %d instrs\n", $instrCount
 | 
			
		||||
    #stepi $instrCount-1000
 | 
			
		||||
    b *$checkPC
 | 
			
		||||
    ignore 2 $checkPCoccurences
 | 
			
		||||
    c
 | 
			
		||||
 
 | 
			
		||||
    printf "Reached checkpoint at %d instrs\n", $instrCount
 | 
			
		||||
 | 
			
		||||
    # Log all registers to a file
 | 
			
		||||
    printf "GDB storing state to %s\n", $statePath
 | 
			
		||||
    eval "set logging file %s", $statePath
 | 
			
		||||
    set logging on
 | 
			
		||||
    info all-registers
 | 
			
		||||
    set logging off
 | 
			
		||||
 | 
			
		||||
    # Log main memory to a file
 | 
			
		||||
    printf "GDB storing RAM to %s\n", $ramPath
 | 
			
		||||
    eval "set logging file %s", $ramPath
 | 
			
		||||
    set logging on
 | 
			
		||||
    x/134217728xb 0x80000000
 | 
			
		||||
    set logging off
 | 
			
		||||
    
 | 
			
		||||
    kill
 | 
			
		||||
    q
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										39
									
								
								wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								wally-pipelined/linux-testgen/testvector-generation/genCheckpoint.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
source  genSettings.sh
 | 
			
		||||
tcpPort=1236
 | 
			
		||||
 | 
			
		||||
instrs=8500000
 | 
			
		||||
checkOutDir="$outDir/checkpoint$instrs"
 | 
			
		||||
checkIntermedDir="$checkOutDir/intermediate-outputs"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
read -p "This scripts is going to create a checkpoint at $instrs instrs.
 | 
			
		||||
Is that what you wanted? (y/n) " -n 1 -r
 | 
			
		||||
echo
 | 
			
		||||
if [[ $REPLY =~ ^[Yy]$ ]]
 | 
			
		||||
then
 | 
			
		||||
    mkdir -p $checkOutDir
 | 
			
		||||
    mkdir -p $checkIntermedDir
 | 
			
		||||
    instr=$(sed "${instrs}q;d" "../linux-testvectors/all.txt")
 | 
			
		||||
    echo "Found ${instrs}th instr: ${instr}."
 | 
			
		||||
    pc=$(echo $instr | cut -d " " -f1)
 | 
			
		||||
    asm=$(echo $instr | cut -d " " -f2)
 | 
			
		||||
    occurences=$(($(head -$instrs "../linux-testvectors/all.txt" | grep -c "${pc} ${asm}")-1))
 | 
			
		||||
    echo "It occurs ${occurences} times before the ${instrs}th instr." 
 | 
			
		||||
    # Simulate QEMU, parse QEMU trace, run GDB script which logs a bunch of data at the checkpoint
 | 
			
		||||
    ($customQemu \
 | 
			
		||||
    -M virt \
 | 
			
		||||
    -nographic \
 | 
			
		||||
    -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \
 | 
			
		||||
    -singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on,rr=replay,rrfile="$intermedDir/$recordFile" \
 | 
			
		||||
    -gdb tcp::$tcpPort -S) \
 | 
			
		||||
    & riscv64-unknown-elf-gdb -quiet -x genCheckpoint.gdb -ex "genCheckpoint $tcpPort $instrs \"$checkIntermedDir\" 0x$pc $occurences"
 | 
			
		||||
    # Post-Process GDB outputs
 | 
			
		||||
    ./parseState.py "$checkOutDir"
 | 
			
		||||
    ./fix_mem.py "$intermedDir/ramGDB.txt" "$checkOutDir/ram.txt"
 | 
			
		||||
    tail -n+$(($instrs-9)) "$outDir/$traceFile" > "$checkOutDir/$traceFile"
 | 
			
		||||
else
 | 
			
		||||
    echo "You can change the number of instructions by editing the \"instrs\" variable in this script."
 | 
			
		||||
    echo "Have a nice day!"
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										44
									
								
								wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										44
									
								
								wally-pipelined/linux-testgen/testvector-generation/genInitMem.gdb
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
define genInitMem 
 | 
			
		||||
    # GDB config
 | 
			
		||||
    set pagination off
 | 
			
		||||
    set logging overwrite on
 | 
			
		||||
    set logging redirect on
 | 
			
		||||
    set confirm off
 | 
			
		||||
 | 
			
		||||
    # Argument Parsing
 | 
			
		||||
    set $tcpPort=$arg0
 | 
			
		||||
    set $bootmemPath=$arg1
 | 
			
		||||
    set $untrimmedBootmemPath=$arg1
 | 
			
		||||
    set $ramPath=$arg1
 | 
			
		||||
    eval "set $bootmemPath = \"%s/bootmemGDB.txt\"", $bootmemPath
 | 
			
		||||
    eval "set $untrimmedBootmemPath = \"%s/untrimmedBootmemGDB.txt\"", $untrimmedBootmemPath
 | 
			
		||||
    eval "set $ramPath = \"%s/ramGDB.txt\"", $ramPath
 | 
			
		||||
 | 
			
		||||
    # Connect to QEMU session
 | 
			
		||||
    eval "target extended-remote :%d",$tcpPort
 | 
			
		||||
 | 
			
		||||
    # QEMU Config
 | 
			
		||||
    maintenance packet Qqemu.PhyMemMode:1
 | 
			
		||||
 | 
			
		||||
    printf "Creating %s\n",$bootmemPath
 | 
			
		||||
    eval "set logging file %s", $bootmemPath
 | 
			
		||||
    set logging on
 | 
			
		||||
    x/4096xb 0x1000
 | 
			
		||||
    set logging off
 | 
			
		||||
 | 
			
		||||
    printf "Creating %s\n",$untrimmedBootmemPath
 | 
			
		||||
    printf "Warning - please verify that the second half of %s is all 0s\n",$untrimmedBootmemPath
 | 
			
		||||
    eval "set logging file %s", $untrimmedBootmemPath
 | 
			
		||||
    set logging on
 | 
			
		||||
    x/8192xb 0x1000
 | 
			
		||||
    set logging off
 | 
			
		||||
 | 
			
		||||
    printf "Creating %s\n", $ramPath
 | 
			
		||||
    eval "set logging file %s", $ramPath
 | 
			
		||||
    set logging on
 | 
			
		||||
    x/134217728xb 0x80000000
 | 
			
		||||
    set logging off
 | 
			
		||||
    
 | 
			
		||||
    kill
 | 
			
		||||
    q
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										27
									
								
								wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								wally-pipelined/linux-testgen/testvector-generation/genInitMem.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
source genSettings.sh
 | 
			
		||||
tcpPort=1235
 | 
			
		||||
 | 
			
		||||
read -p "Warning: running this script will overwrite the contents of memory dumps needed for simulation.
 | 
			
		||||
Would you like to proceed? (y/n) " -n 1 -r
 | 
			
		||||
echo
 | 
			
		||||
if [[ $REPLY =~ ^[Yy]$ ]]
 | 
			
		||||
then
 | 
			
		||||
    ($customQemu \
 | 
			
		||||
    -M virt \
 | 
			
		||||
    -nographic \
 | 
			
		||||
    -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \
 | 
			
		||||
    -gdb tcp::$tcpPort -S 2>/dev/null >/dev/null) \
 | 
			
		||||
    & riscv64-unknown-elf-gdb -quiet -x genInitMem.gdb -ex "genInitMem $tcpPort \"$intermedDir\""
 | 
			
		||||
 | 
			
		||||
    echo "Translating Mem from GDB to Questa format"
 | 
			
		||||
    ./fix_mem.py "$intermedDir/bootmemGDB.txt" "$outDir/bootmem.txt"
 | 
			
		||||
    ./fix_mem.py "$intermedDir/ramGDB.txt"     "$outDir/ram.txt"
 | 
			
		||||
    echo "Done"
 | 
			
		||||
 | 
			
		||||
    echo "Creating debugging objdump of linux image"
 | 
			
		||||
    riscv64-unknown-elf-objdump -D $imageDir/vmlinux > $outDir/vmlinux.objdump
 | 
			
		||||
    extractFunctionRadix.sh $outDir/vmlinux.objdump
 | 
			
		||||
    echo "Done"
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										11
									
								
								wally-pipelined/linux-testgen/testvector-generation/genSettings.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								wally-pipelined/linux-testgen/testvector-generation/genSettings.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# Warning! This is Tera-specific absolute path
 | 
			
		||||
# *** on the long term we'll want to include QEMU in the addins folder
 | 
			
		||||
export customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64"
 | 
			
		||||
export imageDir="../buildroot-image-output"
 | 
			
		||||
export outDir="../linux-testvectors-experimental"
 | 
			
		||||
export intermedDir="$outDir/intermediate-outputs"
 | 
			
		||||
export traceFile="all.txt"
 | 
			
		||||
export recordFile="all.qemu"
 | 
			
		||||
export tcpPort=1234
 | 
			
		||||
							
								
								
									
										24
									
								
								wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								wally-pipelined/linux-testgen/testvector-generation/genTrace.gdb
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
define genTrace
 | 
			
		||||
    # Arguments
 | 
			
		||||
    set $tcpPort=$arg0    
 | 
			
		||||
 | 
			
		||||
    # GDB config
 | 
			
		||||
    set pagination off
 | 
			
		||||
    set logging overwrite on
 | 
			
		||||
    set logging redirect on
 | 
			
		||||
    set confirm off
 | 
			
		||||
 | 
			
		||||
    # Connect to QEMU session
 | 
			
		||||
    eval "target extended-remote :%d",$tcpPort
 | 
			
		||||
    
 | 
			
		||||
    # Symbol Files
 | 
			
		||||
    file ../buildroot-image-output/vmlinux
 | 
			
		||||
 | 
			
		||||
    # Run until Linux login prompt
 | 
			
		||||
    b do_idle
 | 
			
		||||
    ignore 1 2
 | 
			
		||||
    c
 | 
			
		||||
 | 
			
		||||
    kill
 | 
			
		||||
    q
 | 
			
		||||
emd
 | 
			
		||||
							
								
								
									
										24
									
								
								wally-pipelined/linux-testgen/testvector-generation/genTrace.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								wally-pipelined/linux-testgen/testvector-generation/genTrace.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
source genSettings.sh
 | 
			
		||||
tcpPort=1234
 | 
			
		||||
 | 
			
		||||
read -p "Warning: running this script will overwrite the contents of:
 | 
			
		||||
  $outDir/$traceFile
 | 
			
		||||
  $outDir/$recordFile
 | 
			
		||||
Would you like to proceed? (y/n) " -n 1 -r
 | 
			
		||||
echo
 | 
			
		||||
if [[ $REPLY =~ ^[Yy]$ ]]
 | 
			
		||||
then
 | 
			
		||||
    mkdir -p $outDir
 | 
			
		||||
    mkdir -p $intermedDir
 | 
			
		||||
    ($customQemu \
 | 
			
		||||
    -M virt \
 | 
			
		||||
    -nographic -serial /dev/null \
 | 
			
		||||
    -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \
 | 
			
		||||
    -singlestep -rtc clock=vm -icount shift=1,align=off,sleep=on,rr=record,rrfile="$intermedDir/$recordFile" \
 | 
			
		||||
    -d nochain,cpu,in_asm \
 | 
			
		||||
    -gdb tcp::$tcpPort -S \
 | 
			
		||||
    2>&1 >/dev/null | ./parseQemuToGDB.py | ./parseGDBtoTrace.py | ./remove_dup.awk > "$outDir/$traceFile") \
 | 
			
		||||
    & riscv64-unknown-elf-gdb -quiet -x genTrace.gdb -ex "genTrace $tcpPort"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -1,28 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# use on tera.
 | 
			
		||||
customQemu="/courses/e190ax/qemu_sim/rv64_initrd/qemu_experimental/qemu/build/qemu-system-riscv64"
 | 
			
		||||
# use on other systems
 | 
			
		||||
#customQemu="qemu-system-riscv64"
 | 
			
		||||
 | 
			
		||||
imageDir="../buildroot-image-output"
 | 
			
		||||
testVecDir="../linux-testvectors"
 | 
			
		||||
 | 
			
		||||
read -p "Warning: running this script will overwrite the contents of memory dumps needed for simulation.
 | 
			
		||||
Would you like to proceed? (y/n) " -n 1 -r
 | 
			
		||||
echo
 | 
			
		||||
if [[ $REPLY =~ ^[Yy]$ ]]
 | 
			
		||||
then
 | 
			
		||||
    ($customQemu -M virt -nographic -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio -d nochain,cpu,in_asm -serial /dev/null -singlestep -gdb tcp::1235 -S 2>/dev/null >/dev/null) &
 | 
			
		||||
    riscv64-unknown-elf-gdb -x gdbinit_mem
 | 
			
		||||
    echo "Translating Mem from GDB to Questa format"
 | 
			
		||||
    ./fix_mem.py "$testVecDir/intermediate-outputs/bootmemGDB.txt" "$testVecDir/bootmem.txt"
 | 
			
		||||
    ./fix_mem.py "$testVecDir/intermediate-outputs/ramGDB.txt" "$testVecDir/ram.txt"
 | 
			
		||||
    echo "Done"
 | 
			
		||||
 | 
			
		||||
    echo "Creating debugging objdump of linux image"
 | 
			
		||||
 | 
			
		||||
    riscv64-unknown-elf-objdump -D $imageDir/vmlinux > $testVecDir/vmlinux.objdump
 | 
			
		||||
    extractFunctionRadix.sh $testVecDir/vmlinux.objdump
 | 
			
		||||
    echo "Done"
 | 
			
		||||
fi
 | 
			
		||||
@ -110,6 +110,7 @@ def parseRegs(l):
 | 
			
		||||
# Main Code #
 | 
			
		||||
#############
 | 
			
		||||
for l in fileinput.input():
 | 
			
		||||
    #sys.stderr.write(l)
 | 
			
		||||
    if l.startswith('qemu-system-riscv64: QEMU: Terminated via GDBstub'):
 | 
			
		||||
        break
 | 
			
		||||
    elif l.startswith('IN:'):
 | 
			
		||||
@ -34,7 +34,7 @@ stateGDBpath = outDir+'intermediate-outputs/stateGDB.txt'
 | 
			
		||||
if not os.path.exists(stateGDBpath):
 | 
			
		||||
    sys.exit('Error input file '+stateGDBpath+'not found')
 | 
			
		||||
 | 
			
		||||
singleCSRs = ['mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus']
 | 
			
		||||
singleCSRs = ['pc','mip','mie','mscratch','mcause','mepc','mtvec','medeleg','mideleg','sscratch','scause','sepc','stvec','sedeleg','sideleg','satp','mstatus']
 | 
			
		||||
thirtyTwoBitCSRs = ['mcounteren','scounteren']
 | 
			
		||||
listCSRs = ['hpmcounter','pmpaddr']
 | 
			
		||||
pmpcfg = ['pmpcfg']
 | 
			
		||||
@ -90,7 +90,7 @@ with open(stateGDBpath, 'r') as stateGDB:
 | 
			
		||||
                outFileName = 'checkpoint-'+name.upper().strip('0123456789')
 | 
			
		||||
                outFile = open(outDir+outFileName, 'a')
 | 
			
		||||
                fourPmp = int(val,16)
 | 
			
		||||
                for i in range(4):
 | 
			
		||||
                for i in range(3,-1,-1):
 | 
			
		||||
                    byte = (fourPmp >> 4*i) & 0xf
 | 
			
		||||
                    outFile.write(hex(byte)[2:]+'\n')
 | 
			
		||||
                outFile.close()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user