@@ -496,7 +496,7 @@ reg_t mmu_t::walk(mem_access_info_t access_info)
496
496
497
497
if (ss_access) {
498
498
if (vm.levels == 0 )
499
- trap_store_access_fault (virt, addr, 0 , 0 );
499
+ throw trap_store_access_fault (virt, addr, 0 , 0 );
500
500
type = STORE;
501
501
}
502
502
@@ -526,6 +526,7 @@ reg_t mmu_t::walk(mem_access_info_t access_info)
526
526
bool pbmte = virt ? (proc->get_state ()->henvcfg ->read () & HENVCFG_PBMTE) : (proc->get_state ()->menvcfg ->read () & MENVCFG_PBMTE);
527
527
bool hade = virt ? (proc->get_state ()->henvcfg ->read () & HENVCFG_ADUE) : (proc->get_state ()->menvcfg ->read () & MENVCFG_ADUE);
528
528
bool sse = virt ? (proc->get_state ()->henvcfg ->read () & HENVCFG_SSE) : (proc->get_state ()->menvcfg ->read () & MENVCFG_SSE);
529
+ bool ss_page = !(pte & PTE_R) && (pte & PTE_W) && !(pte & PTE_X);
529
530
530
531
if (pte & PTE_RSVD) {
531
532
break ;
@@ -547,17 +548,17 @@ reg_t mmu_t::walk(mem_access_info_t access_info)
547
548
// not shadow stack access xwr=110 or xwr=010 page cause page fault
548
549
// shadow stack access with PTE_X moved to following check
549
550
break ;
550
- } else if ((!(pte & PTE_R) && (pte & PTE_W) && !(pte & PTE_X)) && (type == STORE && !ss_access)) {
551
+ } else if (ss_page && (type == STORE && !ss_access)) {
551
552
// not shadow stack store and xwr = 010 cause access-fault
552
553
throw trap_store_access_fault (virt, addr, 0 , 0 );
553
- } else if ((!(pte & PTE_R) && (pte & PTE_W) && !(pte & PTE_X)) && type == FETCH) {
554
+ } else if (ss_page && type == FETCH) {
554
555
// fetch from shadow stack pages cause instruction access-fault
555
556
throw trap_instruction_access_fault (virt, addr, 0 , 0 );
556
557
} else if ((((pte & PTE_R) && (pte & PTE_W)) || (pte & PTE_X)) && ss_access) {
557
558
// shadow stack access cause store access fault if xwr!=010 and xwr!=001
558
559
throw trap_store_access_fault (virt, addr, 0 , 0 );
559
560
} else if (type == FETCH || hlvx ? !(pte & PTE_X) :
560
- type == LOAD ? !(pte & PTE_R ) && !(sse && ( pte & PTE_W) ) && !(mxr && (pte & PTE_X)) :
561
+ type == LOAD ? !(sse && ss_page ) && !(pte & PTE_R ) && !(mxr && (pte & PTE_X)) :
561
562
!(pte & PTE_W)) {
562
563
break ;
563
564
} else if ((ppn & ((reg_t (1 ) << ptshift) - 1 )) != 0 ) {
0 commit comments