mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
target/loongarch: Support LoongArch32 VPPN
VPPN of TLBEHI/TLBREHI is limited to 19 bits in LA32. Signed-off-by: Jiajie Chen <c@jia.je> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Song Gao <gaosong@loongson.cn> Message-ID: <20230822032724.1353391-4-gaosong@loongson.cn> Message-Id: <20230822071405.35386-4-philmd@linaro.org>
This commit is contained in:
parent
eece576409
commit
50fffcc49b
2 changed files with 22 additions and 7 deletions
|
@ -57,7 +57,8 @@ FIELD(CSR_TLBIDX, PS, 24, 6)
|
|||
FIELD(CSR_TLBIDX, NE, 31, 1)
|
||||
|
||||
#define LOONGARCH_CSR_TLBEHI 0x11 /* TLB EntryHi */
|
||||
FIELD(CSR_TLBEHI, VPPN, 13, 35)
|
||||
FIELD(CSR_TLBEHI_32, VPPN, 13, 19)
|
||||
FIELD(CSR_TLBEHI_64, VPPN, 13, 35)
|
||||
|
||||
#define LOONGARCH_CSR_TLBELO0 0x12 /* TLB EntryLo0 */
|
||||
#define LOONGARCH_CSR_TLBELO1 0x13 /* TLB EntryLo1 */
|
||||
|
@ -164,7 +165,8 @@ FIELD(CSR_TLBRERA, PC, 2, 62)
|
|||
#define LOONGARCH_CSR_TLBRELO1 0x8d /* TLB refill entrylo1 */
|
||||
#define LOONGARCH_CSR_TLBREHI 0x8e /* TLB refill entryhi */
|
||||
FIELD(CSR_TLBREHI, PS, 0, 6)
|
||||
FIELD(CSR_TLBREHI, VPPN, 13, 35)
|
||||
FIELD(CSR_TLBREHI_32, VPPN, 13, 19)
|
||||
FIELD(CSR_TLBREHI_64, VPPN, 13, 35)
|
||||
#define LOONGARCH_CSR_TLBRPRMD 0x8f /* TLB refill mode info */
|
||||
FIELD(CSR_TLBRPRMD, PPLV, 0, 2)
|
||||
FIELD(CSR_TLBRPRMD, PIE, 2, 1)
|
||||
|
|
|
@ -300,8 +300,13 @@ static void raise_mmu_exception(CPULoongArchState *env, target_ulong address,
|
|||
|
||||
if (tlb_error == TLBRET_NOMATCH) {
|
||||
env->CSR_TLBRBADV = address;
|
||||
env->CSR_TLBREHI = FIELD_DP64(env->CSR_TLBREHI, CSR_TLBREHI, VPPN,
|
||||
extract64(address, 13, 35));
|
||||
if (is_la64(env)) {
|
||||
env->CSR_TLBREHI = FIELD_DP64(env->CSR_TLBREHI, CSR_TLBREHI_64,
|
||||
VPPN, extract64(address, 13, 35));
|
||||
} else {
|
||||
env->CSR_TLBREHI = FIELD_DP64(env->CSR_TLBREHI, CSR_TLBREHI_32,
|
||||
VPPN, extract64(address, 13, 19));
|
||||
}
|
||||
} else {
|
||||
if (!FIELD_EX64(env->CSR_DBG, CSR_DBG, DST)) {
|
||||
env->CSR_BADV = address;
|
||||
|
@ -366,12 +371,20 @@ static void fill_tlb_entry(CPULoongArchState *env, int index)
|
|||
|
||||
if (FIELD_EX64(env->CSR_TLBRERA, CSR_TLBRERA, ISTLBR)) {
|
||||
csr_ps = FIELD_EX64(env->CSR_TLBREHI, CSR_TLBREHI, PS);
|
||||
csr_vppn = FIELD_EX64(env->CSR_TLBREHI, CSR_TLBREHI, VPPN);
|
||||
if (is_la64(env)) {
|
||||
csr_vppn = FIELD_EX64(env->CSR_TLBREHI, CSR_TLBREHI_64, VPPN);
|
||||
} else {
|
||||
csr_vppn = FIELD_EX64(env->CSR_TLBREHI, CSR_TLBREHI_32, VPPN);
|
||||
}
|
||||
lo0 = env->CSR_TLBRELO0;
|
||||
lo1 = env->CSR_TLBRELO1;
|
||||
} else {
|
||||
csr_ps = FIELD_EX64(env->CSR_TLBIDX, CSR_TLBIDX, PS);
|
||||
csr_vppn = FIELD_EX64(env->CSR_TLBEHI, CSR_TLBEHI, VPPN);
|
||||
if (is_la64(env)) {
|
||||
csr_vppn = FIELD_EX64(env->CSR_TLBEHI, CSR_TLBEHI_64, VPPN);
|
||||
} else {
|
||||
csr_vppn = FIELD_EX64(env->CSR_TLBEHI, CSR_TLBEHI_32, VPPN);
|
||||
}
|
||||
lo0 = env->CSR_TLBELO0;
|
||||
lo1 = env->CSR_TLBELO1;
|
||||
}
|
||||
|
@ -491,7 +504,7 @@ void helper_tlbfill(CPULoongArchState *env)
|
|||
|
||||
if (pagesize == stlb_ps) {
|
||||
/* Only write into STLB bits [47:13] */
|
||||
address = entryhi & ~MAKE_64BIT_MASK(0, R_CSR_TLBEHI_VPPN_SHIFT);
|
||||
address = entryhi & ~MAKE_64BIT_MASK(0, R_CSR_TLBEHI_64_VPPN_SHIFT);
|
||||
|
||||
/* Choose one set ramdomly */
|
||||
set = get_random_tlb(0, 7);
|
||||
|
|
Loading…
Reference in a new issue