Message ID | 20200330094946.24678-7-clg@kaod.org |
---|---|
State | New |
Headers | show |
Series | target/ppc: Add support for Radix partition-scoped translation | expand |
On Mon, 30 Mar 2020 11:49:45 +0200 Cédric Le Goater <clg@kaod.org> wrote: > This prepares ground for partition-scoped Radix translation. > > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> > Signed-off-by: Cédric Le Goater <clg@kaod.org> > --- > target/ppc/mmu-radix64.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c > index 136498111f60..3ae29ed90d49 100644 > --- a/target/ppc/mmu-radix64.c > +++ b/target/ppc/mmu-radix64.c > @@ -105,7 +105,8 @@ static void ppc_radix64_raise_si(PowerPCCPU *cpu, int rwx, vaddr eaddr, > > > static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, > - int *fault_cause, int *prot) > + int *fault_cause, int *prot, > + bool partition_scoped) > { > CPUPPCState *env = &cpu->env; > const int need_prot[] = { PAGE_READ, PAGE_WRITE, PAGE_EXEC }; > @@ -121,11 +122,11 @@ static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, > } > > /* Determine permissions allowed by Encoded Access Authority */ > - if ((pte & R_PTE_EAA_PRIV) && msr_pr) { /* Insufficient Privilege */ > + if (!partition_scoped && (pte & R_PTE_EAA_PRIV) && msr_pr) { > *prot = 0; > - } else if (msr_pr || (pte & R_PTE_EAA_PRIV)) { > + } else if (msr_pr || (pte & R_PTE_EAA_PRIV) || partition_scoped) { > *prot = ppc_radix64_get_prot_eaa(pte); > - } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) */ > + } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) && !partition_scoped */ > *prot = ppc_radix64_get_prot_eaa(pte); > *prot &= ppc_radix64_get_prot_amr(cpu); /* Least combined permissions */ > } > @@ -266,7 +267,7 @@ static int ppc_radix64_process_scoped_xlate(PowerPCCPU *cpu, int rwx, > g_raddr, g_page_size, &fault_cause, &pte_addr); > > if (!(pte & R_PTE_VALID) || > - ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot)) { > + ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot, 0)) { Maybe pass false since ppc_radix64_check_prot() expects a bool ? Apart from that, Reviewed-by: Greg Kurz <groug@kaod.org> > /* No valid pte or access denied due to protection */ > if (cause_excp) { > ppc_radix64_raise_si(cpu, rwx, eaddr, fault_cause);
On Mon, 30 Mar 2020 11:49:45 +0200 Cédric Le Goater <clg@kaod.org> wrote: > This prepares ground for partition-scoped Radix translation. > > Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> > Signed-off-by: Cédric Le Goater <clg@kaod.org> > --- > target/ppc/mmu-radix64.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c > index 136498111f60..3ae29ed90d49 100644 > --- a/target/ppc/mmu-radix64.c > +++ b/target/ppc/mmu-radix64.c > @@ -105,7 +105,8 @@ static void ppc_radix64_raise_si(PowerPCCPU *cpu, int rwx, vaddr eaddr, > > > static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, > - int *fault_cause, int *prot) > + int *fault_cause, int *prot, > + bool partition_scoped) > { > CPUPPCState *env = &cpu->env; > const int need_prot[] = { PAGE_READ, PAGE_WRITE, PAGE_EXEC }; > @@ -121,11 +122,11 @@ static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, > } > > /* Determine permissions allowed by Encoded Access Authority */ > - if ((pte & R_PTE_EAA_PRIV) && msr_pr) { /* Insufficient Privilege */ > + if (!partition_scoped && (pte & R_PTE_EAA_PRIV) && msr_pr) { > *prot = 0; > - } else if (msr_pr || (pte & R_PTE_EAA_PRIV)) { > + } else if (msr_pr || (pte & R_PTE_EAA_PRIV) || partition_scoped) { > *prot = ppc_radix64_get_prot_eaa(pte); > - } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) */ > + } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) && !partition_scoped */ > *prot = ppc_radix64_get_prot_eaa(pte); > *prot &= ppc_radix64_get_prot_amr(cpu); /* Least combined permissions */ > } > @@ -266,7 +267,7 @@ static int ppc_radix64_process_scoped_xlate(PowerPCCPU *cpu, int rwx, > g_raddr, g_page_size, &fault_cause, &pte_addr); > > if (!(pte & R_PTE_VALID) || > - ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot)) { > + ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot, 0)) { Maybe pass false instead of 0 ? Anyway, Reviewed-by: Greg Kurz <groug@kaod.org> > /* No valid pte or access denied due to protection */ > if (cause_excp) { > ppc_radix64_raise_si(cpu, rwx, eaddr, fault_cause);
On 3/30/20 7:01 PM, Greg Kurz wrote: > On Mon, 30 Mar 2020 11:49:45 +0200 > Cédric Le Goater <clg@kaod.org> wrote: > >> This prepares ground for partition-scoped Radix translation. >> >> Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> >> Signed-off-by: Cédric Le Goater <clg@kaod.org> >> --- >> target/ppc/mmu-radix64.c | 11 ++++++----- >> 1 file changed, 6 insertions(+), 5 deletions(-) >> >> diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c >> index 136498111f60..3ae29ed90d49 100644 >> --- a/target/ppc/mmu-radix64.c >> +++ b/target/ppc/mmu-radix64.c >> @@ -105,7 +105,8 @@ static void ppc_radix64_raise_si(PowerPCCPU *cpu, int rwx, vaddr eaddr, >> >> >> static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, >> - int *fault_cause, int *prot) >> + int *fault_cause, int *prot, >> + bool partition_scoped) >> { >> CPUPPCState *env = &cpu->env; >> const int need_prot[] = { PAGE_READ, PAGE_WRITE, PAGE_EXEC }; >> @@ -121,11 +122,11 @@ static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, >> } >> >> /* Determine permissions allowed by Encoded Access Authority */ >> - if ((pte & R_PTE_EAA_PRIV) && msr_pr) { /* Insufficient Privilege */ >> + if (!partition_scoped && (pte & R_PTE_EAA_PRIV) && msr_pr) { >> *prot = 0; >> - } else if (msr_pr || (pte & R_PTE_EAA_PRIV)) { >> + } else if (msr_pr || (pte & R_PTE_EAA_PRIV) || partition_scoped) { >> *prot = ppc_radix64_get_prot_eaa(pte); >> - } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) */ >> + } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) && !partition_scoped */ >> *prot = ppc_radix64_get_prot_eaa(pte); >> *prot &= ppc_radix64_get_prot_amr(cpu); /* Least combined permissions */ >> } >> @@ -266,7 +267,7 @@ static int ppc_radix64_process_scoped_xlate(PowerPCCPU *cpu, int rwx, >> g_raddr, g_page_size, &fault_cause, &pte_addr); >> >> if (!(pte & R_PTE_VALID) || >> - ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot)) { >> + ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot, 0)) { > > Maybe pass false since ppc_radix64_check_prot() expects a bool ? Sure, > Apart from that, > > Reviewed-by: Greg Kurz <groug@kaod.org> Thanks, C.
diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c index 136498111f60..3ae29ed90d49 100644 --- a/target/ppc/mmu-radix64.c +++ b/target/ppc/mmu-radix64.c @@ -105,7 +105,8 @@ static void ppc_radix64_raise_si(PowerPCCPU *cpu, int rwx, vaddr eaddr, static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, - int *fault_cause, int *prot) + int *fault_cause, int *prot, + bool partition_scoped) { CPUPPCState *env = &cpu->env; const int need_prot[] = { PAGE_READ, PAGE_WRITE, PAGE_EXEC }; @@ -121,11 +122,11 @@ static bool ppc_radix64_check_prot(PowerPCCPU *cpu, int rwx, uint64_t pte, } /* Determine permissions allowed by Encoded Access Authority */ - if ((pte & R_PTE_EAA_PRIV) && msr_pr) { /* Insufficient Privilege */ + if (!partition_scoped && (pte & R_PTE_EAA_PRIV) && msr_pr) { *prot = 0; - } else if (msr_pr || (pte & R_PTE_EAA_PRIV)) { + } else if (msr_pr || (pte & R_PTE_EAA_PRIV) || partition_scoped) { *prot = ppc_radix64_get_prot_eaa(pte); - } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) */ + } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) && !partition_scoped */ *prot = ppc_radix64_get_prot_eaa(pte); *prot &= ppc_radix64_get_prot_amr(cpu); /* Least combined permissions */ } @@ -266,7 +267,7 @@ static int ppc_radix64_process_scoped_xlate(PowerPCCPU *cpu, int rwx, g_raddr, g_page_size, &fault_cause, &pte_addr); if (!(pte & R_PTE_VALID) || - ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot)) { + ppc_radix64_check_prot(cpu, rwx, pte, &fault_cause, g_prot, 0)) { /* No valid pte or access denied due to protection */ if (cause_excp) { ppc_radix64_raise_si(cpu, rwx, eaddr, fault_cause);