@@ -223,6 +223,15 @@ Mend_PMP: ;\
223223 add t2, t1, t0 ;\
224224 SREG t2, _REG_NAME##_bgn_off+1*sv_area_sz(sp) ;\
225225
226+ #define V_SAVE_AREA_SETUP (VVA , SVA , PA_LBL , _REG_NAME ) ;\
227+ SAVE_AREA_SETUP(SVA, PA_LBL, _REG_NAME) ;\
228+ LI (t0, VVA) ;\
229+ LA (t1, PA_LBL) ;\
230+ sub t0, t0, t1 ;\
231+ LREG t1, _REG_NAME##_bgn_off+0*sv_area_sz(sp) ;\
232+ add t2, t1, t0 ;\
233+ SREG t2, _REG_NAME##_bgn_off+2*sv_area_sz(sp) ;\
234+
226235#define PTE_SETUP_SV32 (_PAR , _PR , _TR0 , _TR1 , _VAR , level ) ;\
227236 .if (level==1) ;\
228237 LA(_TR1, rvtest_Sroot_pg_tbl) ;\
@@ -251,6 +260,25 @@ Mend_PMP: ;\
251260 add _TR1 , _TR1 , _TR0 /* Add index to page table base */ ;\
252261 SREG _PAR , 0 (_TR1 ) /* Store PTE at calculated address */ ;\
253262
263+ #define V_PTE_SETUP_SV39 (_PAR , _PR , _TR0 , _TR1 , VA , level ) \
264+ srli _PAR, _PAR, 12 /* Shift PA right by 12 to get PPN */ ;\
265+ slli _PAR , _PAR , 10 /* Shift left by 10 to align PPN in PTE format */ ;\
266+ or _PAR , _PAR , _PR /* Combine PPN with permissions */ ;\
267+ .if (level == 2 ) /* Level 2 (1GB superpage) */ ;\
268+ LA (_TR1 , rvtest_Vroot_pg_tbl ) /* Load root page table address */ ;\
269+ LI (_TR0 , ((VA >>30 )& 0x1FF )<<3 ) /* Calculate index for LEVEL2 (bits 38:30) */ ;\
270+ .endif ;\
271+ .if (level == 1 ) /* Level 1 (2MB superpage) */ ;\
272+ LA (_TR1 , rvtest_vlvl2_pg_tbl ) /* Load level 2 page table address */ ;\
273+ LI (_TR0 , ((VA >>21 )& 0x1FF )<<3 ) /* Calculate index for LEVEL1 (bits 29:21) */ ;\
274+ .endif ;\
275+ .if (level == 0 ) /* Level 0 (4KB page) */ ;\
276+ LA (_TR1 , rvtest_vlvl1_pg_tbl ) /* Load level 1 page table address */ ;\
277+ LI (_TR0 , ((VA >>12 )& 0x1FF )<<3 ) /* Calculate index for LEVEL0 (bits 20:12) */ ;\
278+ .endif ;\
279+ add _TR1 , _TR1 , _TR0 /* Add index to page table base */ ;\
280+ SREG _PAR , 0 (_TR1 ) /* Store PTE at calculated address */ ;\
281+
254282// More Robust version of PTE_SETUP_SV39 to setup a PTE for a PA using VA
255283// in a single line.
256284// args: PA_LBL: Label of Physical Address, PERMS: permissions in hex
@@ -260,6 +288,11 @@ Mend_PMP: ;\
260288 LI (a1 , PERMS ) /* Load permissions into a1 */ ;\
261289 PTE_SETUP_SV39 (a0 , a1 , t0 , t1 , VA , level ) /* Call PTE_SETUP_SV39 macro */ ;\
262290
291+ #define V_PTE_SETUP_RV39_New (PA_LBL , PERMS , VA , level ) \
292+ LA(a0, PA_LBL) /* Load physical address label into a0 */ ;\
293+ LI (a1 , PERMS ) /* Load permissions into a1 */ ;\
294+ PTE_SETUP_SV39 (a0 , a1 , t0 , t1 , VA , level ) /* Call PTE_SETUP_SV39 macro */ ;\
295+
263296#define PTE_SETUP_SV48 (_PAR , _PR , _TR0 , _TR1 , VA , level ) ;\
264297 srli _PAR, _PAR, 12 /* Shift PA right by 12 to get PPN */ ;\
265298 slli _PAR , _PAR , 10 /* Shift left by 10 to align PPN in PTE format */ ;\
@@ -432,6 +465,24 @@ Mend_PMP: ;\
432465 or t6, t6, t5 ;\
433466 csrw satp, t6 ;
434467
468+ #define VSATP_SETUP_RV64 (MODE ) ;\
469+ LA(t6, rvtest_Vroot_pg_tbl) ;\
470+ .if (MODE == sv39) ;\
471+ LI(t5, (SATP64_MODE) & (SATP_MODE_SV39 << 60)) ;\
472+ .endif ;\
473+ .if (MODE == sv48) ;\
474+ LI(t5, (SATP64_MODE) & (SATP_MODE_SV48 << 60)) ;\
475+ .endif ;\
476+ .if (MODE == sv57) ;\
477+ LI(t5, (SATP64_MODE) & (SATP_MODE_SV57 << 60)) ;\
478+ .endif ;\
479+ .if (MODE == sv64) ;\
480+ LI(t5, (SATP64_MODE) & (SATP_MODE_SV64 << 60)) ;\
481+ .endif ;\
482+ srli t6, t6, 12 ;\
483+ or t6, t6, t5 ;\
484+ csrw vsatp, t6 ;
485+
435486// macro to update the signature region for hints
436487#define TEST_STORE_GPRS_AND_STATUS (sigptr ) ;\
437488 /* Store all general-purpose registers (x0 to x31) to the signature region */ ;\
0 commit comments