All of lore.kernel.org
 help / color / mirror / Atom feed
* [powerpc v5 0/3] Enable IAMR storage keys for radix
@ 2016-11-14 12:16 Balbir Singh
  2016-11-14 12:16 ` [powerpc v5 1/3] Setup AMOR in HV mode Balbir Singh
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Balbir Singh @ 2016-11-14 12:16 UTC (permalink / raw)
  To: linuxppc-dev, mpe; +Cc: aneesh.kumar, Balbir Singh

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

Changelog
  Remove __init annotation for iamr and amor init

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] 6+ messages in thread

* [powerpc v5 1/3] Setup AMOR in HV mode
  2016-11-14 12:16 [powerpc v5 0/3] Enable IAMR storage keys for radix Balbir Singh
@ 2016-11-14 12:16 ` Balbir Singh
  2016-11-14 12:16 ` [powerpc v5 2/3] Detect instruction fetch denied and report Balbir Singh
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Balbir Singh @ 2016-11-14 12:16 UTC (permalink / raw)
  To: linuxppc-dev, mpe; +Cc: aneesh.kumar, Balbir Singh

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..7c21a52 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 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] 6+ messages in thread

* [powerpc v5 2/3] Detect instruction fetch denied and report
  2016-11-14 12:16 [powerpc v5 0/3] Enable IAMR storage keys for radix Balbir Singh
  2016-11-14 12:16 ` [powerpc v5 1/3] Setup AMOR in HV mode Balbir Singh
@ 2016-11-14 12:16 ` Balbir Singh
  2016-11-15  2:39   ` Michael Ellerman
  2016-11-14 12:16 ` [powerpc v5 3/3] Enable storage keys for radix - user mode execution Balbir Singh
  2016-11-15  2:40 ` [powerpc v5 0/3] Enable IAMR storage keys for radix Michael Ellerman
  3 siblings, 1 reply; 6+ messages in thread
From: Balbir Singh @ 2016-11-14 12:16 UTC (permalink / raw)
  To: linuxppc-dev, mpe; +Cc: aneesh.kumar, Balbir Singh

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] 6+ messages in thread

* [powerpc v5 3/3] Enable storage keys for radix - user mode execution
  2016-11-14 12:16 [powerpc v5 0/3] Enable IAMR storage keys for radix Balbir Singh
  2016-11-14 12:16 ` [powerpc v5 1/3] Setup AMOR in HV mode Balbir Singh
  2016-11-14 12:16 ` [powerpc v5 2/3] Detect instruction fetch denied and report Balbir Singh
@ 2016-11-14 12:16 ` Balbir Singh
  2016-11-15  2:40 ` [powerpc v5 0/3] Enable IAMR storage keys for radix Michael Ellerman
  3 siblings, 0 replies; 6+ messages in thread
From: Balbir Singh @ 2016-11-14 12:16 UTC (permalink / raw)
  To: linuxppc-dev, mpe; +Cc: aneesh.kumar, Balbir Singh

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 7c21a52..ae0d701 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -339,6 +339,24 @@ static void 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 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] 6+ messages in thread

* Re: [powerpc v5 2/3] Detect instruction fetch denied and report
  2016-11-14 12:16 ` [powerpc v5 2/3] Detect instruction fetch denied and report Balbir Singh
@ 2016-11-15  2:39   ` Michael Ellerman
  0 siblings, 0 replies; 6+ messages in thread
From: Michael Ellerman @ 2016-11-15  2:39 UTC (permalink / raw)
  To: Balbir Singh, linuxppc-dev; +Cc: aneesh.kumar, Balbir Singh

Balbir Singh <bsingharora@gmail.com> writes:

> 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;

Can you move that check above the more complicated check. It shouldn't
change anything in practice, but makes it easier to follow the code
because the easy cases can be discarded.

cheers

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

* Re: [powerpc v5 0/3] Enable IAMR storage keys for radix
  2016-11-14 12:16 [powerpc v5 0/3] Enable IAMR storage keys for radix Balbir Singh
                   ` (2 preceding siblings ...)
  2016-11-14 12:16 ` [powerpc v5 3/3] Enable storage keys for radix - user mode execution Balbir Singh
@ 2016-11-15  2:40 ` Michael Ellerman
  3 siblings, 0 replies; 6+ messages in thread
From: Michael Ellerman @ 2016-11-15  2:40 UTC (permalink / raw)
  To: Balbir Singh, linuxppc-dev; +Cc: aneesh.kumar, Balbir Singh

Balbir Singh <bsingharora@gmail.com> writes:

> 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
>
> Changelog
>   Remove __init annotation for iamr and amor init
>
> Balbir Singh (3):
>   Setup AMOR in HV mode
>   Enable storage keys for radix - user mode execution

These should be "powerpc/mm/radix: ...".

>   Detect instruction fetch denied and report

And that should be "powerpc/mm: ..."

cheers

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

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

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-14 12:16 [powerpc v5 0/3] Enable IAMR storage keys for radix Balbir Singh
2016-11-14 12:16 ` [powerpc v5 1/3] Setup AMOR in HV mode Balbir Singh
2016-11-14 12:16 ` [powerpc v5 2/3] Detect instruction fetch denied and report Balbir Singh
2016-11-15  2:39   ` Michael Ellerman
2016-11-14 12:16 ` [powerpc v5 3/3] Enable storage keys for radix - user mode execution Balbir Singh
2016-11-15  2:40 ` [powerpc v5 0/3] Enable IAMR storage keys for radix Michael Ellerman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.