Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0127262c authored by Mihai Caraman's avatar Mihai Caraman Committed by Benjamin Herrenschmidt
Browse files

powerpc: Restore VDSO information on critical exception om BookE



Critical exception on 64-bit booke uses user-visible SPRG3 as scratch.
Restore VDSO information in SPRG3 on exception prolog.

Use a common sprg3 field in PACA for all powerpc64 architectures.

Signed-off-by: default avatarMihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 8b64a9df
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -74,7 +74,6 @@ struct kvmppc_host_state {
	ulong vmhandler;
	ulong scratch0;
	ulong scratch1;
	ulong sprg3;
	u8 in_guest;
	u8 restore_hid5;
	u8 napping;
+1 −0
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ struct paca_struct {
	u8 io_sync;			/* writel() needs spin_unlock sync */
	u8 irq_work_pending;		/* IRQ_WORK interrupt while soft-disable */
	u8 nap_state_lost;		/* NV GPR values lost in power7_idle */
	u64 sprg3;			/* Saved user-visible sprg */

#ifdef CONFIG_PPC_POWERNV
	/* Pointer to OPAL machine check event structure set by the
+1 −1
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@ int main(void)
	DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
	DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save));
	DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost));
	DEFINE(PACA_SPRG3, offsetof(struct paca_struct, sprg3));
#endif /* CONFIG_PPC64 */

	/* RTAS */
@@ -533,7 +534,6 @@ int main(void)
	HSTATE_FIELD(HSTATE_VMHANDLER, vmhandler);
	HSTATE_FIELD(HSTATE_SCRATCH0, scratch0);
	HSTATE_FIELD(HSTATE_SCRATCH1, scratch1);
	HSTATE_FIELD(HSTATE_SPRG3, sprg3);
	HSTATE_FIELD(HSTATE_IN_GUEST, in_guest);
	HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5);
	HSTATE_FIELD(HSTATE_NAPPING, napping);
+3 −1
Original line number Diff line number Diff line
@@ -110,7 +110,9 @@

#define PROLOG_STORE_RESTORE_SCRATCH_CRIT				    \
	mfspr	r10,SPRN_SPRG_CRIT_SCRATCH;	/* get r13 */		    \
	std	r10,PACA_EXCRIT+EX_R13(r13)
	std	r10,PACA_EXCRIT+EX_R13(r13);				    \
	ld	r11,PACA_SPRG3(r13);					    \
	mtspr	SPRN_SPRG_CRIT_SCRATCH,r11;

/* Variants of the "addition" argument for the prolog
 */
+1 −3
Original line number Diff line number Diff line
@@ -723,9 +723,7 @@ int __cpuinit vdso_getcpu_init(void)

	val = (cpu & 0xfff) | ((node & 0xffff) << 16);
	mtspr(SPRN_SPRG3, val);
#ifdef CONFIG_KVM_BOOK3S_HANDLER
	get_paca()->kvm_hstate.sprg3 = val;
#endif
	get_paca()->sprg3 = val;

	put_cpu();

Loading