mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Merge branch 'main' of https://github.com/openhwgroup/cvw
This commit is contained in:
commit
4e20d08f0c
2
sim/coverage
Executable file
2
sim/coverage
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
# recompile coverage tests and run coverage including them
|
||||||
|
pushd $WALLY/tests/coverage; make; popd; ./regression-wally -coverage
|
@ -65,14 +65,20 @@ add wave -noupdate -group {Execution Stage} /testbench/dut/core/ifu/PCE
|
|||||||
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ifu/InstrE
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ifu/InstrE
|
||||||
add wave -noupdate -group {Execution Stage} /testbench/InstrEName
|
add wave -noupdate -group {Execution Stage} /testbench/InstrEName
|
||||||
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/c/InstrValidE
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/c/InstrValidE
|
||||||
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/SrcAE
|
||||||
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/SrcBE
|
||||||
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/ALUResultE
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/FunctionName/FunctionName/FunctionName
|
add wave -noupdate -expand -group {Memory Stage} /testbench/FunctionName/FunctionName/FunctionName
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrValidM
|
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrValidM
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/PCM
|
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/PCM
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrM
|
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/InstrM
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/InstrMName
|
add wave -noupdate -expand -group {Memory Stage} /testbench/InstrMName
|
||||||
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/lsu/IEUAdrM
|
add wave -noupdate -expand -group {Memory Stage} /testbench/dut/core/lsu/IEUAdrM
|
||||||
|
add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/ReadDataM
|
||||||
|
add wave -noupdate -expand -group lsu /testbench/dut/core/lsu/WriteDataM
|
||||||
add wave -noupdate -group {WriteBack stage} /testbench/InstrW
|
add wave -noupdate -group {WriteBack stage} /testbench/InstrW
|
||||||
add wave -noupdate -group {WriteBack stage} /testbench/InstrWName
|
add wave -noupdate -group {WriteBack stage} /testbench/InstrWName
|
||||||
|
add wave -noupdate -group {Execution Stage} /testbench/dut/core/ieu/dp/ResultW
|
||||||
add wave -noupdate -group CSRs /testbench/dut/core/priv/priv/csr/csrm/MCAUSE_REGW
|
add wave -noupdate -group CSRs /testbench/dut/core/priv/priv/csr/csrm/MCAUSE_REGW
|
||||||
add wave -noupdate -group CSRs /testbench/dut/core/priv/priv/csr/MCOUNTEREN_REGW
|
add wave -noupdate -group CSRs /testbench/dut/core/priv/priv/csr/MCOUNTEREN_REGW
|
||||||
add wave -noupdate -group CSRs /testbench/dut/core/priv/priv/csr/MCOUNTINHIBIT_REGW
|
add wave -noupdate -group CSRs /testbench/dut/core/priv/priv/csr/MCOUNTINHIBIT_REGW
|
||||||
|
7
src/cache/cachefsm.sv
vendored
7
src/cache/cachefsm.sv
vendored
@ -106,8 +106,7 @@ module cachefsm import cvw::*; #(parameter cvw_t P,
|
|||||||
assign FlushFlag = FlushAdrFlag & FlushWayFlag;
|
assign FlushFlag = FlushAdrFlag & FlushWayFlag;
|
||||||
|
|
||||||
// outputs for the performance counters.
|
// outputs for the performance counters.
|
||||||
assign CacheAccess = (|CacheRW) & ((CurrState == STATE_READY & ~Stall & ~FlushStage) |
|
assign CacheAccess = (|CacheRW) & ((CurrState == STATE_READY & ~Stall & ~FlushStage) | (CurrState == STATE_READ_HOLD & ~Stall & ~FlushStage)); // exclusion-tag: icache CacheW
|
||||||
(CurrState == STATE_READ_HOLD & ~Stall & ~FlushStage)); // exclusion-tag: icache CacheW
|
|
||||||
assign CacheMiss = CacheAccess & ~CacheHit;
|
assign CacheMiss = CacheAccess & ~CacheHit;
|
||||||
|
|
||||||
// special case on reset. When the fsm first exists reset the
|
// special case on reset. When the fsm first exists reset the
|
||||||
@ -172,9 +171,9 @@ module cachefsm import cvw::*; #(parameter cvw_t P,
|
|||||||
assign ClearValid = P.ZICBOM_SUPPORTED & ((CurrState == STATE_READY & CMOp[0] & CacheHit) |
|
assign ClearValid = P.ZICBOM_SUPPORTED & ((CurrState == STATE_READY & CMOp[0] & CacheHit) |
|
||||||
(CurrState == STATE_CMO_WRITEBACK & CMOp[2] & CacheBusAck));
|
(CurrState == STATE_CMO_WRITEBACK & CMOp[2] & CacheBusAck));
|
||||||
// coverage off -item e 1 -fecexprrow 8
|
// coverage off -item e 1 -fecexprrow 8
|
||||||
assign LRUWriteEn = (CurrState == STATE_READY & (AnyHit | CMOZeroNoEviction)) |
|
assign LRUWriteEn = ((CurrState == STATE_READY & (AnyHit | CMOZeroNoEviction)) |
|
||||||
(P.ZICBOZ_SUPPORTED & CurrState == STATE_WRITEBACK & CMOp[3] & CacheBusAck) |
|
(P.ZICBOZ_SUPPORTED & CurrState == STATE_WRITEBACK & CMOp[3] & CacheBusAck) |
|
||||||
(CurrState == STATE_WRITE_LINE) & ~FlushStage;
|
(CurrState == STATE_WRITE_LINE)) & ~FlushStage;
|
||||||
// exclusion-tag-start: icache flushdirtycontrols
|
// exclusion-tag-start: icache flushdirtycontrols
|
||||||
assign SetDirty = (CurrState == STATE_READY & (AnyUpdateHit | CMOZeroNoEviction)) | // exclusion-tag: icache SetDirty
|
assign SetDirty = (CurrState == STATE_READY & (AnyUpdateHit | CMOZeroNoEviction)) | // exclusion-tag: icache SetDirty
|
||||||
(CurrState == STATE_WRITE_LINE & (CacheRW[0])) |
|
(CurrState == STATE_WRITE_LINE & (CacheRW[0])) |
|
||||||
|
@ -182,7 +182,6 @@ module controller import cvw::*; #(parameter cvw_t P) (
|
|||||||
((P.ZICBOZ_SUPPORTED & InstrD[31:20] == 12'd4 & ENVCFG_CBE[3]) |
|
((P.ZICBOZ_SUPPORTED & InstrD[31:20] == 12'd4 & ENVCFG_CBE[3]) |
|
||||||
(P.ZICBOM_SUPPORTED & ((InstrD[31:20] == 12'd0 & (ENVCFG_CBE[1:0] != 2'b00))) |
|
(P.ZICBOM_SUPPORTED & ((InstrD[31:20] == 12'd0 & (ENVCFG_CBE[1:0] != 2'b00))) |
|
||||||
(InstrD[31:20] == 12'd1 | InstrD[31:20] == 12'd2) & ENVCFG_CBE[2]));
|
(InstrD[31:20] == 12'd1 | InstrD[31:20] == 12'd2) & ENVCFG_CBE[2]));
|
||||||
// *** need to get with enable bits such as MENVCFG_CBZE
|
|
||||||
assign AFunctD = (Funct3D == 3'b010) | (P.XLEN == 64 & Funct3D == 3'b011);
|
assign AFunctD = (Funct3D == 3'b010) | (P.XLEN == 64 & Funct3D == 3'b011);
|
||||||
assign AMOFunctD = (InstrD[31:27] == 5'b00001) |
|
assign AMOFunctD = (InstrD[31:27] == 5'b00001) |
|
||||||
(InstrD[31:27] == 5'b00000) |
|
(InstrD[31:27] == 5'b00000) |
|
||||||
|
@ -57,13 +57,13 @@ module pmachecker import cvw::*; #(parameter cvw_t P) (
|
|||||||
adrdecs #(P) adrdecs(PhysicalAddress, AccessRW, AccessRX, AccessRWX, Size, SelRegions);
|
adrdecs #(P) adrdecs(PhysicalAddress, AccessRW, AccessRX, AccessRWX, Size, SelRegions);
|
||||||
|
|
||||||
// Only non-core RAM/ROM memory regions are cacheable. PBMT can override cachable; NC and IO are uncachable
|
// Only non-core RAM/ROM memory regions are cacheable. PBMT can override cachable; NC and IO are uncachable
|
||||||
assign CacheableRegion = SelRegions[8] | SelRegions[7] | SelRegions[6];
|
assign CacheableRegion = SelRegions[8] | SelRegions[7] | SelRegions[6]; // exclusion-tag: unused-cachable
|
||||||
assign Cacheable = (PBMemoryType == 2'b00) ? CacheableRegion : 0; // exclusion-tag: unused-cachable
|
assign Cacheable = (PBMemoryType == 2'b00) ? CacheableRegion : 0;
|
||||||
|
|
||||||
// Nonidemdempotent means access could have side effect and must not be done speculatively or redundantly
|
// Nonidemdempotent means access could have side effect and must not be done speculatively or redundantly
|
||||||
// I/O is nonidempotent. PBMT can override PMA; NC is idempotent and IO is non-idempotent
|
// I/O is nonidempotent. PBMT can override PMA; NC is idempotent and IO is non-idempotent
|
||||||
assign IdempotentRegion = SelRegions[10] | SelRegions[9] | SelRegions[8] | SelRegions[7] | SelRegions[6];
|
assign IdempotentRegion = SelRegions[10] | SelRegions[9] | SelRegions[8] | SelRegions[7] | SelRegions[6]; // exclusion-tag: unused-idempotent
|
||||||
assign Idempotent = (PBMemoryType == 2'b00) ? IdempotentRegion : (PBMemoryType == 2'b01); // exclusion-tag: unused-idempotent
|
assign Idempotent = (PBMemoryType == 2'b00) ? IdempotentRegion : (PBMemoryType == 2'b01);
|
||||||
|
|
||||||
// Atomic operations are only allowed on RAM
|
// Atomic operations are only allowed on RAM
|
||||||
assign AtomicAllowed = SelRegions[10] | SelRegions[8] | SelRegions[6]; // exclusion-tag: unused-atomic
|
assign AtomicAllowed = SelRegions[10] | SelRegions[8] | SelRegions[6]; // exclusion-tag: unused-atomic
|
||||||
|
@ -110,7 +110,7 @@ module tlb import cvw::*; #(parameter cvw_t P,
|
|||||||
.TLBMiss, .TLBHit, .TLBPageFault,
|
.TLBMiss, .TLBHit, .TLBPageFault,
|
||||||
.UpdateDA, .SV39Mode, .Translate, .PTE_N, .PBMemoryType);
|
.UpdateDA, .SV39Mode, .Translate, .PTE_N, .PBMemoryType);
|
||||||
|
|
||||||
tlblru #(TLB_ENTRIES) lru(.clk, .reset, .TLBWrite, .TLBFlush, .Matches, .CAMHit, .WriteEnables);
|
tlblru #(TLB_ENTRIES) lru(.clk, .reset, .TLBWrite, .TLBFlush, .Matches, .TLBHit, .WriteEnables);
|
||||||
tlbcam #(P, TLB_ENTRIES, P.VPN_BITS + P.ASID_BITS, P.VPN_SEGMENT_BITS)
|
tlbcam #(P, TLB_ENTRIES, P.VPN_BITS + P.ASID_BITS, P.VPN_SEGMENT_BITS)
|
||||||
tlbcam(.clk, .reset, .VPN, .PageTypeWriteVal, .SV39Mode, .TLBFlush, .WriteEnables, .PTE_Gs, .PTE_NAPOTs,
|
tlbcam(.clk, .reset, .VPN, .PageTypeWriteVal, .SV39Mode, .TLBFlush, .WriteEnables, .PTE_Gs, .PTE_NAPOTs,
|
||||||
.SATP_ASID, .Matches, .HitPageType, .CAMHit);
|
.SATP_ASID, .Matches, .HitPageType, .CAMHit);
|
||||||
|
@ -32,7 +32,7 @@ module tlblru #(parameter TLB_ENTRIES = 8) (
|
|||||||
input logic TLBWrite,
|
input logic TLBWrite,
|
||||||
input logic TLBFlush,
|
input logic TLBFlush,
|
||||||
input logic [TLB_ENTRIES-1:0] Matches,
|
input logic [TLB_ENTRIES-1:0] Matches,
|
||||||
input logic CAMHit,
|
input logic TLBHit,
|
||||||
output logic [TLB_ENTRIES-1:0] WriteEnables
|
output logic [TLB_ENTRIES-1:0] WriteEnables
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -50,5 +50,5 @@ module tlblru #(parameter TLB_ENTRIES = 8) (
|
|||||||
assign RUBitsAccessed = AccessLines | RUBits;
|
assign RUBitsAccessed = AccessLines | RUBits;
|
||||||
assign AllUsed = &RUBitsAccessed; // if all recently used, then clear to none
|
assign AllUsed = &RUBitsAccessed; // if all recently used, then clear to none
|
||||||
assign RUBitsNext = AllUsed ? 0 : RUBitsAccessed;
|
assign RUBitsNext = AllUsed ? 0 : RUBitsAccessed;
|
||||||
flopenr #(TLB_ENTRIES) lrustate(clk, reset, (CAMHit | TLBWrite), RUBitsNext, RUBits);
|
flopenr #(TLB_ENTRIES) lrustate(clk, reset, (TLBHit | TLBWrite), RUBitsNext, RUBits);
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
# Shreya Sanghai (ssanghai@hmc.edu) 2/28/2022
|
# Shreya Sanghai (ssanghai@hmc.edu) 2/28/2022
|
||||||
# Madeleine Masser-Frye (mmasserfrye@hmc.edu) 1/27/2023
|
# Madeleine Masser-Frye (mmasserfrye@hmc.edu) 1/27/2023
|
||||||
NAME := synth
|
NAME := synth
|
||||||
|
|
||||||
# defaults
|
# defaults
|
||||||
export DESIGN ?= wallypipelinedcore
|
export DESIGN ?= wallypipelinedcore
|
||||||
export FREQ ?= 10000
|
export FREQ ?= 10000
|
||||||
@ -18,9 +17,12 @@ export TECH ?= sky90
|
|||||||
export MAXCORES ?= 1
|
export MAXCORES ?= 1
|
||||||
# MAXOPT turns on flattening, boundary optimization, and retiming
|
# MAXOPT turns on flattening, boundary optimization, and retiming
|
||||||
# The output netlist is hard to interpret, but significantly better PPA
|
# The output netlist is hard to interpret, but significantly better PPA
|
||||||
|
# WRAPPER turns on wrapper generation
|
||||||
export MAXOPT ?= 0
|
export MAXOPT ?= 0
|
||||||
export DRIVE ?= FLOP
|
export DRIVE ?= FLOP
|
||||||
export USESRAM ?= 0
|
export USESRAM ?= 0
|
||||||
|
export WRAPPER ?= 0
|
||||||
|
|
||||||
|
|
||||||
time := $(shell date +%F-%H-%M)
|
time := $(shell date +%F-%H-%M)
|
||||||
hash := $(shell git rev-parse --short HEAD)
|
hash := $(shell git rev-parse --short HEAD)
|
||||||
@ -120,7 +122,9 @@ endif
|
|||||||
|
|
||||||
|
|
||||||
mkwrapper:
|
mkwrapper:
|
||||||
|
ifeq ($(WRAPPER),1)
|
||||||
python3 $(WALLY)/synthDC/scripts/wrapperGen.py $(DESIGN)
|
python3 $(WALLY)/synthDC/scripts/wrapperGen.py $(DESIGN)
|
||||||
|
endif
|
||||||
mkdirecs:
|
mkdirecs:
|
||||||
@echo "DC Synthesis"
|
@echo "DC Synthesis"
|
||||||
@mkdir -p $(OUTPUTDIR)
|
@mkdir -p $(OUTPUTDIR)
|
||||||
@ -150,4 +154,4 @@ clean:
|
|||||||
rm -f power.saif
|
rm -f power.saif
|
||||||
rm -f Synopsys_stack_trace_*.txt
|
rm -f Synopsys_stack_trace_*.txt
|
||||||
rm -f crte_*.txt
|
rm -f crte_*.txt
|
||||||
rm $(WALLY)/synthDC/wrappers/*
|
rm $(WALLY)/synthDC/wrappers/*
|
@ -16,6 +16,7 @@ suppress_message {VER-173}
|
|||||||
# Enable Multicore
|
# Enable Multicore
|
||||||
set_host_options -max_cores $::env(MAXCORES)
|
set_host_options -max_cores $::env(MAXCORES)
|
||||||
|
|
||||||
|
|
||||||
# get outputDir and configDir from environment (Makefile)
|
# get outputDir and configDir from environment (Makefile)
|
||||||
set outputDir $::env(OUTPUTDIR)
|
set outputDir $::env(OUTPUTDIR)
|
||||||
set cfg $::env(CONFIGDIR)
|
set cfg $::env(CONFIGDIR)
|
||||||
@ -23,13 +24,17 @@ set hdl_src "../src"
|
|||||||
set saifpower $::env(SAIFPOWER)
|
set saifpower $::env(SAIFPOWER)
|
||||||
set maxopt $::env(MAXOPT)
|
set maxopt $::env(MAXOPT)
|
||||||
set drive $::env(DRIVE)
|
set drive $::env(DRIVE)
|
||||||
|
set wrapper $::env(WRAPPER)
|
||||||
|
|
||||||
eval file copy -force [glob ${cfg}/*.vh] {$outputDir/hdl/}
|
eval file copy -force [glob ${cfg}/*.vh] {$outputDir/hdl/}
|
||||||
eval file copy -force [glob ${hdl_src}/cvw.sv] {$outputDir/hdl/}
|
eval file copy -force [glob ${hdl_src}/cvw.sv] {$outputDir/hdl/}
|
||||||
#eval file copy -force [glob ${hdl_src}/../fpga/src/wallypipelinedsocwrapper.sv] {$outputDir/hdl/}
|
#eval file copy -force [glob ${hdl_src}/../fpga/src/wallypipelinedsocwrapper.sv] {$outputDir/hdl/}
|
||||||
eval file copy -force [glob ${hdl_src}/*/*.sv] {$outputDir/hdl/}
|
eval file copy -force [glob ${hdl_src}/*/*.sv] {$outputDir/hdl/}
|
||||||
eval file copy -force [glob ${hdl_src}/*/*/*.sv] {$outputDir/hdl/}
|
eval file copy -force [glob ${hdl_src}/*/*/*.sv] {$outputDir/hdl/}
|
||||||
eval file copy -force [glob ${hdl_src}/../synthDC/wrappers/$::env(DESIGN)wrapper.sv] {$outputDir/hdl/}
|
if {$wrapper ==1 } {
|
||||||
|
eval file copy -force [glob ${hdl_src}/../synthDC/wrappers/$::env(DESIGN)wrapper.sv] {$outputDir/hdl/}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Only for FMA class project; comment out when done
|
# Only for FMA class project; comment out when done
|
||||||
# eval file copy -force [glob ${hdl_src}/fma/fma16.v] {hdl/}
|
# eval file copy -force [glob ${hdl_src}/fma/fma16.v] {hdl/}
|
||||||
@ -43,7 +48,11 @@ if { $saifpower == 1 } {
|
|||||||
set my_verilog_files [glob $outputDir/hdl/cvw.sv $outputDir/hdl/*.sv]
|
set my_verilog_files [glob $outputDir/hdl/cvw.sv $outputDir/hdl/*.sv]
|
||||||
|
|
||||||
# Set toplevel
|
# Set toplevel
|
||||||
set my_toplevel $::env(DESIGN)wrapper
|
if { $wrapper == 1 } {
|
||||||
|
set my_toplevel $::env(DESIGN)wrapper
|
||||||
|
} else {
|
||||||
|
set my_toplevel $::env(DESIGN)
|
||||||
|
}
|
||||||
|
|
||||||
# Set number of significant digits
|
# Set number of significant digits
|
||||||
set report_default_significant_digits 6
|
set report_default_significant_digits 6
|
||||||
@ -404,4 +413,4 @@ set t2 [clock seconds]
|
|||||||
set t [expr $t2 - $t1]
|
set t [expr $t2 - $t1]
|
||||||
echo [expr $t/60]
|
echo [expr $t/60]
|
||||||
|
|
||||||
quit
|
quit
|
@ -63,7 +63,7 @@ buf += f"\t{moduleName} #(P) dut(.*);\nendmodule"
|
|||||||
wrapperPath = f"{os.getenv('WALLY')}/synthDC/wrappers/{moduleName}wrapper.sv"
|
wrapperPath = f"{os.getenv('WALLY')}/synthDC/wrappers/{moduleName}wrapper.sv"
|
||||||
|
|
||||||
# clear wrappers directory
|
# clear wrappers directory
|
||||||
os.system(f"rm {os.getenv('WALLY')}/src/wrappers/*")
|
os.system(f"rm {os.getenv('WALLY')}/synthDC/wrappers/*")
|
||||||
|
|
||||||
fout = open(wrapperPath, "w")
|
fout = open(wrapperPath, "w")
|
||||||
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
import cvw::*;
|
|
||||||
`include "config.vh"
|
|
||||||
`include "parameter-defs.vh"
|
|
||||||
module wallypipelinedcorewrapper (
|
|
||||||
input logic clk, reset,
|
|
||||||
// Privileged
|
|
||||||
input logic MTimerInt, MExtInt, SExtInt, MSwInt,
|
|
||||||
input logic [63:0] MTIME_CLINT,
|
|
||||||
// Bus Interface
|
|
||||||
input logic [P.AHBW-1:0] HRDATA,
|
|
||||||
input logic HREADY, HRESP,
|
|
||||||
output logic HCLK, HRESETn,
|
|
||||||
output logic [P.PA_BITS-1:0] HADDR,
|
|
||||||
output logic [P.AHBW-1:0] HWDATA,
|
|
||||||
output logic [P.XLEN/8-1:0] HWSTRB,
|
|
||||||
output logic HWRITE,
|
|
||||||
output logic [2:0] HSIZE,
|
|
||||||
output logic [2:0] HBURST,
|
|
||||||
output logic [3:0] HPROT,
|
|
||||||
output logic [1:0] HTRANS,
|
|
||||||
output logic HMASTLOCK
|
|
||||||
);
|
|
||||||
wallypipelinedcore #(P) dut(.*);
|
|
||||||
endmodule
|
|
@ -44,6 +44,7 @@ string tvpaths[] = '{
|
|||||||
|
|
||||||
string coverage64gc[] = '{
|
string coverage64gc[] = '{
|
||||||
`COVERAGE,
|
`COVERAGE,
|
||||||
|
"tlbNAPOT",
|
||||||
"priv",
|
"priv",
|
||||||
"ieu",
|
"ieu",
|
||||||
"ebu",
|
"ebu",
|
||||||
|
@ -17,7 +17,7 @@ all: $(OBJECTS)
|
|||||||
|
|
||||||
# Change many things if bit width isn't 64
|
# Change many things if bit width isn't 64
|
||||||
%.elf: $(SRCDIR)/%.$(SEXT) WALLY-init-lib.h Makefile
|
%.elf: $(SRCDIR)/%.$(SEXT) WALLY-init-lib.h Makefile
|
||||||
riscv64-unknown-elf-gcc -g -o $@ -march=rv64gqc_zba_zbb_zbc_zbs_zfh -mabi=lp64 -mcmodel=medany \
|
riscv64-unknown-elf-gcc -g -o $@ -march=rv64gqc_zba_zbb_zbc_zbs_zfh_zicboz_zicbop_zicbom -mabi=lp64 -mcmodel=medany \
|
||||||
-nostartfiles -T../../examples/link/link.ld $<
|
-nostartfiles -T../../examples/link/link.ld $<
|
||||||
riscv64-unknown-elf-objdump -S $@ > $@.objdump
|
riscv64-unknown-elf-objdump -S $@ > $@.objdump
|
||||||
riscv64-unknown-elf-elf2hex --bit-width 64 --input $@ --output $@.memfile
|
riscv64-unknown-elf-elf2hex --bit-width 64 --input $@ --output $@.memfile
|
||||||
|
@ -92,7 +92,10 @@ changeprivilege:
|
|||||||
|
|
||||||
trap_return: # return from trap handler
|
trap_return: # return from trap handler
|
||||||
csrr t0, mepc # get address of instruction that caused exception
|
csrr t0, mepc # get address of instruction that caused exception
|
||||||
|
li t1, 0x20000
|
||||||
|
csrs mstatus, t1 # set mprv bit to fetch instruction with permission of code that trapped
|
||||||
lh t0, 0(t0) # get instruction that caused exception
|
lh t0, 0(t0) # get instruction that caused exception
|
||||||
|
csrc mstatus, t1 # clear mprv bit to restore normal operation
|
||||||
li t1, 3
|
li t1, 3
|
||||||
and t0, t0, t1 # mask off upper bits
|
and t0, t0, t1 # mask off upper bits
|
||||||
beq t0, t1, instr32 # if lower 2 bits are 11, instruction is uncompresssed
|
beq t0, t1, instr32 # if lower 2 bits are 11, instruction is uncompresssed
|
||||||
|
@ -47,6 +47,13 @@ main:
|
|||||||
sc.w t0, a1, 0(a0)
|
sc.w t0, a1, 0(a0)
|
||||||
addi t0, t0, 1
|
addi t0, t0, 1
|
||||||
|
|
||||||
|
# test prefetch Hints (ori with destination x0)
|
||||||
|
ori x0, x0, 0
|
||||||
|
ori x0, x0, 1
|
||||||
|
ori x0, x0, 2
|
||||||
|
ori x0, x0, 3
|
||||||
|
|
||||||
|
|
||||||
# Test illegal instructions are detected
|
# Test illegal instructions are detected
|
||||||
.word 0x80000033 // illegal R-type instruction
|
.word 0x80000033 // illegal R-type instruction
|
||||||
.word 0x00007003 // illegal Load instruction
|
.word 0x00007003 // illegal Load instruction
|
||||||
@ -66,6 +73,34 @@ main:
|
|||||||
.word 0x60F0101B // Illegal BMU similar to count word
|
.word 0x60F0101B // Illegal BMU similar to count word
|
||||||
.word 0x6080101B // Illegal BMU similar to count word
|
.word 0x6080101B // Illegal BMU similar to count word
|
||||||
.word 0x6030101B // Illegal BMU similar to count word
|
.word 0x6030101B // Illegal BMU similar to count word
|
||||||
|
.word 0x0000202F // Illegal similar to LR
|
||||||
|
.word 0x1010202F // Illegal similar to LR
|
||||||
|
.word 0x00402003 // illegal similar to CMO
|
||||||
|
.word 0x00202003 // illegal similar to CMO
|
||||||
|
.word 0xFF00302F // illegal Atomic instruction
|
||||||
|
.word 0xFF00402F // illegal Atomic instruction
|
||||||
|
.word 0x00000873 // illegal CSR instruction
|
||||||
|
|
||||||
|
# Illegal CMO instructions because envcfg is 0 and system is in user Mode
|
||||||
|
li a0, 0
|
||||||
|
ecall # switch to user mode
|
||||||
|
cbo.inval (x1)
|
||||||
|
cbo.clean (x1)
|
||||||
|
cbo.flush (x1)
|
||||||
|
cbo.zero (x1)
|
||||||
|
|
||||||
|
li a0, 3
|
||||||
|
ecall # switch back to machine mode
|
||||||
|
li x1, 0x50
|
||||||
|
csrw menvcfg, x1
|
||||||
|
csrw senvcfg, x1
|
||||||
|
li a0, 0
|
||||||
|
ecall # swtich to user mode
|
||||||
|
cbo.inval (x2)
|
||||||
|
cbo.clean (x3)
|
||||||
|
cbo.flush (x1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
j done
|
j done
|
||||||
|
393
tests/coverage/tlbNAPOT.S
Normal file
393
tests/coverage/tlbNAPOT.S
Normal file
@ -0,0 +1,393 @@
|
|||||||
|
///////////////////////////////////////////
|
||||||
|
// tlbNAPOT.S
|
||||||
|
//
|
||||||
|
// Written: mmendozamanriquez@hmc.edu 4 April 2023
|
||||||
|
// nlimpert@hmc.edu
|
||||||
|
// Adapted David_Harris@hmc.edu 8/29/23 to exercise NAPOT huge pages
|
||||||
|
//
|
||||||
|
// Purpose: Test coverage for LSU NAPOT
|
||||||
|
//
|
||||||
|
// A component of the CORE-V-WALLY configurable RISC-V project.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
|
||||||
|
//
|
||||||
|
// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file
|
||||||
|
// except in compliance with the License, or, at your option, the Apache License version 2.0. You
|
||||||
|
// may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// https://solderpad.org/licenses/SHL-2.1/
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, any work distributed under the
|
||||||
|
// License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||||
|
// either express or implied. See the License for the specific language governing permissions
|
||||||
|
// and limitations under the License.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// load code to initalize stack, handle interrupts, terminate
|
||||||
|
|
||||||
|
#include "WALLY-init-lib.h"
|
||||||
|
|
||||||
|
# run-elf.bash find this in project description
|
||||||
|
main:
|
||||||
|
li t5, 0x1
|
||||||
|
slli t5, t5, 62
|
||||||
|
csrs menvcfg, t5
|
||||||
|
# Page table root address at 0x80010000; SV48
|
||||||
|
li t5, 0x9000000000080010
|
||||||
|
csrw satp, t5
|
||||||
|
|
||||||
|
# sfence.vma x0, x0
|
||||||
|
|
||||||
|
# switch to supervisor mode
|
||||||
|
li a0, 1
|
||||||
|
ecall
|
||||||
|
|
||||||
|
li t4, 0x200000 # address step size
|
||||||
|
li a2, 0x80215240 # Test NAPOT pages
|
||||||
|
jal a1, looptest
|
||||||
|
li a2, 0xC0215240 # Test ill-formed NAPOT pages
|
||||||
|
jal a1, looptest
|
||||||
|
li a2, 0x40215240 # Test properly formed pages with 1 in PPN[3] that are not NAPOT
|
||||||
|
jal a1, looptest
|
||||||
|
# li t4, 0x1000 # address step size
|
||||||
|
# li a2, 0x80216000 # Test NAPOT pages
|
||||||
|
# jal a1, looptest
|
||||||
|
j done
|
||||||
|
|
||||||
|
looptest:
|
||||||
|
mv t0, a2 # base address
|
||||||
|
li t2, 0 # i = 0
|
||||||
|
li t3, 35 # Max amount of Loops = 34
|
||||||
|
li t5, 0x8082 # return instruction opcode
|
||||||
|
|
||||||
|
loop: bge t2, t3, looptesti # exit loop if i >= loops
|
||||||
|
sw t5, 0(t0) # store a return at this address to exercise DTLB
|
||||||
|
lw t1, 0(t0) # read it back
|
||||||
|
fence.i # synchronize with I$
|
||||||
|
jalr ra, t0 # jump to the return statement to exercise the ITLB
|
||||||
|
add t0, t0, t4
|
||||||
|
addi t2, t2, 1
|
||||||
|
j loop
|
||||||
|
|
||||||
|
looptesti:
|
||||||
|
mv t0, a2 # base address
|
||||||
|
li t2, 0 # i = 0
|
||||||
|
fence.i # synchronize with I$
|
||||||
|
|
||||||
|
# Exercise itlb by jumping to each of the return statements
|
||||||
|
loopi: bge t2, t3, finished # exit loop if i >= loops
|
||||||
|
jalr ra, t0 # jump to the return statement to exercise the ITLB
|
||||||
|
add t0, t0, t4
|
||||||
|
addi t2, t2, 1
|
||||||
|
j loopi
|
||||||
|
|
||||||
|
finished:
|
||||||
|
jr a1
|
||||||
|
|
||||||
|
.data
|
||||||
|
|
||||||
|
.align 16
|
||||||
|
# root Page table situated at 0x80010000
|
||||||
|
pagetable:
|
||||||
|
.8byte 0x200044C1 // old page table was 200040 which just pointed to itself! wrong
|
||||||
|
|
||||||
|
# next page table at 0x80011000
|
||||||
|
.align 12
|
||||||
|
.8byte 0x0000000000000000 # gigapage at 0x00000000
|
||||||
|
.8byte 0x00000000200058C1 # gigapage at 0x40000000 used for non-NAPOT with PPN bit 3 set
|
||||||
|
.8byte 0x00000000200048C1 # gigapage at 0x80000000 used for testing NAPOT huge pages
|
||||||
|
.8byte 0x00000000200050C1 # gigapage at 0xC0000000 mapped to ill-formed NAPOT with wrong PPN
|
||||||
|
|
||||||
|
|
||||||
|
# Next page table at 0x80012000 for gigapage at 0x80000000
|
||||||
|
.align 12
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
.8byte 0x0000000020004CC1
|
||||||
|
|
||||||
|
# Leaf page table at 0x80013000 with NAPOT pages
|
||||||
|
.align 12
|
||||||
|
#80000000
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
.8byte 0xA0000000200020CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
.8byte 0x80000000200060CF
|
||||||
|
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
.8byte 0x800000002000A0CF
|
||||||
|
|
||||||
|
.8byte 0x800000002000E0CF
|
||||||
|
.8byte 0x800000002000E0CF
|
||||||
|
.8byte 0x800000002000E0CF
|
||||||
|
.8byte 0x800000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x800000002000E0CF
|
||||||
|
.8byte 0x800000002000E0CF
|
||||||
|
|
||||||
|
# Next page table at 0x80014000: mega-sized, pointing to malformed NAPOT for gigapage at 0xC9000000
|
||||||
|
.align 12
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
.8byte 0x00000000200054C1
|
||||||
|
|
||||||
|
# Leaf page table at 0x80015000 with malformed NAPOT pages (wrong PPN) starting at 0xC0000000
|
||||||
|
.align 12
|
||||||
|
#80000000
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
.8byte 0x80000000200000CF
|
||||||
|
|
||||||
|
|
||||||
|
# Next page table at 0x80016000: mega-sized, pointing to properly formed PTE with 1 in PPN bit 3 for gigapage at 0x40000000
|
||||||
|
.align 12
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
.8byte 0x0000000020005CC1
|
||||||
|
|
||||||
|
# Leaf page table at 0x80017000 with properly formed PTE with bit 4 of PPN set but no NAPOT
|
||||||
|
.align 12
|
||||||
|
#80000000
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
||||||
|
.8byte 0x00000000200020CF
|
||||||
|
.8byte 0x00000000200060CF
|
||||||
|
.8byte 0x000000002000A0CF
|
||||||
|
.8byte 0x000000002000E0CF
|
||||||
|
|
Loading…
Reference in New Issue
Block a user