提交 2d72e7b0 编写于 作者: P Paul Burton 提交者: Leon Alrae

target-mips: change ASID type to hold more than 8 bits

ASID currently has uint8_t type which is too small since some processors
support more than 8 bits ASID. Therefore change its type to uint16_t.
Signed-off-by: NPaul Burton <paul.burton@imgtec.com>
Signed-off-by: NJames Hogan <james.hogan@imgtec.com>
Signed-off-by: NLeon Alrae <leon.alrae@imgtec.com>
上级 6ec98bd7
...@@ -19,7 +19,7 @@ typedef struct r4k_tlb_t r4k_tlb_t; ...@@ -19,7 +19,7 @@ typedef struct r4k_tlb_t r4k_tlb_t;
struct r4k_tlb_t { struct r4k_tlb_t {
target_ulong VPN; target_ulong VPN;
uint32_t PageMask; uint32_t PageMask;
uint8_t ASID; uint16_t ASID;
unsigned int G:1; unsigned int G:1;
unsigned int C0:3; unsigned int C0:3;
unsigned int C1:3; unsigned int C1:3;
......
...@@ -67,7 +67,7 @@ int fixed_mmu_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, ...@@ -67,7 +67,7 @@ int fixed_mmu_map_address (CPUMIPSState *env, hwaddr *physical, int *prot,
int r4k_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, int r4k_map_address (CPUMIPSState *env, hwaddr *physical, int *prot,
target_ulong address, int rw, int access_type) target_ulong address, int rw, int access_type)
{ {
uint8_t ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask; uint16_t ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask;
int i; int i;
for (i = 0; i < env->tlb->tlb_in_use; i++) { for (i = 0; i < env->tlb->tlb_in_use; i++) {
...@@ -898,7 +898,7 @@ void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra) ...@@ -898,7 +898,7 @@ void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra)
r4k_tlb_t *tlb; r4k_tlb_t *tlb;
target_ulong addr; target_ulong addr;
target_ulong end; target_ulong end;
uint8_t ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask; uint16_t ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask;
target_ulong mask; target_ulong mask;
tlb = &env->tlb->mmu.r4k.tlb[idx]; tlb = &env->tlb->mmu.r4k.tlb[idx];
......
...@@ -132,7 +132,7 @@ static int get_tlb(QEMUFile *f, void *pv, size_t size) ...@@ -132,7 +132,7 @@ static int get_tlb(QEMUFile *f, void *pv, size_t size)
qemu_get_betls(f, &v->VPN); qemu_get_betls(f, &v->VPN);
qemu_get_be32s(f, &v->PageMask); qemu_get_be32s(f, &v->PageMask);
qemu_get_8s(f, &v->ASID); qemu_get_be16s(f, &v->ASID);
qemu_get_be16s(f, &flags); qemu_get_be16s(f, &flags);
v->G = (flags >> 10) & 1; v->G = (flags >> 10) & 1;
v->C0 = (flags >> 7) & 3; v->C0 = (flags >> 7) & 3;
...@@ -156,7 +156,7 @@ static void put_tlb(QEMUFile *f, void *pv, size_t size) ...@@ -156,7 +156,7 @@ static void put_tlb(QEMUFile *f, void *pv, size_t size)
{ {
r4k_tlb_t *v = pv; r4k_tlb_t *v = pv;
uint8_t asid = v->ASID; uint16_t asid = v->ASID;
uint16_t flags = ((v->EHINV << 15) | uint16_t flags = ((v->EHINV << 15) |
(v->RI1 << 14) | (v->RI1 << 14) |
(v->RI0 << 13) | (v->RI0 << 13) |
...@@ -172,7 +172,7 @@ static void put_tlb(QEMUFile *f, void *pv, size_t size) ...@@ -172,7 +172,7 @@ static void put_tlb(QEMUFile *f, void *pv, size_t size)
qemu_put_betls(f, &v->VPN); qemu_put_betls(f, &v->VPN);
qemu_put_be32s(f, &v->PageMask); qemu_put_be32s(f, &v->PageMask);
qemu_put_8s(f, &asid); qemu_put_be16s(f, &asid);
qemu_put_be16s(f, &flags); qemu_put_be16s(f, &flags);
qemu_put_be64s(f, &v->PFN[0]); qemu_put_be64s(f, &v->PFN[0]);
qemu_put_be64s(f, &v->PFN[1]); qemu_put_be64s(f, &v->PFN[1]);
...@@ -192,8 +192,8 @@ const VMStateInfo vmstate_info_tlb = { ...@@ -192,8 +192,8 @@ const VMStateInfo vmstate_info_tlb = {
const VMStateDescription vmstate_tlb = { const VMStateDescription vmstate_tlb = {
.name = "cpu/tlb", .name = "cpu/tlb",
.version_id = 1, .version_id = 2,
.minimum_version_id = 1, .minimum_version_id = 2,
.fields = (VMStateField[]) { .fields = (VMStateField[]) {
VMSTATE_UINT32(nb_tlb, CPUMIPSTLBContext), VMSTATE_UINT32(nb_tlb, CPUMIPSTLBContext),
VMSTATE_UINT32(tlb_in_use, CPUMIPSTLBContext), VMSTATE_UINT32(tlb_in_use, CPUMIPSTLBContext),
......
...@@ -2013,7 +2013,7 @@ void r4k_helper_tlbinv(CPUMIPSState *env) ...@@ -2013,7 +2013,7 @@ void r4k_helper_tlbinv(CPUMIPSState *env)
{ {
int idx; int idx;
r4k_tlb_t *tlb; r4k_tlb_t *tlb;
uint8_t ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask; uint16_t ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask;
for (idx = 0; idx < env->tlb->nb_tlb; idx++) { for (idx = 0; idx < env->tlb->nb_tlb; idx++) {
tlb = &env->tlb->mmu.r4k.tlb[idx]; tlb = &env->tlb->mmu.r4k.tlb[idx];
...@@ -2039,7 +2039,7 @@ void r4k_helper_tlbwi(CPUMIPSState *env) ...@@ -2039,7 +2039,7 @@ void r4k_helper_tlbwi(CPUMIPSState *env)
r4k_tlb_t *tlb; r4k_tlb_t *tlb;
int idx; int idx;
target_ulong VPN; target_ulong VPN;
uint8_t ASID; uint16_t ASID;
bool G, V0, D0, V1, D1; bool G, V0, D0, V1, D1;
idx = (env->CP0_Index & ~0x80000000) % env->tlb->nb_tlb; idx = (env->CP0_Index & ~0x80000000) % env->tlb->nb_tlb;
...@@ -2081,7 +2081,7 @@ void r4k_helper_tlbp(CPUMIPSState *env) ...@@ -2081,7 +2081,7 @@ void r4k_helper_tlbp(CPUMIPSState *env)
target_ulong mask; target_ulong mask;
target_ulong tag; target_ulong tag;
target_ulong VPN; target_ulong VPN;
uint8_t ASID; uint16_t ASID;
int i; int i;
ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask; ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask;
...@@ -2136,7 +2136,7 @@ static inline uint64_t get_entrylo_pfn_from_tlb(uint64_t tlb_pfn) ...@@ -2136,7 +2136,7 @@ static inline uint64_t get_entrylo_pfn_from_tlb(uint64_t tlb_pfn)
void r4k_helper_tlbr(CPUMIPSState *env) void r4k_helper_tlbr(CPUMIPSState *env)
{ {
r4k_tlb_t *tlb; r4k_tlb_t *tlb;
uint8_t ASID; uint16_t ASID;
int idx; int idx;
ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask; ASID = env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册