diff --git a/cMIPS/bin/edMemory.sh b/cMIPS/bin/edMemory.sh index 5905b0d8fec2cef61e2073bf635e9408985441db..701c63e65c028d431e1f2c3f4458680b6a3adfdc 100755 --- a/cMIPS/bin/edMemory.sh +++ b/cMIPS/bin/edMemory.sh @@ -86,6 +86,15 @@ then fi done + # set up address for base of Page Table + VAR=x_DATA_BASE_ADDR + NEW=$(egrep -h ${VAR} "${dfn}" | sed -n -e '/reg32/s/.*x"\(.*\)".*/\1/p') + OLD=$(egrep -h ${VAR} "${lnk}" | sed -n -e 's/.* = 0x\(.*\); .*/\1/p') + # echo -n -e "$NEW $OLD\n" + if [ -n "$OLD" ] ; then + sed -i -e '/'$VAR'/s/'$OLD'/'$NEW'/' "${lnk}" + fi + # set up address for base of Page Table VAR=x_DATA_MEM_SZ NEW=$(egrep -h ${VAR} "${dfn}" | sed -n -e '/reg32/s/.*x"\(.*\)".*/\1/p') diff --git a/cMIPS/bin/run.sh b/cMIPS/bin/run.sh index dbde68e7060c6785af2857f0587760f2656db4e5..55974ae92ea526489e2857ee84ac6392f91e9496 100755 --- a/cMIPS/bin/run.sh +++ b/cMIPS/bin/run.sh @@ -77,8 +77,8 @@ gfile=${gtkwconf%%.sav} sav="${tree}"/${gfile}.sav -"${bin}"/build.sh || exit 1 +"${bin}"/build.sh || exit 1 options="--ieee-asserts=disable --stop-time=${length}${unit}s --vcd=${visual}" @@ -95,5 +95,5 @@ fi -# --wave=${visual%.vcd}.ghw +## --wave=${visual%.vcd}.ghw diff --git a/cMIPS/include/cMIPS.ld b/cMIPS/include/cMIPS.ld index dcb75e63914860dab69e5c2575844ddf5e337a1c..aa2b8082ad371348c3f9de0deb0eb2d4c3a6ec9e 100644 --- a/cMIPS/include/cMIPS.ld +++ b/cMIPS/include/cMIPS.ld @@ -43,9 +43,10 @@ SECTIONS _end = . ; /* end of image constant (from Xinu) */ } > ram + start_RAM = 0x00040000; /* x_DATA_BASE_ADDR */ end_RAM = 0x00020000; /* x_DATA_MEM_SZ */ - half_RAM = (end_RAM / 2); - base_PT = ( _bdata + half_RAM ); + half_RAM = (end_RAM >> 1); + base_PT = ( start_RAM + half_RAM ); .PT base_PT : { *(.PT) } > ram } diff --git a/cMIPS/include/handlers.s b/cMIPS/include/handlers.s index e02fef5b485330e46d6f0e78c5441849687926c8..114a0d8d7034c698fc4cadac5f4cb77455c4b722 100644 --- a/cMIPS/include/handlers.s +++ b/cMIPS/include/handlers.s @@ -560,5 +560,13 @@ _kmsg_list: .word _kmsg_interr,_kmsg_excep, _kmsg_prot_viol, _kmsg_seg_fault .word _kmsg_sec_mem + ## + ## need this so the allocation of the PageTable does not break B^( + ## + .section .data + .align 2 +_end_of_data: + .word 0 + #---------------------------------------------------------------- diff --git a/cMIPS/include/start.s b/cMIPS/include/start.s index 0a6a7fb5dffc3503941f56099b0bca641bce9ba0..5f2ca436d88b6b6e9bf5cdc1c520011f1d19a435 100644 --- a/cMIPS/include/start.s +++ b/cMIPS/include/start.s @@ -117,7 +117,6 @@ _start: sw $a1, 0($a0) # write to PT[ _PTV ].entryLo0 sw $a2, 8($a0) # write to PT[ _PTV ].entryLo1 - # pin down first five TLB entries: ROM[0], I/O, RAM[0], stack, PgTbl li $k0, 5 mtc0 $k0, c0_wired @@ -431,14 +430,14 @@ PT_update: ## Status: 00=unmapped, 01=mapped, 10=in_secondary_storage, 11=undef ## .section .PT,"aw",@progbits + .align 4 .global _PT ## ( ( (x_INST_BASE_ADDR + n*4096) >>12 )<<6 ) || 0b000011 d,v,g -_PT: ## ## ROM mappings, intLo{01} = U=M=W=0, X=1, S=10 (or 00) = 6 (or 4) ## - .org (_PT + (x_INST_BASE_ADDR >>13)*16) +_PT: .org (_PT + (x_INST_BASE_ADDR >>13)*16) # PT[0], ROM PTbase: .word ( (x_INST_BASE_ADDR + 0*4096) >>6) | 0b000011 diff --git a/cMIPS/tests/pt_walk.c b/cMIPS/tests/pt_walk.c index 788516ca321d3d394796848ea45cc089d750f3eb..fd3a2d7b238aa62841ef0c25eef180c7574fba34 100644 --- a/cMIPS/tests/pt_walk.c +++ b/cMIPS/tests/pt_walk.c @@ -17,9 +17,9 @@ //----------------------------------------------------------------------- // decide on the tests to run -#define WALK_THE_PT 1 +#define WALK_THE_PT 0 #define TLB_MODIFIED 1 -#define DOUBLE_FAULT 1 +#define DOUBLE_FAULT 0 // these will abort the simulation when the fault is detected/handled #define PROT_VIOL 0 @@ -69,7 +69,7 @@ void main(void) { walker = (int *)((int)walker + 4096); } - print_str("\twalked\n"); + print_str("\n\twalked\n"); #endif @@ -95,9 +95,9 @@ void main(void) { // first, remove V_addr from the TLB, to ensure the PT is searched if ( TLB_purge((void *)walker) == 0 ) { - print_str("\n\tTLB entry purged\n"); + print_str("\n\tTLB entry purged\n\n"); } else { - print_str("\n\tTLB miss\n"); + print_str("\n\tTLB miss\n\n"); } new_value = ( ((x_DATA_BASE_ADDR + PG_NUM*4096)>>12) <<6) | 0b000011; // d=0 @@ -110,9 +110,9 @@ void main(void) { if ( *walker == 0x99 ) { // this load is optimized away by gcc print( *walker ); - print_str("\tMod ok\n\n"); + print_str("\n\tMod ok\n"); } else { - print_str("\tMod err\n\n"); + print_str("\n\tMod err\n"); } #endif @@ -176,9 +176,9 @@ void main(void) { // first, remove V_addr from the TLB, to ensure the PT is searched if ( TLB_purge((void *)walker) == 0 ) { - print_str("\n\tpurged\n"); + print_str("\tpurged\n"); } else { - print_str("\t\tTLB miss\n"); + print_str("\tTLB miss\n"); } // change a PT element so it is data, NON-writable, page is mapped in PT @@ -214,9 +214,9 @@ void main(void) { // first, remove V_addr from the TLB, to ensure the PT will be searched if ( TLB_purge((void *)walker) == 0 ) { - print_str("\n\tpurged\n"); + print_str("\tpurged\n"); } else { - print_str("\n\tTLB miss\n"); + print_str("\tTLB miss\n"); } // add a new PT element for an address range with RAM but UN-mapped diff --git a/cMIPS/tlb.sav b/cMIPS/tlb.sav index 7c49bdc2d5cadc0d2e767b52c80501623f029176..96ace7eb964b7f221ac7c4850ebb5d2f7e6bb8d9 100644 --- a/cMIPS/tlb.sav +++ b/cMIPS/tlb.sav @@ -1,19 +1,19 @@ [*] [*] GTKWave Analyzer v3.3.37 (w)1999-2012 BSI -[*] Sun May 17 11:56:41 2015 +[*] Fri Oct 14 01:02:39 2016 [*] [dumpfile] "/home/roberto/cMIPS/v_cMIPS.vcd" -[dumpfile_mtime] "Sun May 17 11:56:25 2015" -[dumpfile_size] 2177591 +[dumpfile_mtime] "Fri Oct 14 01:01:44 2016" +[dumpfile_size] 4593625 [savefile] "/home/roberto/cMIPS/tlb.sav" -[timestart] 1137200000 -[size] 1213 1026 +[timestart] 2062800000 +[size] 1240 1018 [pos] -1 -1 -*-25.727983 1188300000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +*-25.727983 2022300000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [treeopen] u_core. [treeopen] u_core.u_alu. -[sst_width] 210 -[signals_width] 213 +[sst_width] 221 +[signals_width] 208 [sst_expanded] 1 [sst_vpaned_height] 331 @28 @@ -25,24 +25,15 @@ u_core.instr_fetched[31:0] @28 u_core.pcsel[1:0] u_core.excp_pcsel[2:0] -u_core.exception_stall -u_core.nullify -u_core.abort +u_core.annul_twice @200 - decode, reg fetch @22 u_core.rf_instruction[31:0] @24 -u_core.a_rs[4:0] -u_core.a_rt[4:0] -u_core.a_rd[4:0] u_core.exception_dec[31:0] @200 - exec -@28 -u_core.ex_wreg -@24 -u_core.u_alu.operation[31:0] @22 u_core.alu_inp_a[31:0] u_core.alu_inp_b[31:0] @@ -51,7 +42,6 @@ u_core.v_addr[31:0] @200 - memory @28 -u_core.mm_aval u_core.b_sel[3:0] @22 u_core.data_inp[31:0] @@ -61,66 +51,70 @@ d_addr[31:0] cpu_d_aval wr @200 +- write-back +@28 +u_core.wb_wreg +@24 +u_core.wb_a_c[4:0] +@22 +u_core.wb_c[31:0] +@28 +u_core.wb_muxc[2:0] +@22 +u_core.wb_cop0_val[31:0] +@200 - COP-0 +@28 +u_core.tlb_exception @24 u_core.exccode[4:0] -u_core.exception_num[31:0] @22 u_core.cause[31:0] u_core.status[31:0] u_core.epc[31:0] -@29 -u_core.is_delayslot -@22 u_core.badvaddr[31:0] u_core.context[31:0] -@200 -- @28 -u_core.tlb_exception -@24 -u_core.tlb_excp_num[31:0] +u_core.mm_tlb_exception +u_core.mm_tlb_stage_mm @200 - @22 -u_core.tlb_entryhi[31:0] -u_core.tlb_excp_va[31:13] -@28 -u_core.tlb_read -@22 -u_core.entryhi_inp[31:0] -@28 -u_core.entryhi_update -@22 -u_core.tlb_entryhi[31:0] +u_core.index[31:0] u_core.entryhi[31:0] -u_core.tlb_entrylo0[31:0] -u_core.tlb_dat0_inp[25:0] u_core.entrylo0[31:0] -u_core.tlb_entrylo1[31:0] -u_core.tlb_dat1_inp[25:0] u_core.entrylo1[31:0] @200 - -@22 -u_core.index[31:0] +@24 +u_core.tlb_adr[31:0] +u_core.wired[31:0] +u_core.random[31:0] @28 u_core.hit_mm_d u_core.hit_mm_v u_core.hit_mm @24 u_core.hit_mm_adr[31:0] -@28 -u_core.tlb_miss @22 u_core.tlb_tag0[31:0] +u_core.tlb_dat0_0[25:0] +u_core.tlb_dat0_1[25:0] u_core.tlb_tag1[31:0] +u_core.tlb_dat1_0[25:0] +u_core.tlb_dat1_1[25:0] u_core.tlb_tag2[31:0] +u_core.tlb_dat2_0[25:0] +u_core.tlb_dat2_1[25:0] u_core.tlb_tag3[31:0] +u_core.tlb_dat3_0[25:0] +u_core.tlb_dat3_1[25:0] u_core.tlb_tag4[31:0] u_core.tlb_dat4_0[25:0] u_core.tlb_dat4_1[25:0] u_core.tlb_tag5[31:0] +u_core.tlb_dat5_0[25:0] +u_core.tlb_dat5_1[25:0] u_core.tlb_tag6[31:0] u_core.tlb_dat6_0[25:0] u_core.tlb_dat6_1[25:0] @@ -131,17 +125,5 @@ u_core.tlb_dat7_1[25:0] u_core.hit_pc @24 u_core.hit_pc_adr[31:0] -@200 -- write-back -@28 -u_core.wb_wreg -@24 -u_core.wb_a_c[4:0] -@22 -u_core.wb_cop0_val[31:0] -@28 -u_core.wb_muxc[2:0] -@22 -u_core.wb_c[31:0] [pattern_trace] 1 [pattern_trace] 0