Fix all of the coding style errors in this file at once.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/cris/mmu.c | 479 +++++++++++++++++++++++-----------------------
1 file changed, 237 insertions(+), 242 deletions(-)
diff --git a/target/cris/mmu.c b/target/cris/mmu.c
index b8db908823..9cb73bbfec 100644
--- a/target/cris/mmu.c
+++ b/target/cris/mmu.c
@@ -33,96 +33,99 @@
void cris_mmu_init(CPUCRISState *env)
{
- env->mmu_rand_lfsr = 0xcccc;
+ env->mmu_rand_lfsr = 0xcccc;
}
#define SR_POLYNOM 0x8805
static inline unsigned int compute_polynom(unsigned int sr)
{
- unsigned int i;
- unsigned int f;
+ unsigned int i;
+ unsigned int f;
- f = 0;
- for (i = 0; i < 16; i++)
- f += ((SR_POLYNOM >> i) & 1) & ((sr >> i) & 1);
+ f = 0;
+ for (i = 0; i < 16; i++) {
+ f += ((SR_POLYNOM >> i) & 1) & ((sr >> i) & 1);
+ }
- return f;
+ return f;
}
static void cris_mmu_update_rand_lfsr(CPUCRISState *env)
{
- unsigned int f;
+ unsigned int f;
- /* Update lfsr at every fault. */
- f = compute_polynom(env->mmu_rand_lfsr);
- env->mmu_rand_lfsr >>= 1;
- env->mmu_rand_lfsr |= (f << 15);
- env->mmu_rand_lfsr &= 0xffff;
+ /* Update lfsr at every fault. */
+ f = compute_polynom(env->mmu_rand_lfsr);
+ env->mmu_rand_lfsr >>= 1;
+ env->mmu_rand_lfsr |= (f << 15);
+ env->mmu_rand_lfsr &= 0xffff;
}
static inline int cris_mmu_enabled(uint32_t rw_gc_cfg)
{
- return (rw_gc_cfg & 12) != 0;
+ return (rw_gc_cfg & 12) != 0;
}
static inline int cris_mmu_segmented_addr(int seg, uint32_t rw_mm_cfg)
{
- return (1 << seg) & rw_mm_cfg;
+ return (1 << seg) & rw_mm_cfg;
}
static uint32_t cris_mmu_translate_seg(CPUCRISState *env, int seg)
{
- uint32_t base;
- int i;
+ uint32_t base;
+ int i;
- if (seg < 8)
- base = env->sregs[SFR_RW_MM_KBASE_LO];
- else
- base = env->sregs[SFR_RW_MM_KBASE_HI];
+ if (seg < 8) {
+ base = env->sregs[SFR_RW_MM_KBASE_LO];
+ } else {
+ base = env->sregs[SFR_RW_MM_KBASE_HI];
+ }
- i = seg & 7;
- base >>= i * 4;
- base &= 15;
+ i = seg & 7;
+ base >>= i * 4;
+ base &= 15;
- base <<= 28;
- return base;
+ base <<= 28;
+ return base;
}
-/* Used by the tlb decoder. */
-#define EXTRACT_FIELD(src, start, end) \
- (((src) >> start) & ((1 << (end - start + 1)) - 1))
-static inline void set_field(uint32_t *dst, unsigned int val,
+/* Used by the tlb decoder. */
+#define EXTRACT_FIELD(src, start, end) \
+ (((src) >> start) & ((1 << (end - start + 1)) - 1))
+
+static inline void set_field(uint32_t *dst, unsigned int val,
unsigned int offset, unsigned int width)
{
- uint32_t mask;
+ uint32_t mask;
- mask = (1 << width) - 1;
- mask <<= offset;
- val <<= offset;
+ mask = (1 << width) - 1;
+ mask <<= offset;
+ val <<= offset;
- val &= mask;
- *dst &= ~(mask);
- *dst |= val;
+ val &= mask;
+ *dst &= ~(mask);
+ *dst |= val;
}
#ifdef DEBUG
static void dump_tlb(CPUCRISState *env, int mmu)
{
- int set;
- int idx;
- uint32_t hi, lo, tlb_vpn, tlb_pfn;
+ int set;
+ int idx;
+ uint32_t hi, lo, tlb_vpn, tlb_pfn;
- for (set = 0; set < 4; set++) {
- for (idx = 0; idx < 16; idx++) {
- lo = env->tlbsets[mmu][set][idx].lo;
- hi = env->tlbsets[mmu][set][idx].hi;
- tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
- tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
+ for (set = 0; set < 4; set++) {
+ for (idx = 0; idx < 16; idx++) {
+ lo = env->tlbsets[mmu][set][idx].lo;
+ hi = env->tlbsets[mmu][set][idx].hi;
+ tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
+ tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
- printf ("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
- set, idx, hi, lo, tlb_vpn, tlb_pfn);
- }
- }
+ printf("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
+ set, idx, hi, lo, tlb_vpn, tlb_pfn);
+ }
+ }
}
#endif
@@ -131,232 +134,224 @@ static int cris_mmu_translate_page(struct cris_mmu_result *res,
CPUCRISState *env, uint32_t vaddr,
int rw, int usermode, int debug)
{
- unsigned int vpage;
- unsigned int idx;
- uint32_t pid, lo, hi;
- uint32_t tlb_vpn, tlb_pfn = 0;
- int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x;
- int cfg_v, cfg_k, cfg_w, cfg_x;
- int set, match = 0;
- uint32_t r_cause;
- uint32_t r_cfg;
- int rwcause;
- int mmu = 1; /* Data mmu is default. */
- int vect_base;
+ unsigned int vpage;
+ unsigned int idx;
+ uint32_t pid, lo, hi;
+ uint32_t tlb_vpn, tlb_pfn = 0;
+ int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x;
+ int cfg_v, cfg_k, cfg_w, cfg_x;
+ int set, match = 0;
+ uint32_t r_cause;
+ uint32_t r_cfg;
+ int rwcause;
+ int mmu = 1; /* Data mmu is default. */
+ int vect_base;
- r_cause = env->sregs[SFR_R_MM_CAUSE];
- r_cfg = env->sregs[SFR_RW_MM_CFG];
- pid = env->pregs[PR_PID] & 0xff;
+ r_cause = env->sregs[SFR_R_MM_CAUSE];
+ r_cfg = env->sregs[SFR_RW_MM_CFG];
+ pid = env->pregs[PR_PID] & 0xff;
- switch (rw) {
- case 2: rwcause = CRIS_MMU_ERR_EXEC; mmu = 0; break;
- case 1: rwcause = CRIS_MMU_ERR_WRITE; break;
- default:
- case 0: rwcause = CRIS_MMU_ERR_READ; break;
- }
+ switch (rw) {
+ case 2:
+ rwcause = CRIS_MMU_ERR_EXEC;
+ mmu = 0;
+ break;
+ case 1:
+ rwcause = CRIS_MMU_ERR_WRITE;
+ break;
+ default:
+ case 0:
+ rwcause = CRIS_MMU_ERR_READ;
+ break;
+ }
- /* I exception vectors 4 - 7, D 8 - 11. */
- vect_base = (mmu + 1) * 4;
+ /* I exception vectors 4 - 7, D 8 - 11. */
+ vect_base = (mmu + 1) * 4;
- vpage = vaddr >> 13;
+ vpage = vaddr >> 13;
- /* We know the index which to check on each set.
- Scan both I and D. */
-#if 0
- for (set = 0; set < 4; set++) {
- for (idx = 0; idx < 16; idx++) {
- lo = env->tlbsets[mmu][set][idx].lo;
- hi = env->tlbsets[mmu][set][idx].hi;
- tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
- tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
+ /*
+ * We know the index which to check on each set.
+ * Scan both I and D.
+ */
+ idx = vpage & 15;
+ for (set = 0; set < 4; set++) {
+ lo = env->tlbsets[mmu][set][idx].lo;
+ hi = env->tlbsets[mmu][set][idx].hi;
- printf ("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
- set, idx, hi, lo, tlb_vpn, tlb_pfn);
- }
- }
-#endif
+ tlb_vpn = hi >> 13;
+ tlb_pid = EXTRACT_FIELD(hi, 0, 7);
+ tlb_g = EXTRACT_FIELD(lo, 4, 4);
- idx = vpage & 15;
- for (set = 0; set < 4; set++)
- {
- lo = env->tlbsets[mmu][set][idx].lo;
- hi = env->tlbsets[mmu][set][idx].hi;
+ D_LOG("TLB[%d][%d][%d] v=%x vpage=%x lo=%x hi=%x\n",
+ mmu, set, idx, tlb_vpn, vpage, lo, hi);
+ if ((tlb_g || (tlb_pid == pid)) && tlb_vpn == vpage) {
+ match = 1;
+ break;
+ }
+ }
- tlb_vpn = hi >> 13;
- tlb_pid = EXTRACT_FIELD(hi, 0, 7);
- tlb_g = EXTRACT_FIELD(lo, 4, 4);
+ res->bf_vec = vect_base;
+ if (match) {
+ cfg_w = EXTRACT_FIELD(r_cfg, 19, 19);
+ cfg_k = EXTRACT_FIELD(r_cfg, 18, 18);
+ cfg_x = EXTRACT_FIELD(r_cfg, 17, 17);
+ cfg_v = EXTRACT_FIELD(r_cfg, 16, 16);
- D_LOG("TLB[%d][%d][%d] v=%x vpage=%x lo=%x hi=%x\n",
- mmu, set, idx, tlb_vpn, vpage, lo, hi);
- if ((tlb_g || (tlb_pid == pid))
- && tlb_vpn == vpage) {
- match = 1;
- break;
- }
- }
+ tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
+ tlb_v = EXTRACT_FIELD(lo, 3, 3);
+ tlb_k = EXTRACT_FIELD(lo, 2, 2);
+ tlb_w = EXTRACT_FIELD(lo, 1, 1);
+ tlb_x = EXTRACT_FIELD(lo, 0, 0);
- res->bf_vec = vect_base;
- if (match) {
- cfg_w = EXTRACT_FIELD(r_cfg, 19, 19);
- cfg_k = EXTRACT_FIELD(r_cfg, 18, 18);
- cfg_x = EXTRACT_FIELD(r_cfg, 17, 17);
- cfg_v = EXTRACT_FIELD(r_cfg, 16, 16);
+ /*
+ * set_exception_vector(0x04, i_mmu_refill);
+ * set_exception_vector(0x05, i_mmu_invalid);
+ * set_exception_vector(0x06, i_mmu_access);
+ * set_exception_vector(0x07, i_mmu_execute);
+ * set_exception_vector(0x08, d_mmu_refill);
+ * set_exception_vector(0x09, d_mmu_invalid);
+ * set_exception_vector(0x0a, d_mmu_access);
+ * set_exception_vector(0x0b, d_mmu_write);
+ */
+ if (cfg_k && tlb_k && usermode) {
+ D(printf("tlb: kernel protected %x lo=%x pc=%x\n",
+ vaddr, lo, env->pc));
+ match = 0;
+ res->bf_vec = vect_base + 2;
+ } else if (rw == 1 && cfg_w && !tlb_w) {
+ D(printf("tlb: write protected %x lo=%x pc=%x\n",
+ vaddr, lo, env->pc));
+ match = 0;
+ /* write accesses never go through the I mmu. */
+ res->bf_vec = vect_base + 3;
+ } else if (rw == 2 && cfg_x && !tlb_x) {
+ D(printf("tlb: exec protected %x lo=%x pc=%x\n",
+ vaddr, lo, env->pc));
+ match = 0;
+ res->bf_vec = vect_base + 3;
+ } else if (cfg_v && !tlb_v) {
+ D(printf("tlb: invalid %x\n", vaddr));
+ match = 0;
+ res->bf_vec = vect_base + 1;
+ }
- tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
- tlb_v = EXTRACT_FIELD(lo, 3, 3);
- tlb_k = EXTRACT_FIELD(lo, 2, 2);
- tlb_w = EXTRACT_FIELD(lo, 1, 1);
- tlb_x = EXTRACT_FIELD(lo, 0, 0);
+ res->prot = 0;
+ if (match) {
+ res->prot |= PAGE_READ;
+ if (tlb_w) {
+ res->prot |= PAGE_WRITE;
+ }
+ if (mmu == 0 && (cfg_x || tlb_x)) {
+ res->prot |= PAGE_EXEC;
+ }
+ } else {
+ D(dump_tlb(env, mmu));
+ }
+ } else {
+ /* If refill, provide a randomized set. */
+ set = env->mmu_rand_lfsr & 3;
+ }
- /*
- set_exception_vector(0x04, i_mmu_refill);
- set_exception_vector(0x05, i_mmu_invalid);
- set_exception_vector(0x06, i_mmu_access);
- set_exception_vector(0x07, i_mmu_execute);
- set_exception_vector(0x08, d_mmu_refill);
- set_exception_vector(0x09, d_mmu_invalid);
- set_exception_vector(0x0a, d_mmu_access);
- set_exception_vector(0x0b, d_mmu_write);
- */
- if (cfg_k && tlb_k && usermode) {
- D(printf ("tlb: kernel protected %x lo=%x pc=%x\n",
- vaddr, lo, env->pc));
- match = 0;
- res->bf_vec = vect_base + 2;
- } else if (rw == 1 && cfg_w && !tlb_w) {
- D(printf ("tlb: write protected %x lo=%x pc=%x\n",
- vaddr, lo, env->pc));
- match = 0;
- /* write accesses never go through the I mmu. */
- res->bf_vec = vect_base + 3;
- } else if (rw == 2 && cfg_x && !tlb_x) {
- D(printf ("tlb: exec protected %x lo=%x pc=%x\n",
- vaddr, lo, env->pc));
- match = 0;
- res->bf_vec = vect_base + 3;
- } else if (cfg_v && !tlb_v) {
- D(printf ("tlb: invalid %x\n", vaddr));
- match = 0;
- res->bf_vec = vect_base + 1;
- }
+ if (!match && !debug) {
+ cris_mmu_update_rand_lfsr(env);
- res->prot = 0;
- if (match) {
- res->prot |= PAGE_READ;
- if (tlb_w)
- res->prot |= PAGE_WRITE;
- if (mmu == 0 && (cfg_x || tlb_x))
- res->prot |= PAGE_EXEC;
- }
- else
- D(dump_tlb(env, mmu));
- } else {
- /* If refill, provide a randomized set. */
- set = env->mmu_rand_lfsr & 3;
- }
+ /* Compute index. */
+ idx = vpage & 15;
- if (!match && !debug) {
- cris_mmu_update_rand_lfsr(env);
+ /* Update RW_MM_TLB_SEL. */
+ env->sregs[SFR_RW_MM_TLB_SEL] = 0;
+ set_field(&env->sregs[SFR_RW_MM_TLB_SEL], idx, 0, 4);
+ set_field(&env->sregs[SFR_RW_MM_TLB_SEL], set, 4, 2);
- /* Compute index. */
- idx = vpage & 15;
+ /* Update RW_MM_CAUSE. */
+ set_field(&r_cause, rwcause, 8, 2);
+ set_field(&r_cause, vpage, 13, 19);
+ set_field(&r_cause, pid, 0, 8);
+ env->sregs[SFR_R_MM_CAUSE] = r_cause;
+ D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc));
+ }
- /* Update RW_MM_TLB_SEL. */
- env->sregs[SFR_RW_MM_TLB_SEL] = 0;
- set_field(&env->sregs[SFR_RW_MM_TLB_SEL], idx, 0, 4);
- set_field(&env->sregs[SFR_RW_MM_TLB_SEL], set, 4, 2);
+ D(printf("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x"
+ " %x cause=%x sel=%x sp=%x %x %x\n",
+ __func__, rw, match, env->pc,
+ vaddr, vpage,
+ tlb_vpn, tlb_pfn, tlb_pid,
+ pid,
+ r_cause,
+ env->sregs[SFR_RW_MM_TLB_SEL],
+ env->regs[R_SP], env->pregs[PR_USP], env->ksp));
- /* Update RW_MM_CAUSE. */
- set_field(&r_cause, rwcause, 8, 2);
- set_field(&r_cause, vpage, 13, 19);
- set_field(&r_cause, pid, 0, 8);
- env->sregs[SFR_R_MM_CAUSE] = r_cause;
- D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc));
- }
-
- D(printf ("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x"
- " %x cause=%x sel=%x sp=%x %x %x\n",
- __func__, rw, match, env->pc,
- vaddr, vpage,
- tlb_vpn, tlb_pfn, tlb_pid,
- pid,
- r_cause,
- env->sregs[SFR_RW_MM_TLB_SEL],
- env->regs[R_SP], env->pregs[PR_USP], env->ksp));
-
- res->phy = tlb_pfn << TARGET_PAGE_BITS;
- return !match;
+ res->phy = tlb_pfn << TARGET_PAGE_BITS;
+ return !match;
}
void cris_mmu_flush_pid(CPUCRISState *env, uint32_t pid)
{
CRISCPU *cpu = cris_env_get_cpu(env);
- target_ulong vaddr;
- unsigned int idx;
- uint32_t lo, hi;
- uint32_t tlb_vpn;
- int tlb_pid, tlb_g, tlb_v;
- unsigned int set;
- unsigned int mmu;
+ target_ulong vaddr;
+ unsigned int idx;
+ uint32_t lo, hi;
+ uint32_t tlb_vpn;
+ int tlb_pid, tlb_g, tlb_v;
+ unsigned int set;
+ unsigned int mmu;
- pid &= 0xff;
- for (mmu = 0; mmu < 2; mmu++) {
- for (set = 0; set < 4; set++)
- {
- for (idx = 0; idx < 16; idx++) {
- lo = env->tlbsets[mmu][set][idx].lo;
- hi = env->tlbsets[mmu][set][idx].hi;
-
- tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
- tlb_pid = EXTRACT_FIELD(hi, 0, 7);
- tlb_g = EXTRACT_FIELD(lo, 4, 4);
- tlb_v = EXTRACT_FIELD(lo, 3, 3);
+ pid &= 0xff;
+ for (mmu = 0; mmu < 2; mmu++) {
+ for (set = 0; set < 4; set++) {
+ for (idx = 0; idx < 16; idx++) {
+ lo = env->tlbsets[mmu][set][idx].lo;
+ hi = env->tlbsets[mmu][set][idx].hi;
- if (tlb_v && !tlb_g && (tlb_pid == pid)) {
- vaddr = tlb_vpn << TARGET_PAGE_BITS;
- D_LOG("flush pid=%x vaddr=%x\n",
- pid, vaddr);
+ tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
+ tlb_pid = EXTRACT_FIELD(hi, 0, 7);
+ tlb_g = EXTRACT_FIELD(lo, 4, 4);
+ tlb_v = EXTRACT_FIELD(lo, 3, 3);
+
+ if (tlb_v && !tlb_g && (tlb_pid == pid)) {
+ vaddr = tlb_vpn << TARGET_PAGE_BITS;
+ D_LOG("flush pid=%x vaddr=%x\n", pid, vaddr);
tlb_flush_page(CPU(cpu), vaddr);
- }
- }
- }
- }
+ }
+ }
+ }
+ }
}
int cris_mmu_translate(struct cris_mmu_result *res,
CPUCRISState *env, uint32_t vaddr,
int rw, int mmu_idx, int debug)
{
- int seg;
- int miss = 0;
- int is_user = mmu_idx == MMU_USER_IDX;
- uint32_t old_srs;
+ int seg;
+ int miss = 0;
+ int is_user = mmu_idx == MMU_USER_IDX;
+ uint32_t old_srs;
- old_srs= env->pregs[PR_SRS];
+ old_srs = env->pregs[PR_SRS];
- /* rw == 2 means exec, map the access to the insn mmu. */
- env->pregs[PR_SRS] = rw == 2 ? 1 : 2;
+ /* rw == 2 means exec, map the access to the insn mmu. */
+ env->pregs[PR_SRS] = rw == 2 ? 1 : 2;
- if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) {
- res->phy = vaddr;
- res->prot = PAGE_BITS;
- goto done;
- }
+ if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) {
+ res->phy = vaddr;
+ res->prot = PAGE_BITS;
+ goto done;
+ }
- seg = vaddr >> 28;
- if (!is_user && cris_mmu_segmented_addr(seg, env->sregs[SFR_RW_MM_CFG]))
- {
- uint32_t base;
+ seg = vaddr >> 28;
+ if (!is_user && cris_mmu_segmented_addr(seg, env->sregs[SFR_RW_MM_CFG])) {
+ uint32_t base;
- miss = 0;
- base = cris_mmu_translate_seg(env, seg);
- res->phy = base | (0x0fffffff & vaddr);
- res->prot = PAGE_BITS;
- } else {
- miss = cris_mmu_translate_page(res, env, vaddr, rw,
- is_user, debug);
- }
- done:
- env->pregs[PR_SRS] = old_srs;
- return miss;
+ miss = 0;
+ base = cris_mmu_translate_seg(env, seg);
+ res->phy = base | (0x0fffffff & vaddr);
+ res->prot = PAGE_BITS;
+ } else {
+ miss = cris_mmu_translate_page(res, env, vaddr, rw,
+ is_user, debug);
+ }
+ done:
+ env->pregs[PR_SRS] = old_srs;
+ return miss;
}
--
2.17.1
On Tue, May 7, 2019 at 5:13 PM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Fix all of the coding style errors in this file at once.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/cris/mmu.c | 479 +++++++++++++++++++++++-----------------------
> 1 file changed, 237 insertions(+), 242 deletions(-)
>
> diff --git a/target/cris/mmu.c b/target/cris/mmu.c
> index b8db908823..9cb73bbfec 100644
> --- a/target/cris/mmu.c
> +++ b/target/cris/mmu.c
> @@ -33,96 +33,99 @@
>
> void cris_mmu_init(CPUCRISState *env)
> {
> - env->mmu_rand_lfsr = 0xcccc;
> + env->mmu_rand_lfsr = 0xcccc;
> }
>
> #define SR_POLYNOM 0x8805
> static inline unsigned int compute_polynom(unsigned int sr)
> {
> - unsigned int i;
> - unsigned int f;
> + unsigned int i;
> + unsigned int f;
>
> - f = 0;
> - for (i = 0; i < 16; i++)
> - f += ((SR_POLYNOM >> i) & 1) & ((sr >> i) & 1);
> + f = 0;
> + for (i = 0; i < 16; i++) {
> + f += ((SR_POLYNOM >> i) & 1) & ((sr >> i) & 1);
> + }
>
> - return f;
> + return f;
> }
>
> static void cris_mmu_update_rand_lfsr(CPUCRISState *env)
> {
> - unsigned int f;
> + unsigned int f;
>
> - /* Update lfsr at every fault. */
> - f = compute_polynom(env->mmu_rand_lfsr);
> - env->mmu_rand_lfsr >>= 1;
> - env->mmu_rand_lfsr |= (f << 15);
> - env->mmu_rand_lfsr &= 0xffff;
> + /* Update lfsr at every fault. */
> + f = compute_polynom(env->mmu_rand_lfsr);
> + env->mmu_rand_lfsr >>= 1;
> + env->mmu_rand_lfsr |= (f << 15);
> + env->mmu_rand_lfsr &= 0xffff;
> }
>
> static inline int cris_mmu_enabled(uint32_t rw_gc_cfg)
> {
> - return (rw_gc_cfg & 12) != 0;
> + return (rw_gc_cfg & 12) != 0;
> }
>
> static inline int cris_mmu_segmented_addr(int seg, uint32_t rw_mm_cfg)
> {
> - return (1 << seg) & rw_mm_cfg;
> + return (1 << seg) & rw_mm_cfg;
> }
>
> static uint32_t cris_mmu_translate_seg(CPUCRISState *env, int seg)
> {
> - uint32_t base;
> - int i;
> + uint32_t base;
> + int i;
>
> - if (seg < 8)
> - base = env->sregs[SFR_RW_MM_KBASE_LO];
> - else
> - base = env->sregs[SFR_RW_MM_KBASE_HI];
> + if (seg < 8) {
> + base = env->sregs[SFR_RW_MM_KBASE_LO];
> + } else {
> + base = env->sregs[SFR_RW_MM_KBASE_HI];
> + }
>
> - i = seg & 7;
> - base >>= i * 4;
> - base &= 15;
> + i = seg & 7;
> + base >>= i * 4;
> + base &= 15;
>
> - base <<= 28;
> - return base;
> + base <<= 28;
> + return base;
> }
> -/* Used by the tlb decoder. */
> -#define EXTRACT_FIELD(src, start, end) \
> - (((src) >> start) & ((1 << (end - start + 1)) - 1))
>
> -static inline void set_field(uint32_t *dst, unsigned int val,
> +/* Used by the tlb decoder. */
> +#define EXTRACT_FIELD(src, start, end) \
> + (((src) >> start) & ((1 << (end - start + 1)) - 1))
> +
> +static inline void set_field(uint32_t *dst, unsigned int val,
> unsigned int offset, unsigned int width)
> {
> - uint32_t mask;
> + uint32_t mask;
>
> - mask = (1 << width) - 1;
> - mask <<= offset;
> - val <<= offset;
> + mask = (1 << width) - 1;
> + mask <<= offset;
> + val <<= offset;
>
> - val &= mask;
> - *dst &= ~(mask);
> - *dst |= val;
> + val &= mask;
> + *dst &= ~(mask);
> + *dst |= val;
> }
>
> #ifdef DEBUG
> static void dump_tlb(CPUCRISState *env, int mmu)
> {
> - int set;
> - int idx;
> - uint32_t hi, lo, tlb_vpn, tlb_pfn;
> + int set;
> + int idx;
> + uint32_t hi, lo, tlb_vpn, tlb_pfn;
>
> - for (set = 0; set < 4; set++) {
> - for (idx = 0; idx < 16; idx++) {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> - tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> - tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
> + for (set = 0; set < 4; set++) {
> + for (idx = 0; idx < 16; idx++) {
> + lo = env->tlbsets[mmu][set][idx].lo;
> + hi = env->tlbsets[mmu][set][idx].hi;
> + tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> + tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
>
> - printf ("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
> - set, idx, hi, lo, tlb_vpn, tlb_pfn);
> - }
> - }
> + printf("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
> + set, idx, hi, lo, tlb_vpn, tlb_pfn);
> + }
> + }
> }
> #endif
>
> @@ -131,232 +134,224 @@ static int cris_mmu_translate_page(struct cris_mmu_result *res,
> CPUCRISState *env, uint32_t vaddr,
> int rw, int usermode, int debug)
> {
> - unsigned int vpage;
> - unsigned int idx;
> - uint32_t pid, lo, hi;
> - uint32_t tlb_vpn, tlb_pfn = 0;
> - int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x;
> - int cfg_v, cfg_k, cfg_w, cfg_x;
> - int set, match = 0;
> - uint32_t r_cause;
> - uint32_t r_cfg;
> - int rwcause;
> - int mmu = 1; /* Data mmu is default. */
> - int vect_base;
> + unsigned int vpage;
> + unsigned int idx;
> + uint32_t pid, lo, hi;
> + uint32_t tlb_vpn, tlb_pfn = 0;
> + int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x;
> + int cfg_v, cfg_k, cfg_w, cfg_x;
> + int set, match = 0;
> + uint32_t r_cause;
> + uint32_t r_cfg;
> + int rwcause;
> + int mmu = 1; /* Data mmu is default. */
> + int vect_base;
>
> - r_cause = env->sregs[SFR_R_MM_CAUSE];
> - r_cfg = env->sregs[SFR_RW_MM_CFG];
> - pid = env->pregs[PR_PID] & 0xff;
> + r_cause = env->sregs[SFR_R_MM_CAUSE];
> + r_cfg = env->sregs[SFR_RW_MM_CFG];
> + pid = env->pregs[PR_PID] & 0xff;
>
> - switch (rw) {
> - case 2: rwcause = CRIS_MMU_ERR_EXEC; mmu = 0; break;
> - case 1: rwcause = CRIS_MMU_ERR_WRITE; break;
> - default:
> - case 0: rwcause = CRIS_MMU_ERR_READ; break;
> - }
> + switch (rw) {
> + case 2:
> + rwcause = CRIS_MMU_ERR_EXEC;
> + mmu = 0;
> + break;
> + case 1:
> + rwcause = CRIS_MMU_ERR_WRITE;
> + break;
> + default:
> + case 0:
> + rwcause = CRIS_MMU_ERR_READ;
> + break;
> + }
>
> - /* I exception vectors 4 - 7, D 8 - 11. */
> - vect_base = (mmu + 1) * 4;
> + /* I exception vectors 4 - 7, D 8 - 11. */
> + vect_base = (mmu + 1) * 4;
>
> - vpage = vaddr >> 13;
> + vpage = vaddr >> 13;
>
> - /* We know the index which to check on each set.
> - Scan both I and D. */
> -#if 0
> - for (set = 0; set < 4; set++) {
> - for (idx = 0; idx < 16; idx++) {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> - tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> - tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
> + /*
> + * We know the index which to check on each set.
> + * Scan both I and D.
> + */
> + idx = vpage & 15;
> + for (set = 0; set < 4; set++) {
> + lo = env->tlbsets[mmu][set][idx].lo;
> + hi = env->tlbsets[mmu][set][idx].hi;
>
> - printf ("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
> - set, idx, hi, lo, tlb_vpn, tlb_pfn);
> - }
> - }
> -#endif
> + tlb_vpn = hi >> 13;
> + tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> + tlb_g = EXTRACT_FIELD(lo, 4, 4);
>
> - idx = vpage & 15;
> - for (set = 0; set < 4; set++)
> - {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> + D_LOG("TLB[%d][%d][%d] v=%x vpage=%x lo=%x hi=%x\n",
> + mmu, set, idx, tlb_vpn, vpage, lo, hi);
> + if ((tlb_g || (tlb_pid == pid)) && tlb_vpn == vpage) {
> + match = 1;
> + break;
> + }
> + }
>
> - tlb_vpn = hi >> 13;
> - tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> - tlb_g = EXTRACT_FIELD(lo, 4, 4);
> + res->bf_vec = vect_base;
> + if (match) {
> + cfg_w = EXTRACT_FIELD(r_cfg, 19, 19);
> + cfg_k = EXTRACT_FIELD(r_cfg, 18, 18);
> + cfg_x = EXTRACT_FIELD(r_cfg, 17, 17);
> + cfg_v = EXTRACT_FIELD(r_cfg, 16, 16);
>
> - D_LOG("TLB[%d][%d][%d] v=%x vpage=%x lo=%x hi=%x\n",
> - mmu, set, idx, tlb_vpn, vpage, lo, hi);
> - if ((tlb_g || (tlb_pid == pid))
> - && tlb_vpn == vpage) {
> - match = 1;
> - break;
> - }
> - }
> + tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
> + tlb_v = EXTRACT_FIELD(lo, 3, 3);
> + tlb_k = EXTRACT_FIELD(lo, 2, 2);
> + tlb_w = EXTRACT_FIELD(lo, 1, 1);
> + tlb_x = EXTRACT_FIELD(lo, 0, 0);
>
> - res->bf_vec = vect_base;
> - if (match) {
> - cfg_w = EXTRACT_FIELD(r_cfg, 19, 19);
> - cfg_k = EXTRACT_FIELD(r_cfg, 18, 18);
> - cfg_x = EXTRACT_FIELD(r_cfg, 17, 17);
> - cfg_v = EXTRACT_FIELD(r_cfg, 16, 16);
> + /*
> + * set_exception_vector(0x04, i_mmu_refill);
> + * set_exception_vector(0x05, i_mmu_invalid);
> + * set_exception_vector(0x06, i_mmu_access);
> + * set_exception_vector(0x07, i_mmu_execute);
> + * set_exception_vector(0x08, d_mmu_refill);
> + * set_exception_vector(0x09, d_mmu_invalid);
> + * set_exception_vector(0x0a, d_mmu_access);
> + * set_exception_vector(0x0b, d_mmu_write);
> + */
> + if (cfg_k && tlb_k && usermode) {
> + D(printf("tlb: kernel protected %x lo=%x pc=%x\n",
> + vaddr, lo, env->pc));
> + match = 0;
> + res->bf_vec = vect_base + 2;
> + } else if (rw == 1 && cfg_w && !tlb_w) {
> + D(printf("tlb: write protected %x lo=%x pc=%x\n",
> + vaddr, lo, env->pc));
> + match = 0;
> + /* write accesses never go through the I mmu. */
> + res->bf_vec = vect_base + 3;
> + } else if (rw == 2 && cfg_x && !tlb_x) {
> + D(printf("tlb: exec protected %x lo=%x pc=%x\n",
> + vaddr, lo, env->pc));
> + match = 0;
> + res->bf_vec = vect_base + 3;
> + } else if (cfg_v && !tlb_v) {
> + D(printf("tlb: invalid %x\n", vaddr));
> + match = 0;
> + res->bf_vec = vect_base + 1;
> + }
>
> - tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
> - tlb_v = EXTRACT_FIELD(lo, 3, 3);
> - tlb_k = EXTRACT_FIELD(lo, 2, 2);
> - tlb_w = EXTRACT_FIELD(lo, 1, 1);
> - tlb_x = EXTRACT_FIELD(lo, 0, 0);
> + res->prot = 0;
> + if (match) {
> + res->prot |= PAGE_READ;
> + if (tlb_w) {
> + res->prot |= PAGE_WRITE;
> + }
> + if (mmu == 0 && (cfg_x || tlb_x)) {
> + res->prot |= PAGE_EXEC;
> + }
> + } else {
> + D(dump_tlb(env, mmu));
> + }
> + } else {
> + /* If refill, provide a randomized set. */
> + set = env->mmu_rand_lfsr & 3;
> + }
>
> - /*
> - set_exception_vector(0x04, i_mmu_refill);
> - set_exception_vector(0x05, i_mmu_invalid);
> - set_exception_vector(0x06, i_mmu_access);
> - set_exception_vector(0x07, i_mmu_execute);
> - set_exception_vector(0x08, d_mmu_refill);
> - set_exception_vector(0x09, d_mmu_invalid);
> - set_exception_vector(0x0a, d_mmu_access);
> - set_exception_vector(0x0b, d_mmu_write);
> - */
> - if (cfg_k && tlb_k && usermode) {
> - D(printf ("tlb: kernel protected %x lo=%x pc=%x\n",
> - vaddr, lo, env->pc));
> - match = 0;
> - res->bf_vec = vect_base + 2;
> - } else if (rw == 1 && cfg_w && !tlb_w) {
> - D(printf ("tlb: write protected %x lo=%x pc=%x\n",
> - vaddr, lo, env->pc));
> - match = 0;
> - /* write accesses never go through the I mmu. */
> - res->bf_vec = vect_base + 3;
> - } else if (rw == 2 && cfg_x && !tlb_x) {
> - D(printf ("tlb: exec protected %x lo=%x pc=%x\n",
> - vaddr, lo, env->pc));
> - match = 0;
> - res->bf_vec = vect_base + 3;
> - } else if (cfg_v && !tlb_v) {
> - D(printf ("tlb: invalid %x\n", vaddr));
> - match = 0;
> - res->bf_vec = vect_base + 1;
> - }
> + if (!match && !debug) {
> + cris_mmu_update_rand_lfsr(env);
>
> - res->prot = 0;
> - if (match) {
> - res->prot |= PAGE_READ;
> - if (tlb_w)
> - res->prot |= PAGE_WRITE;
> - if (mmu == 0 && (cfg_x || tlb_x))
> - res->prot |= PAGE_EXEC;
> - }
> - else
> - D(dump_tlb(env, mmu));
> - } else {
> - /* If refill, provide a randomized set. */
> - set = env->mmu_rand_lfsr & 3;
> - }
> + /* Compute index. */
> + idx = vpage & 15;
>
> - if (!match && !debug) {
> - cris_mmu_update_rand_lfsr(env);
> + /* Update RW_MM_TLB_SEL. */
> + env->sregs[SFR_RW_MM_TLB_SEL] = 0;
> + set_field(&env->sregs[SFR_RW_MM_TLB_SEL], idx, 0, 4);
> + set_field(&env->sregs[SFR_RW_MM_TLB_SEL], set, 4, 2);
>
> - /* Compute index. */
> - idx = vpage & 15;
> + /* Update RW_MM_CAUSE. */
> + set_field(&r_cause, rwcause, 8, 2);
> + set_field(&r_cause, vpage, 13, 19);
> + set_field(&r_cause, pid, 0, 8);
> + env->sregs[SFR_R_MM_CAUSE] = r_cause;
> + D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc));
> + }
>
> - /* Update RW_MM_TLB_SEL. */
> - env->sregs[SFR_RW_MM_TLB_SEL] = 0;
> - set_field(&env->sregs[SFR_RW_MM_TLB_SEL], idx, 0, 4);
> - set_field(&env->sregs[SFR_RW_MM_TLB_SEL], set, 4, 2);
> + D(printf("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x"
> + " %x cause=%x sel=%x sp=%x %x %x\n",
> + __func__, rw, match, env->pc,
> + vaddr, vpage,
> + tlb_vpn, tlb_pfn, tlb_pid,
> + pid,
> + r_cause,
> + env->sregs[SFR_RW_MM_TLB_SEL],
> + env->regs[R_SP], env->pregs[PR_USP], env->ksp));
>
> - /* Update RW_MM_CAUSE. */
> - set_field(&r_cause, rwcause, 8, 2);
> - set_field(&r_cause, vpage, 13, 19);
> - set_field(&r_cause, pid, 0, 8);
> - env->sregs[SFR_R_MM_CAUSE] = r_cause;
> - D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc));
> - }
> -
> - D(printf ("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x"
> - " %x cause=%x sel=%x sp=%x %x %x\n",
> - __func__, rw, match, env->pc,
> - vaddr, vpage,
> - tlb_vpn, tlb_pfn, tlb_pid,
> - pid,
> - r_cause,
> - env->sregs[SFR_RW_MM_TLB_SEL],
> - env->regs[R_SP], env->pregs[PR_USP], env->ksp));
> -
> - res->phy = tlb_pfn << TARGET_PAGE_BITS;
> - return !match;
> + res->phy = tlb_pfn << TARGET_PAGE_BITS;
> + return !match;
> }
>
> void cris_mmu_flush_pid(CPUCRISState *env, uint32_t pid)
> {
> CRISCPU *cpu = cris_env_get_cpu(env);
> - target_ulong vaddr;
> - unsigned int idx;
> - uint32_t lo, hi;
> - uint32_t tlb_vpn;
> - int tlb_pid, tlb_g, tlb_v;
> - unsigned int set;
> - unsigned int mmu;
> + target_ulong vaddr;
> + unsigned int idx;
> + uint32_t lo, hi;
> + uint32_t tlb_vpn;
> + int tlb_pid, tlb_g, tlb_v;
> + unsigned int set;
> + unsigned int mmu;
>
> - pid &= 0xff;
> - for (mmu = 0; mmu < 2; mmu++) {
> - for (set = 0; set < 4; set++)
> - {
> - for (idx = 0; idx < 16; idx++) {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> -
> - tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> - tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> - tlb_g = EXTRACT_FIELD(lo, 4, 4);
> - tlb_v = EXTRACT_FIELD(lo, 3, 3);
> + pid &= 0xff;
> + for (mmu = 0; mmu < 2; mmu++) {
> + for (set = 0; set < 4; set++) {
> + for (idx = 0; idx < 16; idx++) {
> + lo = env->tlbsets[mmu][set][idx].lo;
> + hi = env->tlbsets[mmu][set][idx].hi;
>
> - if (tlb_v && !tlb_g && (tlb_pid == pid)) {
> - vaddr = tlb_vpn << TARGET_PAGE_BITS;
> - D_LOG("flush pid=%x vaddr=%x\n",
> - pid, vaddr);
> + tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> + tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> + tlb_g = EXTRACT_FIELD(lo, 4, 4);
> + tlb_v = EXTRACT_FIELD(lo, 3, 3);
> +
> + if (tlb_v && !tlb_g && (tlb_pid == pid)) {
> + vaddr = tlb_vpn << TARGET_PAGE_BITS;
> + D_LOG("flush pid=%x vaddr=%x\n", pid, vaddr);
> tlb_flush_page(CPU(cpu), vaddr);
> - }
> - }
> - }
> - }
> + }
> + }
> + }
> + }
> }
>
> int cris_mmu_translate(struct cris_mmu_result *res,
> CPUCRISState *env, uint32_t vaddr,
> int rw, int mmu_idx, int debug)
> {
> - int seg;
> - int miss = 0;
> - int is_user = mmu_idx == MMU_USER_IDX;
> - uint32_t old_srs;
> + int seg;
> + int miss = 0;
> + int is_user = mmu_idx == MMU_USER_IDX;
> + uint32_t old_srs;
>
> - old_srs= env->pregs[PR_SRS];
> + old_srs = env->pregs[PR_SRS];
>
> - /* rw == 2 means exec, map the access to the insn mmu. */
> - env->pregs[PR_SRS] = rw == 2 ? 1 : 2;
> + /* rw == 2 means exec, map the access to the insn mmu. */
> + env->pregs[PR_SRS] = rw == 2 ? 1 : 2;
>
> - if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) {
> - res->phy = vaddr;
> - res->prot = PAGE_BITS;
> - goto done;
> - }
> + if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) {
> + res->phy = vaddr;
> + res->prot = PAGE_BITS;
> + goto done;
> + }
>
> - seg = vaddr >> 28;
> - if (!is_user && cris_mmu_segmented_addr(seg, env->sregs[SFR_RW_MM_CFG]))
> - {
> - uint32_t base;
> + seg = vaddr >> 28;
> + if (!is_user && cris_mmu_segmented_addr(seg, env->sregs[SFR_RW_MM_CFG])) {
> + uint32_t base;
>
> - miss = 0;
> - base = cris_mmu_translate_seg(env, seg);
> - res->phy = base | (0x0fffffff & vaddr);
> - res->prot = PAGE_BITS;
> - } else {
> - miss = cris_mmu_translate_page(res, env, vaddr, rw,
> - is_user, debug);
> - }
> - done:
> - env->pregs[PR_SRS] = old_srs;
> - return miss;
> + miss = 0;
> + base = cris_mmu_translate_seg(env, seg);
> + res->phy = base | (0x0fffffff & vaddr);
> + res->prot = PAGE_BITS;
> + } else {
> + miss = cris_mmu_translate_page(res, env, vaddr, rw,
> + is_user, debug);
> + }
> + done:
> + env->pregs[PR_SRS] = old_srs;
> + return miss;
> }
> --
> 2.17.1
>
>
On 5/8/19 2:06 AM, Richard Henderson wrote:
> Fix all of the coding style errors in this file at once.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/cris/mmu.c | 479 +++++++++++++++++++++++-----------------------
> 1 file changed, 237 insertions(+), 242 deletions(-)
>
> diff --git a/target/cris/mmu.c b/target/cris/mmu.c
> index b8db908823..9cb73bbfec 100644
> --- a/target/cris/mmu.c
> +++ b/target/cris/mmu.c
> @@ -33,96 +33,99 @@
>
> void cris_mmu_init(CPUCRISState *env)
> {
> - env->mmu_rand_lfsr = 0xcccc;
> + env->mmu_rand_lfsr = 0xcccc;
> }
>
> #define SR_POLYNOM 0x8805
> static inline unsigned int compute_polynom(unsigned int sr)
> {
> - unsigned int i;
> - unsigned int f;
> + unsigned int i;
> + unsigned int f;
>
> - f = 0;
> - for (i = 0; i < 16; i++)
> - f += ((SR_POLYNOM >> i) & 1) & ((sr >> i) & 1);
> + f = 0;
> + for (i = 0; i < 16; i++) {
> + f += ((SR_POLYNOM >> i) & 1) & ((sr >> i) & 1);
> + }
>
> - return f;
> + return f;
> }
>
> static void cris_mmu_update_rand_lfsr(CPUCRISState *env)
> {
> - unsigned int f;
> + unsigned int f;
>
> - /* Update lfsr at every fault. */
> - f = compute_polynom(env->mmu_rand_lfsr);
> - env->mmu_rand_lfsr >>= 1;
> - env->mmu_rand_lfsr |= (f << 15);
> - env->mmu_rand_lfsr &= 0xffff;
> + /* Update lfsr at every fault. */
> + f = compute_polynom(env->mmu_rand_lfsr);
> + env->mmu_rand_lfsr >>= 1;
> + env->mmu_rand_lfsr |= (f << 15);
> + env->mmu_rand_lfsr &= 0xffff;
> }
>
> static inline int cris_mmu_enabled(uint32_t rw_gc_cfg)
> {
> - return (rw_gc_cfg & 12) != 0;
> + return (rw_gc_cfg & 12) != 0;
> }
>
> static inline int cris_mmu_segmented_addr(int seg, uint32_t rw_mm_cfg)
> {
> - return (1 << seg) & rw_mm_cfg;
> + return (1 << seg) & rw_mm_cfg;
> }
>
> static uint32_t cris_mmu_translate_seg(CPUCRISState *env, int seg)
> {
> - uint32_t base;
> - int i;
> + uint32_t base;
> + int i;
>
> - if (seg < 8)
> - base = env->sregs[SFR_RW_MM_KBASE_LO];
> - else
> - base = env->sregs[SFR_RW_MM_KBASE_HI];
> + if (seg < 8) {
> + base = env->sregs[SFR_RW_MM_KBASE_LO];
> + } else {
> + base = env->sregs[SFR_RW_MM_KBASE_HI];
> + }
>
> - i = seg & 7;
> - base >>= i * 4;
> - base &= 15;
> + i = seg & 7;
> + base >>= i * 4;
> + base &= 15;
>
> - base <<= 28;
> - return base;
> + base <<= 28;
> + return base;
> }
> -/* Used by the tlb decoder. */
> -#define EXTRACT_FIELD(src, start, end) \
> - (((src) >> start) & ((1 << (end - start + 1)) - 1))
>
> -static inline void set_field(uint32_t *dst, unsigned int val,
> +/* Used by the tlb decoder. */
> +#define EXTRACT_FIELD(src, start, end) \
> + (((src) >> start) & ((1 << (end - start + 1)) - 1))
> +
> +static inline void set_field(uint32_t *dst, unsigned int val,
> unsigned int offset, unsigned int width)
> {
> - uint32_t mask;
> + uint32_t mask;
>
> - mask = (1 << width) - 1;
> - mask <<= offset;
> - val <<= offset;
> + mask = (1 << width) - 1;
> + mask <<= offset;
> + val <<= offset;
>
> - val &= mask;
> - *dst &= ~(mask);
> - *dst |= val;
> + val &= mask;
> + *dst &= ~(mask);
> + *dst |= val;
> }
>
> #ifdef DEBUG
> static void dump_tlb(CPUCRISState *env, int mmu)
> {
> - int set;
> - int idx;
> - uint32_t hi, lo, tlb_vpn, tlb_pfn;
> + int set;
> + int idx;
> + uint32_t hi, lo, tlb_vpn, tlb_pfn;
>
> - for (set = 0; set < 4; set++) {
> - for (idx = 0; idx < 16; idx++) {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> - tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> - tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
> + for (set = 0; set < 4; set++) {
> + for (idx = 0; idx < 16; idx++) {
> + lo = env->tlbsets[mmu][set][idx].lo;
> + hi = env->tlbsets[mmu][set][idx].hi;
> + tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> + tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
>
> - printf ("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
> - set, idx, hi, lo, tlb_vpn, tlb_pfn);
> - }
> - }
> + printf("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
> + set, idx, hi, lo, tlb_vpn, tlb_pfn);
> + }
> + }
> }
> #endif
>
> @@ -131,232 +134,224 @@ static int cris_mmu_translate_page(struct cris_mmu_result *res,
> CPUCRISState *env, uint32_t vaddr,
> int rw, int usermode, int debug)
> {
> - unsigned int vpage;
> - unsigned int idx;
> - uint32_t pid, lo, hi;
> - uint32_t tlb_vpn, tlb_pfn = 0;
> - int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x;
> - int cfg_v, cfg_k, cfg_w, cfg_x;
> - int set, match = 0;
> - uint32_t r_cause;
> - uint32_t r_cfg;
> - int rwcause;
> - int mmu = 1; /* Data mmu is default. */
> - int vect_base;
> + unsigned int vpage;
> + unsigned int idx;
> + uint32_t pid, lo, hi;
> + uint32_t tlb_vpn, tlb_pfn = 0;
> + int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x;
> + int cfg_v, cfg_k, cfg_w, cfg_x;
> + int set, match = 0;
> + uint32_t r_cause;
> + uint32_t r_cfg;
> + int rwcause;
> + int mmu = 1; /* Data mmu is default. */
> + int vect_base;
>
> - r_cause = env->sregs[SFR_R_MM_CAUSE];
> - r_cfg = env->sregs[SFR_RW_MM_CFG];
> - pid = env->pregs[PR_PID] & 0xff;
> + r_cause = env->sregs[SFR_R_MM_CAUSE];
> + r_cfg = env->sregs[SFR_RW_MM_CFG];
> + pid = env->pregs[PR_PID] & 0xff;
>
> - switch (rw) {
> - case 2: rwcause = CRIS_MMU_ERR_EXEC; mmu = 0; break;
> - case 1: rwcause = CRIS_MMU_ERR_WRITE; break;
> - default:
> - case 0: rwcause = CRIS_MMU_ERR_READ; break;
> - }
> + switch (rw) {
> + case 2:
> + rwcause = CRIS_MMU_ERR_EXEC;
> + mmu = 0;
> + break;
> + case 1:
> + rwcause = CRIS_MMU_ERR_WRITE;
> + break;
> + default:
> + case 0:
> + rwcause = CRIS_MMU_ERR_READ;
> + break;
> + }
>
> - /* I exception vectors 4 - 7, D 8 - 11. */
> - vect_base = (mmu + 1) * 4;
> + /* I exception vectors 4 - 7, D 8 - 11. */
> + vect_base = (mmu + 1) * 4;
>
> - vpage = vaddr >> 13;
> + vpage = vaddr >> 13;
>
> - /* We know the index which to check on each set.
> - Scan both I and D. */
> -#if 0
> - for (set = 0; set < 4; set++) {
> - for (idx = 0; idx < 16; idx++) {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> - tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> - tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
You remove dead code, OK.
Reviewed using 'git diff --ignore-all-space --word-diff=color'.
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> + /*
> + * We know the index which to check on each set.
> + * Scan both I and D.
> + */
> + idx = vpage & 15;
> + for (set = 0; set < 4; set++) {
> + lo = env->tlbsets[mmu][set][idx].lo;
> + hi = env->tlbsets[mmu][set][idx].hi;
>
> - printf ("TLB: [%d][%d] hi=%x lo=%x v=%x p=%x\n",
> - set, idx, hi, lo, tlb_vpn, tlb_pfn);
> - }
> - }
> -#endif
> + tlb_vpn = hi >> 13;
> + tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> + tlb_g = EXTRACT_FIELD(lo, 4, 4);
>
> - idx = vpage & 15;
> - for (set = 0; set < 4; set++)
> - {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> + D_LOG("TLB[%d][%d][%d] v=%x vpage=%x lo=%x hi=%x\n",
> + mmu, set, idx, tlb_vpn, vpage, lo, hi);
> + if ((tlb_g || (tlb_pid == pid)) && tlb_vpn == vpage) {
> + match = 1;
> + break;
> + }
> + }
>
> - tlb_vpn = hi >> 13;
> - tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> - tlb_g = EXTRACT_FIELD(lo, 4, 4);
> + res->bf_vec = vect_base;
> + if (match) {
> + cfg_w = EXTRACT_FIELD(r_cfg, 19, 19);
> + cfg_k = EXTRACT_FIELD(r_cfg, 18, 18);
> + cfg_x = EXTRACT_FIELD(r_cfg, 17, 17);
> + cfg_v = EXTRACT_FIELD(r_cfg, 16, 16);
>
> - D_LOG("TLB[%d][%d][%d] v=%x vpage=%x lo=%x hi=%x\n",
> - mmu, set, idx, tlb_vpn, vpage, lo, hi);
> - if ((tlb_g || (tlb_pid == pid))
> - && tlb_vpn == vpage) {
> - match = 1;
> - break;
> - }
> - }
> + tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
> + tlb_v = EXTRACT_FIELD(lo, 3, 3);
> + tlb_k = EXTRACT_FIELD(lo, 2, 2);
> + tlb_w = EXTRACT_FIELD(lo, 1, 1);
> + tlb_x = EXTRACT_FIELD(lo, 0, 0);
>
> - res->bf_vec = vect_base;
> - if (match) {
> - cfg_w = EXTRACT_FIELD(r_cfg, 19, 19);
> - cfg_k = EXTRACT_FIELD(r_cfg, 18, 18);
> - cfg_x = EXTRACT_FIELD(r_cfg, 17, 17);
> - cfg_v = EXTRACT_FIELD(r_cfg, 16, 16);
> + /*
> + * set_exception_vector(0x04, i_mmu_refill);
> + * set_exception_vector(0x05, i_mmu_invalid);
> + * set_exception_vector(0x06, i_mmu_access);
> + * set_exception_vector(0x07, i_mmu_execute);
> + * set_exception_vector(0x08, d_mmu_refill);
> + * set_exception_vector(0x09, d_mmu_invalid);
> + * set_exception_vector(0x0a, d_mmu_access);
> + * set_exception_vector(0x0b, d_mmu_write);
> + */
> + if (cfg_k && tlb_k && usermode) {
> + D(printf("tlb: kernel protected %x lo=%x pc=%x\n",
> + vaddr, lo, env->pc));
> + match = 0;
> + res->bf_vec = vect_base + 2;
> + } else if (rw == 1 && cfg_w && !tlb_w) {
> + D(printf("tlb: write protected %x lo=%x pc=%x\n",
> + vaddr, lo, env->pc));
> + match = 0;
> + /* write accesses never go through the I mmu. */
> + res->bf_vec = vect_base + 3;
> + } else if (rw == 2 && cfg_x && !tlb_x) {
> + D(printf("tlb: exec protected %x lo=%x pc=%x\n",
> + vaddr, lo, env->pc));
> + match = 0;
> + res->bf_vec = vect_base + 3;
> + } else if (cfg_v && !tlb_v) {
> + D(printf("tlb: invalid %x\n", vaddr));
> + match = 0;
> + res->bf_vec = vect_base + 1;
> + }
>
> - tlb_pfn = EXTRACT_FIELD(lo, 13, 31);
> - tlb_v = EXTRACT_FIELD(lo, 3, 3);
> - tlb_k = EXTRACT_FIELD(lo, 2, 2);
> - tlb_w = EXTRACT_FIELD(lo, 1, 1);
> - tlb_x = EXTRACT_FIELD(lo, 0, 0);
> + res->prot = 0;
> + if (match) {
> + res->prot |= PAGE_READ;
> + if (tlb_w) {
> + res->prot |= PAGE_WRITE;
> + }
> + if (mmu == 0 && (cfg_x || tlb_x)) {
> + res->prot |= PAGE_EXEC;
> + }
> + } else {
> + D(dump_tlb(env, mmu));
> + }
> + } else {
> + /* If refill, provide a randomized set. */
> + set = env->mmu_rand_lfsr & 3;
> + }
>
> - /*
> - set_exception_vector(0x04, i_mmu_refill);
> - set_exception_vector(0x05, i_mmu_invalid);
> - set_exception_vector(0x06, i_mmu_access);
> - set_exception_vector(0x07, i_mmu_execute);
> - set_exception_vector(0x08, d_mmu_refill);
> - set_exception_vector(0x09, d_mmu_invalid);
> - set_exception_vector(0x0a, d_mmu_access);
> - set_exception_vector(0x0b, d_mmu_write);
> - */
> - if (cfg_k && tlb_k && usermode) {
> - D(printf ("tlb: kernel protected %x lo=%x pc=%x\n",
> - vaddr, lo, env->pc));
> - match = 0;
> - res->bf_vec = vect_base + 2;
> - } else if (rw == 1 && cfg_w && !tlb_w) {
> - D(printf ("tlb: write protected %x lo=%x pc=%x\n",
> - vaddr, lo, env->pc));
> - match = 0;
> - /* write accesses never go through the I mmu. */
> - res->bf_vec = vect_base + 3;
> - } else if (rw == 2 && cfg_x && !tlb_x) {
> - D(printf ("tlb: exec protected %x lo=%x pc=%x\n",
> - vaddr, lo, env->pc));
> - match = 0;
> - res->bf_vec = vect_base + 3;
> - } else if (cfg_v && !tlb_v) {
> - D(printf ("tlb: invalid %x\n", vaddr));
> - match = 0;
> - res->bf_vec = vect_base + 1;
> - }
> + if (!match && !debug) {
> + cris_mmu_update_rand_lfsr(env);
>
> - res->prot = 0;
> - if (match) {
> - res->prot |= PAGE_READ;
> - if (tlb_w)
> - res->prot |= PAGE_WRITE;
> - if (mmu == 0 && (cfg_x || tlb_x))
> - res->prot |= PAGE_EXEC;
> - }
> - else
> - D(dump_tlb(env, mmu));
> - } else {
> - /* If refill, provide a randomized set. */
> - set = env->mmu_rand_lfsr & 3;
> - }
> + /* Compute index. */
> + idx = vpage & 15;
>
> - if (!match && !debug) {
> - cris_mmu_update_rand_lfsr(env);
> + /* Update RW_MM_TLB_SEL. */
> + env->sregs[SFR_RW_MM_TLB_SEL] = 0;
> + set_field(&env->sregs[SFR_RW_MM_TLB_SEL], idx, 0, 4);
> + set_field(&env->sregs[SFR_RW_MM_TLB_SEL], set, 4, 2);
>
> - /* Compute index. */
> - idx = vpage & 15;
> + /* Update RW_MM_CAUSE. */
> + set_field(&r_cause, rwcause, 8, 2);
> + set_field(&r_cause, vpage, 13, 19);
> + set_field(&r_cause, pid, 0, 8);
> + env->sregs[SFR_R_MM_CAUSE] = r_cause;
> + D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc));
> + }
>
> - /* Update RW_MM_TLB_SEL. */
> - env->sregs[SFR_RW_MM_TLB_SEL] = 0;
> - set_field(&env->sregs[SFR_RW_MM_TLB_SEL], idx, 0, 4);
> - set_field(&env->sregs[SFR_RW_MM_TLB_SEL], set, 4, 2);
> + D(printf("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x"
> + " %x cause=%x sel=%x sp=%x %x %x\n",
> + __func__, rw, match, env->pc,
> + vaddr, vpage,
> + tlb_vpn, tlb_pfn, tlb_pid,
> + pid,
> + r_cause,
> + env->sregs[SFR_RW_MM_TLB_SEL],
> + env->regs[R_SP], env->pregs[PR_USP], env->ksp));
>
> - /* Update RW_MM_CAUSE. */
> - set_field(&r_cause, rwcause, 8, 2);
> - set_field(&r_cause, vpage, 13, 19);
> - set_field(&r_cause, pid, 0, 8);
> - env->sregs[SFR_R_MM_CAUSE] = r_cause;
> - D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc));
> - }
> -
> - D(printf ("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x"
> - " %x cause=%x sel=%x sp=%x %x %x\n",
> - __func__, rw, match, env->pc,
> - vaddr, vpage,
> - tlb_vpn, tlb_pfn, tlb_pid,
> - pid,
> - r_cause,
> - env->sregs[SFR_RW_MM_TLB_SEL],
> - env->regs[R_SP], env->pregs[PR_USP], env->ksp));
> -
> - res->phy = tlb_pfn << TARGET_PAGE_BITS;
> - return !match;
> + res->phy = tlb_pfn << TARGET_PAGE_BITS;
> + return !match;
> }
>
> void cris_mmu_flush_pid(CPUCRISState *env, uint32_t pid)
> {
> CRISCPU *cpu = cris_env_get_cpu(env);
> - target_ulong vaddr;
> - unsigned int idx;
> - uint32_t lo, hi;
> - uint32_t tlb_vpn;
> - int tlb_pid, tlb_g, tlb_v;
> - unsigned int set;
> - unsigned int mmu;
> + target_ulong vaddr;
> + unsigned int idx;
> + uint32_t lo, hi;
> + uint32_t tlb_vpn;
> + int tlb_pid, tlb_g, tlb_v;
> + unsigned int set;
> + unsigned int mmu;
>
> - pid &= 0xff;
> - for (mmu = 0; mmu < 2; mmu++) {
> - for (set = 0; set < 4; set++)
> - {
> - for (idx = 0; idx < 16; idx++) {
> - lo = env->tlbsets[mmu][set][idx].lo;
> - hi = env->tlbsets[mmu][set][idx].hi;
> -
> - tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> - tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> - tlb_g = EXTRACT_FIELD(lo, 4, 4);
> - tlb_v = EXTRACT_FIELD(lo, 3, 3);
> + pid &= 0xff;
> + for (mmu = 0; mmu < 2; mmu++) {
> + for (set = 0; set < 4; set++) {
> + for (idx = 0; idx < 16; idx++) {
> + lo = env->tlbsets[mmu][set][idx].lo;
> + hi = env->tlbsets[mmu][set][idx].hi;
>
> - if (tlb_v && !tlb_g && (tlb_pid == pid)) {
> - vaddr = tlb_vpn << TARGET_PAGE_BITS;
> - D_LOG("flush pid=%x vaddr=%x\n",
> - pid, vaddr);
> + tlb_vpn = EXTRACT_FIELD(hi, 13, 31);
> + tlb_pid = EXTRACT_FIELD(hi, 0, 7);
> + tlb_g = EXTRACT_FIELD(lo, 4, 4);
> + tlb_v = EXTRACT_FIELD(lo, 3, 3);
> +
> + if (tlb_v && !tlb_g && (tlb_pid == pid)) {
> + vaddr = tlb_vpn << TARGET_PAGE_BITS;
> + D_LOG("flush pid=%x vaddr=%x\n", pid, vaddr);
> tlb_flush_page(CPU(cpu), vaddr);
> - }
> - }
> - }
> - }
> + }
> + }
> + }
> + }
> }
>
> int cris_mmu_translate(struct cris_mmu_result *res,
> CPUCRISState *env, uint32_t vaddr,
> int rw, int mmu_idx, int debug)
> {
> - int seg;
> - int miss = 0;
> - int is_user = mmu_idx == MMU_USER_IDX;
> - uint32_t old_srs;
> + int seg;
> + int miss = 0;
> + int is_user = mmu_idx == MMU_USER_IDX;
> + uint32_t old_srs;
>
> - old_srs= env->pregs[PR_SRS];
> + old_srs = env->pregs[PR_SRS];
>
> - /* rw == 2 means exec, map the access to the insn mmu. */
> - env->pregs[PR_SRS] = rw == 2 ? 1 : 2;
> + /* rw == 2 means exec, map the access to the insn mmu. */
> + env->pregs[PR_SRS] = rw == 2 ? 1 : 2;
>
> - if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) {
> - res->phy = vaddr;
> - res->prot = PAGE_BITS;
> - goto done;
> - }
> + if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) {
> + res->phy = vaddr;
> + res->prot = PAGE_BITS;
> + goto done;
> + }
>
> - seg = vaddr >> 28;
> - if (!is_user && cris_mmu_segmented_addr(seg, env->sregs[SFR_RW_MM_CFG]))
> - {
> - uint32_t base;
> + seg = vaddr >> 28;
> + if (!is_user && cris_mmu_segmented_addr(seg, env->sregs[SFR_RW_MM_CFG])) {
> + uint32_t base;
>
> - miss = 0;
> - base = cris_mmu_translate_seg(env, seg);
> - res->phy = base | (0x0fffffff & vaddr);
> - res->prot = PAGE_BITS;
> - } else {
> - miss = cris_mmu_translate_page(res, env, vaddr, rw,
> - is_user, debug);
> - }
> - done:
> - env->pregs[PR_SRS] = old_srs;
> - return miss;
> + miss = 0;
> + base = cris_mmu_translate_seg(env, seg);
> + res->phy = base | (0x0fffffff & vaddr);
> + res->prot = PAGE_BITS;
> + } else {
> + miss = cris_mmu_translate_page(res, env, vaddr, rw,
> + is_user, debug);
> + }
> + done:
> + env->pregs[PR_SRS] = old_srs;
> + return miss;
> }
>
© 2016 - 2026 Red Hat, Inc.