Thread (25 messages) 25 messages, 4 authors, 2013-04-02

RE: [PATCH V4] powerpc/85xx: Add machine check handler to fix PCIe erratum on mpc85xx

From: Jia Hongtao-B38951 <hidden>
Date: 2013-03-12 07:40:51

-----Original Message-----
From: Wood Scott-B07421
Sent: Saturday, March 09, 2013 8:49 AM
To: Jia Hongtao-B38951
Cc: Wood Scott-B07421; David Laight; linuxppc-dev@lists.ozlabs.org;
Stuart Yoder
Subject: Re: [PATCH V4] powerpc/85xx: Add machine check handler to fix
PCIe erratum on mpc85xx
=20
On 03/08/2013 02:01:46 AM, Jia Hongtao-B38951 wrote:
quoted
quoted
-----Original Message-----
From: Wood Scott-B07421
Sent: Friday, March 08, 2013 12:38 AM
To: Jia Hongtao-B38951
Cc: David Laight; Wood Scott-B07421; linuxppc-dev@lists.ozlabs.org;
Stuart Yoder
Subject: Re: [PATCH V4] powerpc/85xx: Add machine check handler to
fix
quoted
PCIe erratum on mpc85xx

On 03/07/2013 02:06:05 AM, Jia Hongtao-B38951 wrote:
quoted
Here is the ideas from Scott:
"
quoted
+	if (is_in_pci_mem_space(addr)) {
+		inst =3D *(unsigned int *)regs->nip;
Be careful about taking a fault here.  A simple TLB miss should be
safe given that we shouldn't be accessing PCIe in the middle of
exception code, but what if the mapping has gone away (e.g. a
userspace driver had its code munmap()ed or swapped out)?  What if
permissions allow execute but not read (not sure if Linux will
allow
quoted
quoted
this, but the hardware does)?

What if it happened in a KVM guest?  You can't access guest
addresses
quoted
quoted
directly.
"
That means you need to be careful about how you read the
instruction, not
quoted
that you shouldn't do it at all.

-Scott
I agree.

Do you have a more secure way to get the instruction?
Or what should be done to avoid permission break issue?
=20
probe_kernel_address() should take care of userspace issues.  As for
KVM, if you see MSR_GS set, bail out and don't apply the workaround.
Let KVM/QEMU deal with it as it wishes (e.g. reflect to the guest and
let its machine check handler do the skipping).  On PR-mode KVM (e.g.
on e500v2-based chips) there is no MSR_GS and it just looks like
userspace code -- for now just pretend it is user mode.
=20
-Scott
Hi Scott,

Is that OK if I use the following code?

	u32 inst;
	int ret;

	if (is_in_pci_mem_space(addr)) {
		if (!user_mode(regs)) {
			ret =3D probe_kernel_address(regs->nip, inst);

			if (!ret) {
				rd =3D get_rt(inst);
				regs->gpr[rd] =3D 0xffffffff;
			}
		}

		regs->nip +=3D 4;
		return 1;
	}


Thanks.
-Hongtao.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help