All of lore.kernel.org
 help / color / mirror / Atom feed
* What is TYPE_TPM_TIS_ISA? (Not an ISA Device)
@ 2020-07-21 16:02 Philippe Mathieu-Daudé
  2020-07-21 16:38 ` Stefan Berger
  2020-07-21 16:40 ` Peter Maydell
  0 siblings, 2 replies; 6+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-07-21 16:02 UTC (permalink / raw)
  To: Stefan Berger, qemu-devel, Eric Auger
  Cc: Marc-André Lureau, David Safford

Hi Stefan,

I'm trying to understand what is modelling the
TYPE_TPM_TIS_ISA device.

It inherits from TYPE_ISA_DEVICE, so I expected
to see an ISA device, but then I noticed:

1/ it doesn't use the ISA I/O space, it directly
maps the device in the system memory at a fixed
address that is not addressable by the ISA bus:

#define TPM_TIS_ADDR_BASE           0xFED40000

2/ it is not plugged to an ISA BUS (ISABus*)

3/ no machine plug it using isa_register_ioport()
   (it is not registered to the ISA memory space)

4/ the only thing slightly related to ISA is it
checks the IRQ number is < ISA_NUM_IRQS


So it seems this is a plain SysBusDevice. But then
there is TYPE_TPM_TIS_SYSBUS... What is the difference?

Thanks,

Phil.



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

* Re: What is TYPE_TPM_TIS_ISA? (Not an ISA Device)
  2020-07-21 16:02 What is TYPE_TPM_TIS_ISA? (Not an ISA Device) Philippe Mathieu-Daudé
@ 2020-07-21 16:38 ` Stefan Berger
  2020-07-21 16:40 ` Peter Maydell
  1 sibling, 0 replies; 6+ messages in thread
From: Stefan Berger @ 2020-07-21 16:38 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel, Eric Auger
  Cc: Marc-André Lureau

On 7/21/20 12:02 PM, Philippe Mathieu-Daudé wrote:
> Hi Stefan,
>
> I'm trying to understand what is modelling the
> TYPE_TPM_TIS_ISA device.
>
> It inherits from TYPE_ISA_DEVICE, so I expected
> to see an ISA device, but then I noticed:
>
> 1/ it doesn't use the ISA I/O space, it directly
> maps the device in the system memory at a fixed
> address that is not addressable by the ISA bus:
>
> #define TPM_TIS_ADDR_BASE           0xFED40000
>
> 2/ it is not plugged to an ISA BUS (ISABus*)
>
> 3/ no machine plug it using isa_register_ioport()
>     (it is not registered to the ISA memory space)
>
> 4/ the only thing slightly related to ISA is it
> checks the IRQ number is < ISA_NUM_IRQS
>
>
> So it seems this is a plain SysBusDevice. But then
> there is TYPE_TPM_TIS_SYSBUS... What is the difference?

The TIS is modeled as an ISA device as an alternative to being connected 
to the LPC bus, to which it would typically be connected to. I believe 
we also have the ISA.TPM because of Windows only accepting it. Maybe 
this was not quite correct, but does it cause issues?

                 } else {
                     dev = aml_device("ISA.TPM");
                     aml_append(dev, aml_name_decl("_HID",
aml_eisaid("PNP0C31")));
                 }




>
> Thanks,
>
> Phil.
>



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

* Re: What is TYPE_TPM_TIS_ISA? (Not an ISA Device)
  2020-07-21 16:02 What is TYPE_TPM_TIS_ISA? (Not an ISA Device) Philippe Mathieu-Daudé
  2020-07-21 16:38 ` Stefan Berger
@ 2020-07-21 16:40 ` Peter Maydell
  2020-07-22  5:55   ` Markus Armbruster
  1 sibling, 1 reply; 6+ messages in thread
From: Peter Maydell @ 2020-07-21 16:40 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Eric Auger, David Safford, qemu-devel, Marc-André Lureau,
	Stefan Berger

On Tue, 21 Jul 2020 at 17:07, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>
> Hi Stefan,
>
> I'm trying to understand what is modelling the
> TYPE_TPM_TIS_ISA device.
>
> It inherits from TYPE_ISA_DEVICE, so I expected
> to see an ISA device, but then I noticed:
>
> 1/ it doesn't use the ISA I/O space, it directly
> maps the device in the system memory at a fixed
> address that is not addressable by the ISA bus:
>
> #define TPM_TIS_ADDR_BASE           0xFED40000

Why do you think this is mapping to the system memory?
tpm_tis_isa_realizefn() does:

    memory_region_add_subregion(isa_address_space(ISA_DEVICE(dev)),
                                TPM_TIS_ADDR_BASE, &s->mmio);

which puts it into the ISA memory address space.

The weird thing about this is not which AS it's
going in but the fact that the TPM_TIS_ADDR_BASE
is way higher than an actual ISA bus can address
(so for instance it's out of range of the size of
the ISA memory window on the Jazz board).

> 2/ it is not plugged to an ISA BUS (ISABus*)

Won't it autoplug into the ISA bus if you say "-device tpm-tis",
the same as any other ISA device ?

> 3/ no machine plug it using isa_register_ioport()
>    (it is not registered to the ISA memory space)

There's no requirement for an ISA device to have IO ports...

thanks
-- PMM


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

* Re: What is TYPE_TPM_TIS_ISA? (Not an ISA Device)
  2020-07-21 16:40 ` Peter Maydell
@ 2020-07-22  5:55   ` Markus Armbruster
  2020-07-22 22:07     ` Stefan Berger
  0 siblings, 1 reply; 6+ messages in thread
From: Markus Armbruster @ 2020-07-22  5:55 UTC (permalink / raw)
  To: Peter Maydell
  Cc: David Safford, qemu-devel, Eric Auger, Marc-André Lureau,
	Philippe Mathieu-Daudé,
	Stefan Berger

Peter Maydell <peter.maydell@linaro.org> writes:

> On Tue, 21 Jul 2020 at 17:07, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>
>> Hi Stefan,
>>
>> I'm trying to understand what is modelling the
>> TYPE_TPM_TIS_ISA device.
>>
>> It inherits from TYPE_ISA_DEVICE, so I expected
>> to see an ISA device, but then I noticed:
>>
>> 1/ it doesn't use the ISA I/O space, it directly
>> maps the device in the system memory at a fixed
>> address that is not addressable by the ISA bus:
>>
>> #define TPM_TIS_ADDR_BASE           0xFED40000
>
> Why do you think this is mapping to the system memory?
> tpm_tis_isa_realizefn() does:
>
>     memory_region_add_subregion(isa_address_space(ISA_DEVICE(dev)),
>                                 TPM_TIS_ADDR_BASE, &s->mmio);
>
> which puts it into the ISA memory address space.
>
> The weird thing about this is not which AS it's
> going in but the fact that the TPM_TIS_ADDR_BASE
> is way higher than an actual ISA bus can address
> (so for instance it's out of range of the size of
> the ISA memory window on the Jazz board).
>
>> 2/ it is not plugged to an ISA BUS (ISABus*)
>
> Won't it autoplug into the ISA bus if you say "-device tpm-tis",
> the same as any other ISA device ?

Yup:

    $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -chardev socket,id=chrtpm,path=tpm/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
    QEMU 5.0.90 monitor - type 'help' for more information
    (qemu) info qtree
    bus: main-system-bus
      type System
      [...]
      dev: i440FX-pcihost, id ""
        [...]
        bus: pci.0
          type PCI
            [...]
          dev: PIIX3, id ""
            [...]
            bus: isa.0
              type ISA
              dev: tpm-tis, id ""
                irq = 5 (0x5)
                tpmdev = "tpm0"
                ppi = true
                isa irq 5
              [...]

This is with

    $ swtpm socket --tpmstate dir=tpm --ctrl type=unixio,path=tpm/swtpm-soc

running in another terminal.

>> 3/ no machine plug it using isa_register_ioport()
>>    (it is not registered to the ISA memory space)
>
> There's no requirement for an ISA device to have IO ports...
>
> thanks
> -- PMM

Thread hijack!  Since I didn't have swtpm installed, I tried to take a
shortcut:

    $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -chardev null,id=tpm0 -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
    qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: tpm-emulator: tpm chardev 'chrtpm' not found.
    qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: tpm-emulator: Could not cleanly shutdown the TPM: No such file or directory
    QEMU 5.0.90 monitor - type 'help' for more information
    (qemu) qemu-system-x86_64: -device tpm-tis,tpmdev=tpm0: Property 'tpm-tis.tpmdev' can't find value 'tpm0'
    $ echo $?
    1

That a null chardev doesn't work is fine.  But the error handling looks
broken: QEMU diagnoses and reports the problem, then continues.  The
final error message indicates that it continued without creating the
backend "tpm0".  That's wrong.

Different tack: could -tpmdev be made sugar for -object?  I'm asking
because other kinds of backends use -object instead of their very own
option.



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

* Re: What is TYPE_TPM_TIS_ISA? (Not an ISA Device)
  2020-07-22  5:55   ` Markus Armbruster
@ 2020-07-22 22:07     ` Stefan Berger
  2020-07-23  9:10       ` Markus Armbruster
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Berger @ 2020-07-22 22:07 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: Eric Auger, Philippe Mathieu-Daudé,
	qemu-devel, Marc-André Lureau

On 7/22/20 1:55 AM, Markus Armbruster wrote:
> pm socket --tpmstate dir=tpm --ctrl type=unixio,path=tpm/swtpm-soc
> running in another terminal.
>
>>> 3/ no machine plug it using isa_register_ioport()
>>>     (it is not registered to the ISA memory space)
>> There's no requirement for an ISA device to have IO ports...
>>
>> thanks
>> -- PMM
> Thread hijack!  Since I didn't have swtpm installed, I tried to take a
> shortcut:
>
>      $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -chardev null,id=tpm0 -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
>      qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: tpm-emulator: tpm chardev 'chrtpm' not found.
>      qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: tpm-emulator: Could not cleanly shutdown the TPM: No such file or directory
>      QEMU 5.0.90 monitor - type 'help' for more information
>      (qemu) qemu-system-x86_64: -device tpm-tis,tpmdev=tpm0: Property 'tpm-tis.tpmdev' can't find value 'tpm0'
>      $ echo $?
>      1
>
> That a null chardev doesn't work is fine.  But the error handling looks
> broken: QEMU diagnoses and reports the problem, then continues.  The
> final error message indicates that it continued without creating the
> backend "tpm0".  That's wrong.


This issue can be solve via the following change that then displays this 
error:

$ x86_64-softmmu/qemu-system-x86_64 -nodefaults -S -display none 
-monitor stdio -chardev null,id=tpm0 -tpmdev 
emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: 
tpm-emulator: tpm chardev 'chrtpm' not found.
qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: 
tpm-emulator: Could not cleanly shutdown the TPM: No such file or directory


diff --git a/tpm.c b/tpm.c
index 358566cb10..857a861e69 100644
--- a/tpm.c
+++ b/tpm.c
@@ -170,8 +170,10 @@ void tpm_cleanup(void)
   */
  void tpm_init(void)
  {
-    qemu_opts_foreach(qemu_find_opts("tpmdev"),
-                      tpm_init_tpmdev, NULL, &error_fatal);
+    if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
+                          tpm_init_tpmdev, NULL, &error_fatal)) {
+        exit(1);
+    }
  }

  /*

We had something like this before this patch here was applied: 
https://github.com/qemu/qemu/commit/d10e05f15d5c3dd5e5cc59c5dfff460d89d48580#diff-0ec5df49c6751cb2dc9fa18ed5cf9f0e


Do we now want to partially revert this patch or call the exit(1) as 
shown here?


    Stefan



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

* Re: What is TYPE_TPM_TIS_ISA? (Not an ISA Device)
  2020-07-22 22:07     ` Stefan Berger
@ 2020-07-23  9:10       ` Markus Armbruster
  0 siblings, 0 replies; 6+ messages in thread
From: Markus Armbruster @ 2020-07-23  9:10 UTC (permalink / raw)
  To: Stefan Berger
  Cc: Eric Auger, Philippe Mathieu-Daudé,
	qemu-devel, Marc-André Lureau

Stefan Berger <stefanb@linux.ibm.com> writes:

> On 7/22/20 1:55 AM, Markus Armbruster wrote:
>> pm socket --tpmstate dir=tpm --ctrl type=unixio,path=tpm/swtpm-soc
>> running in another terminal.
>>
>>>> 3/ no machine plug it using isa_register_ioport()
>>>>     (it is not registered to the ISA memory space)
>>> There's no requirement for an ISA device to have IO ports...
>>>
>>> thanks
>>> -- PMM
>> Thread hijack!  Since I didn't have swtpm installed, I tried to take a
>> shortcut:
>>
>>      $ qemu-system-x86_64 -nodefaults -S -display none -monitor stdio -chardev null,id=tpm0 -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
>>      qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: tpm-emulator: tpm chardev 'chrtpm' not found.
>>      qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm: tpm-emulator: Could not cleanly shutdown the TPM: No such file or directory
>>      QEMU 5.0.90 monitor - type 'help' for more information
>>      (qemu) qemu-system-x86_64: -device tpm-tis,tpmdev=tpm0: Property 'tpm-tis.tpmdev' can't find value 'tpm0'
>>      $ echo $?
>>      1
>>
>> That a null chardev doesn't work is fine.  But the error handling looks
>> broken: QEMU diagnoses and reports the problem, then continues.  The
>> final error message indicates that it continued without creating the
>> backend "tpm0".  That's wrong.
>
>
> This issue can be solve via the following change that then displays
> this error:
>
> $ x86_64-softmmu/qemu-system-x86_64 -nodefaults -S -display none
> -monitor stdio -chardev null,id=tpm0 -tpmdev
> emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
> qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm:
> tpm-emulator: tpm chardev 'chrtpm' not found.
> qemu-system-x86_64: -tpmdev emulator,id=tpm0,chardev=chrtpm:
> tpm-emulator: Could not cleanly shutdown the TPM: No such file or
> directory
>
>
> diff --git a/tpm.c b/tpm.c
> index 358566cb10..857a861e69 100644
> --- a/tpm.c
> +++ b/tpm.c
> @@ -170,8 +170,10 @@ void tpm_cleanup(void)
>   */
>  void tpm_init(void)
>  {
> -    qemu_opts_foreach(qemu_find_opts("tpmdev"),
> -                      tpm_init_tpmdev, NULL, &error_fatal);
> +    if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
> +                          tpm_init_tpmdev, NULL, &error_fatal)) {
> +        exit(1);
> +    }
>  }
>
>  /*

Interesting.

> We had something like this before this patch here was applied:
> https://github.com/qemu/qemu/commit/d10e05f15d5c3dd5e5cc59c5dfff460d89d48580#diff-0ec5df49c6751cb2dc9fa18ed5cf9f0e
>
>
> Do we now want to partially revert this patch or call the exit(1) as
> shown here?

Let's have a closer look.

qemu_opts_foreach()'s contract:

 * For each member of @list, call @func(@opaque, member, @errp).
 * Call it with the current location temporarily set to the member's.
 * @func() may store an Error through @errp, but must return non-zero then.
 * When @func() returns non-zero, break the loop and return that value.
 * Return zero when the loop completes.

When qemu_opts_foreach(list, func, opaque, &error_fatal) returns, then
func() did not set an error (If it did, we'd have died due to
&error_fatal).

Therefore, func() must have returned non-zero without setting an error.
That's wrong.  Let's look for this in tpm_init_tpmdev():

    static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
    {
        [...]
        drv = be->create(opts);
        if (!drv) {
            return 1;

Bingo!

When I did commit d10e05f15d5, I missed this error path.

        }

        drv->id = g_strdup(id);
        QLIST_INSERT_HEAD(&tpm_backends, drv, list);

        return 0;
    }

Two possible fixes:

1. Revert d10e05f15d5, live with the "error_report() in a function that
takes an Error ** argument" code smell.  Bearable, because it's confined
to tpm.c.  I'd recommend a comment explaining the non-use of @errp in
tpm_init_tpmdev().

2. Convert the ->create() to Error: tpm_passthrough_create(),
tpm_emulator_create(), and their helpers.  I think this would leave us
in a better state, but I'm not sure the improvement is worth the effort
right now.

Spotted while writing this: ->tpm_startup() methods can fail.  They
appear to run in DeviceClass method reset(), which can't fail.
Awkward.  Could some failures be moved to realize() somehow?



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

end of thread, other threads:[~2020-07-23  9:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-21 16:02 What is TYPE_TPM_TIS_ISA? (Not an ISA Device) Philippe Mathieu-Daudé
2020-07-21 16:38 ` Stefan Berger
2020-07-21 16:40 ` Peter Maydell
2020-07-22  5:55   ` Markus Armbruster
2020-07-22 22:07     ` Stefan Berger
2020-07-23  9:10       ` Markus Armbruster

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.