[PATCH 16/23] Make head_64.S aware of KVM real mode code

2009-07-16 Thread Alexander Graf
We need to run some KVM trampoline code in real mode. Unfortunately, real mode
only covers 8MB on Cell so we need to squeeze ourselves as low as possible.

Also, we need to trap interrupts to get us back from guest state to host state
without telling Linux about it.

This patch adds interrupt traps and includes the KVM code that requires real
mode in the real mode parts of Linux.

Signed-off-by: Alexander Graf 
---
 arch/powerpc/include/asm/exception.h |2 ++
 arch/powerpc/kernel/exceptions-64s.S |8 
 arch/powerpc/kernel/head_64.S|6 ++
 3 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/include/asm/exception.h 
b/arch/powerpc/include/asm/exception.h
index d3d4534..54dc66f 100644
--- a/arch/powerpc/include/asm/exception.h
+++ b/arch/powerpc/include/asm/exception.h
@@ -144,6 +144,7 @@
.globl label##_pSeries; \
 label##_pSeries:   \
HMT_MEDIUM; \
+   DO_KVM  n;  \
mtspr   SPRN_SPRG1,r13; /* save r13 */  \
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
 
@@ -167,6 +168,7 @@ label##_pSeries:\
.globl label##_pSeries; \
 label##_pSeries:   \
HMT_MEDIUM; \
+   DO_KVM  n;  \
mtspr   SPRN_SPRG1,r13; /* save r13 */  \
mfspr   r13,SPRN_SPRG3; /* get paca address into r13 */ \
std r9,PACA_EXGEN+EX_R9(r13);   /* save r9, r10 */  \
diff --git a/arch/powerpc/kernel/exceptions-64s.S 
b/arch/powerpc/kernel/exceptions-64s.S
index eb89811..d85f301 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -51,6 +51,7 @@ __start_interrupts:
. = 0x200
 _machine_check_pSeries:
HMT_MEDIUM
+   DO_KVM  0x200
mtspr   SPRN_SPRG1,r13  /* save r13 */
EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
 
@@ -58,6 +59,7 @@ _machine_check_pSeries:
.globl data_access_pSeries
 data_access_pSeries:
HMT_MEDIUM
+   DO_KVM  0x300
mtspr   SPRN_SPRG1,r13
 BEGIN_FTR_SECTION
mtspr   SPRN_SPRG2,r12
@@ -77,6 +79,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
.globl data_access_slb_pSeries
 data_access_slb_pSeries:
HMT_MEDIUM
+   DO_KVM  0x380
mtspr   SPRN_SPRG1,r13
mfspr   r13,SPRN_SPRG3  /* get paca address into r13 */
std r3,PACA_EXSLB+EX_R3(r13)
@@ -115,6 +118,7 @@ data_access_slb_pSeries:
.globl instruction_access_slb_pSeries
 instruction_access_slb_pSeries:
HMT_MEDIUM
+   DO_KVM  0x480
mtspr   SPRN_SPRG1,r13
mfspr   r13,SPRN_SPRG3  /* get paca address into r13 */
std r3,PACA_EXSLB+EX_R3(r13)
@@ -154,6 +158,7 @@ instruction_access_slb_pSeries:
.globl  system_call_pSeries
 system_call_pSeries:
HMT_MEDIUM
+   DO_KVM  0xc00
 BEGIN_FTR_SECTION
cmpdi   r0,0x1ebe
beq-1f
@@ -186,12 +191,15 @@ END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
 * trickery is thus necessary
 */
. = 0xf00
+   DO_KVM  0xf00
b   performance_monitor_pSeries
 
. = 0xf20
+   DO_KVM  0xf20
b   altivec_unavailable_pSeries
 
. = 0xf40
+   DO_KVM  0xf40
b   vsx_unavailable_pSeries
 
 #ifdef CONFIG_CBE_RAS
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 012505e..e409418 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -38,6 +38,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /* The physical memory is layed out such that the secondary processor
  * spin code sits at 0x...0x00ff. On server, the vectors follow
@@ -164,6 +165,11 @@ exception_marker:
 #include "exceptions-64s.S"
 #endif
 
+/* KVM trampoline code needs to be close to the interrupt handlers */
+
+#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
+#include "../kvm/book3s_64_rmhandlers.S"
+#endif
 
 /*
  * On pSeries and most other platforms, secondary processors spin
-- 
1.6.0.2

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 16/23] Make head_64.S aware of KVM real mode code

2009-07-07 Thread Alexander Graf
We need to run some KVM trampoline code in real mode. Unfortunately, real mode
only covers 8MB on Cell so we need to squeeze ourselves as low as possible.

Also, we need to trap interrupts to get us back from guest state to host state
without telling Linux about it.

This patch adds interrupt traps and includes the KVM code that requires real
mode in the real mode parts of Linux.

Signed-off-by: Alexander Graf 
---
 arch/powerpc/include/asm/exception.h |2 ++
 arch/powerpc/kernel/exceptions-64s.S |8 
 arch/powerpc/kernel/head_64.S|6 ++
 3 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/include/asm/exception.h 
b/arch/powerpc/include/asm/exception.h
index d3d4534..54dc66f 100644
--- a/arch/powerpc/include/asm/exception.h
+++ b/arch/powerpc/include/asm/exception.h
@@ -144,6 +144,7 @@
.globl label##_pSeries; \
 label##_pSeries:   \
HMT_MEDIUM; \
+   DO_KVM  n;  \
mtspr   SPRN_SPRG1,r13; /* save r13 */  \
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
 
@@ -167,6 +168,7 @@ label##_pSeries:\
.globl label##_pSeries; \
 label##_pSeries:   \
HMT_MEDIUM; \
+   DO_KVM  n;  \
mtspr   SPRN_SPRG1,r13; /* save r13 */  \
mfspr   r13,SPRN_SPRG3; /* get paca address into r13 */ \
std r9,PACA_EXGEN+EX_R9(r13);   /* save r9, r10 */  \
diff --git a/arch/powerpc/kernel/exceptions-64s.S 
b/arch/powerpc/kernel/exceptions-64s.S
index eb89811..d85f301 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -51,6 +51,7 @@ __start_interrupts:
. = 0x200
 _machine_check_pSeries:
HMT_MEDIUM
+   DO_KVM  0x200
mtspr   SPRN_SPRG1,r13  /* save r13 */
EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
 
@@ -58,6 +59,7 @@ _machine_check_pSeries:
.globl data_access_pSeries
 data_access_pSeries:
HMT_MEDIUM
+   DO_KVM  0x300
mtspr   SPRN_SPRG1,r13
 BEGIN_FTR_SECTION
mtspr   SPRN_SPRG2,r12
@@ -77,6 +79,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
.globl data_access_slb_pSeries
 data_access_slb_pSeries:
HMT_MEDIUM
+   DO_KVM  0x380
mtspr   SPRN_SPRG1,r13
mfspr   r13,SPRN_SPRG3  /* get paca address into r13 */
std r3,PACA_EXSLB+EX_R3(r13)
@@ -115,6 +118,7 @@ data_access_slb_pSeries:
.globl instruction_access_slb_pSeries
 instruction_access_slb_pSeries:
HMT_MEDIUM
+   DO_KVM  0x480
mtspr   SPRN_SPRG1,r13
mfspr   r13,SPRN_SPRG3  /* get paca address into r13 */
std r3,PACA_EXSLB+EX_R3(r13)
@@ -154,6 +158,7 @@ instruction_access_slb_pSeries:
.globl  system_call_pSeries
 system_call_pSeries:
HMT_MEDIUM
+   DO_KVM  0xc00
 BEGIN_FTR_SECTION
cmpdi   r0,0x1ebe
beq-1f
@@ -186,12 +191,15 @@ END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
 * trickery is thus necessary
 */
. = 0xf00
+   DO_KVM  0xf00
b   performance_monitor_pSeries
 
. = 0xf20
+   DO_KVM  0xf20
b   altivec_unavailable_pSeries
 
. = 0xf40
+   DO_KVM  0xf40
b   vsx_unavailable_pSeries
 
 #ifdef CONFIG_CBE_RAS
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 012505e..9675ab7 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -38,6 +38,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /* The physical memory is layed out such that the secondary processor
  * spin code sits at 0x...0x00ff. On server, the vectors follow
@@ -164,6 +165,11 @@ exception_marker:
 #include "exceptions-64s.S"
 #endif
 
+/* KVM trampoline code needs to be close to the interrupt handlers */
+
+#ifdef CONFIG_KVM_970_HANDLER
+#include "../kvm/970_rmhandlers.S"
+#endif
 
 /*
  * On pSeries and most other platforms, secondary processors spin
-- 
1.6.0.2

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html