Thread (30 messages) 30 messages, 6 authors, 2019-02-04

Re: Getting weird TPM error after rebasing my tree to security/next-general

From: Jarkko Sakkinen <hidden>
Date: 2019-01-31 16:04:46
Also in: linux-integrity, lkml

On Thu, Jan 31, 2019 at 02:26:06PM +0200, Jarkko Sakkinen wrote:
On Tue, Jan 29, 2019 at 03:20:16PM +0200, Jarkko Sakkinen wrote:
quoted
On Thu, Jan 24, 2019 at 07:43:30AM +1300, Linus Torvalds wrote:
quoted
On Thu, Jan 24, 2019 at 4:36 AM Jarkko Sakkinen
[off-list ref] wrote:
quoted
quoted
Is it just that this particular hardware always happened to trigger
the ERMS case (ie "rep movsb")?
This is the particular snippet in question:

memcpy_fromio(buf, priv->rsp, 6);
expected = be32_to_cpup((__be32 *) &buf[2]);
if (expected > count || expected < 6)
        return -EIO;
Ok, strange.

So what *used* to happen is that the memcpy_fromio() would just expand
as a "memcpy()", and in this case, gcc would then inline the memcpy().
In fact, gcc does it as a 4-byte access and a two-byte access from
what I can tell.
I verified, and it is exactly as you stated:

   0xffffffff814aaa33 <+51>:	mov    (%rax),%edx
   0xffffffff814aaa35 <+53>:	mov    %edx,0x0(%rbp)
   0xffffffff814aaa38 <+56>:	movzwl 0x4(%rax),%eax
   0xffffffff814aaa3c <+60>:	mov    %ax,0x4(%rbp)

And your new version does exactly the same thing to the first six bytes
(with different opcode, but the same memory access pattern).
I think I have found the root cause:

memcpy_fromio(&__rsp_pa, &priv->regs_t->ctrl_rsp_pa, 8);

This is from crb_map_io(). This should be read as quad word.

I'll change it to ioread64() and see what happens. I don't know why it
even has used memcpy_fromio() in the first place. I guess, when I first
implemented the driver, I used that for no logical reason, and it has
worked since up until now.
No, cannot be it. If you couldn't read it in two dwords, then it would
have been always broken with 32-bit build.

Anyway, just in case, I will check what address it prints out.

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