linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [powerpc v4 0/3] Enable IAMR storage keys for radix
@ 2016-11-14  5:25 Balbir Singh
  2016-11-14  5:25 ` [powerpc v4 1/3] Setup AMOR in HV mode Balbir Singh
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Balbir Singh @ 2016-11-14  5:25 UTC (permalink / raw)
  To: linuxppc-dev
  Cc: mpe, Balbir Singh, Chris Smart, Benjamin Herrenschmidt,
	Michael Neuling, Aneesh Kumar K.V, Paul Mackerras

The first patch sets up AMOR in hypervisor mode. AMOR
needs to be setup before IAMR (details of AMOR/IAMR in
each patch). The second patch enables detection of exceptions
generated due to instruction fetch violations caused
and OOPSs' the task. The third patch enables IAMR for
both hypervisor and guest kernels.

I've tested with patch series with a sample hack and
payload.

Chris Smart helped with the series, reviewing and
providing valuable feedback

Cc: Chris Smart <chris@distroguy.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Michael Neuling <mikey@neuling.org>
Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Cc: Paul Mackerras <paulus@samba.org>

Changelog
  Enable both primary and secondary MMU's (BUG FIX)
  Make the check for instruction violations common (SRR1_ISI_N_OR_G)

Balbir Singh (3):
  Setup AMOR in HV mode
  Detect instruction fetch denied and report
  Enable storage keys for radix - user mode execution

 arch/powerpc/mm/fault.c         |  4 ++++
 arch/powerpc/mm/pgtable-radix.c | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

-- 
2.5.5

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [powerpc v4 1/3] Setup AMOR in HV mode
  2016-11-14  5:25 [powerpc v4 0/3] Enable IAMR storage keys for radix Balbir Singh
@ 2016-11-14  5:25 ` Balbir Singh
  2016-11-14 11:09   ` kbuild test robot
  2016-11-15  2:30   ` Michael Ellerman
  2016-11-14  5:25 ` [powerpc v4 2/3] Detect instruction fetch denied and report Balbir Singh
  2016-11-14  5:25 ` [powerpc v4 3/3] Enable storage keys for radix - user mode execution Balbir Singh
  2 siblings, 2 replies; 7+ messages in thread
From: Balbir Singh @ 2016-11-14  5:25 UTC (permalink / raw)
  To: linuxppc-dev

AMOR should be setup in HV mode, we set it up once
and let the generic kernel handle IAMR. This patch is
used to enable storage keys in a following patch as
defined in ISA 3

Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
---
 arch/powerpc/mm/pgtable-radix.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
index ed7bddc..7343573 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -320,6 +320,25 @@ static void update_hid_for_radix(void)
 		cpu_relax();
 }
 
+/*
+ * In HV mode, we init AMOR so that the hypervisor
+ * and guest can setup IMAR, enable key 0 and set
+ * it to 1
+ * AMOR = 1100....00 (Mask for key 0 is 11)
+ */
+static void __init radix_init_amor(void)
+{
+	unsigned long amor_mask = 0xc000000000000000;
+	unsigned long amor = mfspr(SPRN_AMOR);
+
+	if (cpu_has_feature(CPU_FTR_POWER9_DD1))
+		return;
+
+	amor = amor_mask;
+
+	mtspr(SPRN_AMOR, amor);
+}
+
 void __init radix__early_init_mmu(void)
 {
 	unsigned long lpcr;
@@ -376,6 +395,7 @@ void __init radix__early_init_mmu(void)
 		lpcr = mfspr(SPRN_LPCR);
 		mtspr(SPRN_LPCR, lpcr | LPCR_UPRT | LPCR_HR);
 		radix_init_partition_table();
+		radix_init_amor();
 	}
 
 	radix_init_pgtable();
@@ -393,6 +413,7 @@ void radix__early_init_mmu_secondary(void)
 
 		mtspr(SPRN_PTCR,
 		      __pa(partition_tb) | (PATB_SIZE_SHIFT - 12));
+		radix_init_amor();
 	}
 }
 
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [powerpc v4 2/3] Detect instruction fetch denied and report
  2016-11-14  5:25 [powerpc v4 0/3] Enable IAMR storage keys for radix Balbir Singh
  2016-11-14  5:25 ` [powerpc v4 1/3] Setup AMOR in HV mode Balbir Singh
@ 2016-11-14  5:25 ` Balbir Singh
  2016-11-14  5:25 ` [powerpc v4 3/3] Enable storage keys for radix - user mode execution Balbir Singh
  2 siblings, 0 replies; 7+ messages in thread
From: Balbir Singh @ 2016-11-14  5:25 UTC (permalink / raw)
  To: linuxppc-dev

ISA 3 allows for prevention of instruction fetch and execution
of user mode pages. If such an error occurs, SRR1 bit 35
reports the error. We catch and report the error in do_page_fault()

Signed-off-by: Balbir Singh <bsingharora@gmail.com>
---
 arch/powerpc/mm/fault.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index d0b137d..1e7ff7b 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -404,6 +404,10 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
 		    (cpu_has_feature(CPU_FTR_NOEXECUTE) ||
 		     !(vma->vm_flags & (VM_READ | VM_WRITE))))
 			goto bad_area;
+
+		if (regs->msr & SRR1_ISI_N_OR_G)
+			goto bad_area;
+
 #ifdef CONFIG_PPC_STD_MMU
 		/*
 		 * protfault should only happen due to us
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [powerpc v4 3/3] Enable storage keys for radix - user mode execution
  2016-11-14  5:25 [powerpc v4 0/3] Enable IAMR storage keys for radix Balbir Singh
  2016-11-14  5:25 ` [powerpc v4 1/3] Setup AMOR in HV mode Balbir Singh
  2016-11-14  5:25 ` [powerpc v4 2/3] Detect instruction fetch denied and report Balbir Singh
@ 2016-11-14  5:25 ` Balbir Singh
  2016-11-14 13:43   ` kbuild test robot
  2 siblings, 1 reply; 7+ messages in thread
From: Balbir Singh @ 2016-11-14  5:25 UTC (permalink / raw)
  To: linuxppc-dev

ISA 3 defines new encoded access authority that allows instruction
access prevention in privileged mode and allows normal access
to problem state. This patch just enables IAMR (Instruction Authority
Mask Register), enabling AMR would require more work.

I've tested this with a buggy driver and a simple payload. The payload
is specific to the build I've tested.

Signed-off-by: Balbir Singh <bsingharora@gmail.com>
---
 arch/powerpc/mm/pgtable-radix.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
index 7343573..5c90bcd 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -339,6 +339,24 @@ static void __init radix_init_amor(void)
 	mtspr(SPRN_AMOR, amor);
 }
 
+/*
+ * For radix page tables we setup, the IAMR values as follows
+ * IMAR = 0100...00 (key 0 is set to 1)
+ * AMR, UAMR, UAMOR are not affected
+ */
+static void __init radix_init_iamr(void)
+{
+	unsigned long iamr_mask = 0x4000000000000000;
+	unsigned long iamr = mfspr(SPRN_IAMR);
+
+	if (cpu_has_feature(CPU_FTR_POWER9_DD1))
+		return;
+
+	iamr = iamr_mask;
+
+	mtspr(SPRN_IAMR, iamr);
+}
+
 void __init radix__early_init_mmu(void)
 {
 	unsigned long lpcr;
@@ -398,6 +416,7 @@ void __init radix__early_init_mmu(void)
 		radix_init_amor();
 	}
 
+	radix_init_iamr();
 	radix_init_pgtable();
 }
 
@@ -415,6 +434,7 @@ void radix__early_init_mmu_secondary(void)
 		      __pa(partition_tb) | (PATB_SIZE_SHIFT - 12));
 		radix_init_amor();
 	}
+	radix_init_iamr();
 }
 
 void radix__mmu_cleanup_all(void)
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [powerpc v4 1/3] Setup AMOR in HV mode
  2016-11-14  5:25 ` [powerpc v4 1/3] Setup AMOR in HV mode Balbir Singh
@ 2016-11-14 11:09   ` kbuild test robot
  2016-11-15  2:30   ` Michael Ellerman
  1 sibling, 0 replies; 7+ messages in thread
From: kbuild test robot @ 2016-11-14 11:09 UTC (permalink / raw)
  To: Balbir Singh; +Cc: kbuild-all, linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 1246 bytes --]

Hi Balbir,

[auto build test WARNING on powerpc/master]

url:    https://github.com/0day-ci/linux/commits/Balbir-Singh/Enable-IAMR-storage-keys-for-radix/20161114-133434
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git master
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All warnings (new ones prefixed by >>):

>> WARNING: arch/powerpc/mm/built-in.o(.text+0xadac): Section mismatch in reference from the function .radix__early_init_mmu_secondary() to the function .init.text:.radix_init_amor()
   The function .radix__early_init_mmu_secondary() references
   the function __init .radix_init_amor().
   This is often because .radix__early_init_mmu_secondary lacks a __init
   annotation or the annotation of .radix_init_amor is wrong.

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 50923 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [powerpc v4 3/3] Enable storage keys for radix - user mode execution
  2016-11-14  5:25 ` [powerpc v4 3/3] Enable storage keys for radix - user mode execution Balbir Singh
@ 2016-11-14 13:43   ` kbuild test robot
  0 siblings, 0 replies; 7+ messages in thread
From: kbuild test robot @ 2016-11-14 13:43 UTC (permalink / raw)
  To: Balbir Singh; +Cc: kbuild-all, linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 1230 bytes --]

Hi Balbir,

[auto build test WARNING on powerpc/master]

url:    https://github.com/0day-ci/linux/commits/Balbir-Singh/Enable-IAMR-storage-keys-for-radix/20161114-133434
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git master
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All warnings (new ones prefixed by >>):

>> WARNING: vmlinux.o(.text+0x645f0): Section mismatch in reference from the function .radix__early_init_mmu_secondary() to the function .init.text:.radix_init_iamr()
   The function .radix__early_init_mmu_secondary() references
   the function __init .radix_init_iamr().
   This is often because .radix__early_init_mmu_secondary lacks a __init
   annotation or the annotation of .radix_init_iamr is wrong.

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 50923 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [powerpc v4 1/3] Setup AMOR in HV mode
  2016-11-14  5:25 ` [powerpc v4 1/3] Setup AMOR in HV mode Balbir Singh
  2016-11-14 11:09   ` kbuild test robot
@ 2016-11-15  2:30   ` Michael Ellerman
  1 sibling, 0 replies; 7+ messages in thread
From: Michael Ellerman @ 2016-11-15  2:30 UTC (permalink / raw)
  To: Balbir Singh, linuxppc-dev

Balbir Singh <bsingharora@gmail.com> writes:

> diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
> index ed7bddc..7343573 100644
> --- a/arch/powerpc/mm/pgtable-radix.c
> +++ b/arch/powerpc/mm/pgtable-radix.c
> @@ -320,6 +320,25 @@ static void update_hid_for_radix(void)
>  		cpu_relax();
>  }
>  
> +/*
> + * In HV mode, we init AMOR so that the hypervisor
> + * and guest can setup IMAR, enable key 0 and set
> + * it to 1
> + * AMOR = 1100....00 (Mask for key 0 is 11)
> + */
> +static void __init radix_init_amor(void)

This can't be __init because you call it from the secondary version,
which can run after init due to CPU hotplug.

> +{
> +	unsigned long amor_mask = 0xc000000000000000;
> +	unsigned long amor = mfspr(SPRN_AMOR);

You don't use the amor value.

> +	if (cpu_has_feature(CPU_FTR_POWER9_DD1))
> +		return;

This needs a comment explaining why we're not doing it on DD1.

> +
> +	amor = amor_mask;
> +
> +	mtspr(SPRN_AMOR, amor);

Just move the constant directly.



cheers

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-11-15  2:30 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-14  5:25 [powerpc v4 0/3] Enable IAMR storage keys for radix Balbir Singh
2016-11-14  5:25 ` [powerpc v4 1/3] Setup AMOR in HV mode Balbir Singh
2016-11-14 11:09   ` kbuild test robot
2016-11-15  2:30   ` Michael Ellerman
2016-11-14  5:25 ` [powerpc v4 2/3] Detect instruction fetch denied and report Balbir Singh
2016-11-14  5:25 ` [powerpc v4 3/3] Enable storage keys for radix - user mode execution Balbir Singh
2016-11-14 13:43   ` kbuild test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).