qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Berger <stefanb@linux.vnet.ibm.com>
To: Corey Bryant <coreyb@linux.vnet.ibm.com>
Cc: mst@redhat.com, qemu-devel@nongnu.org, anthony@codemonkey.ws,
	andreas.niederl@iaik.tugraz.at
Subject: Re: [Qemu-devel] [PATCH V19 2/7] Add TPM (frontend) hardware interface (TPM TIS) to Qemu
Date: Wed, 24 Oct 2012 14:46:03 -0400	[thread overview]
Message-ID: <5088376B.8020504@linux.vnet.ibm.com> (raw)
In-Reply-To: <5064612E.5080700@linux.vnet.ibm.com>

On 09/27/2012 10:22 AM, Corey Bryant wrote:
>
>
> On 06/04/2012 03:37 PM, Stefan Berger wrote:
>> +
>> +/* whether the STS interrupt is supported */
>> +/*#define RAISE_STS_IRQ */
>
> Why is this commented out?
>
Will activate it.

>> +    if ((tis->loc[locty].inte & TPM_TIS_INT_ENABLED) &&
>> +        (tis->loc[locty].inte & irqmask)) {
>> +        dprintf("tpm_tis: Raising IRQ for flag %08x\n", irqmask);
>> +        qemu_irq_raise(s->s.tis.irq);
>> +        tis->loc[locty].ints |= irqmask;
>
> Should the ints irqmask be set before the interrupt is raised?
>

I don't think the order matters. If multiple threads were in here we'd 
need to lock the access to the variable altogether.


>> +    TPMTISState *tis = &s->s.tis;
>> +    int change = (s->s.tis.active_locty != new_active_locty);
>> +
>> +    if (change && TPM_TIS_IS_VALID_LOCTY(s->s.tis.active_locty)) {
>> +        /* reset flags on the old active locality */
>> +        tis->loc[s->s.tis.active_locty].access &=
>> + ~(TPM_TIS_ACCESS_ACTIVE_LOCALITY|TPM_TIS_ACCESS_REQUEST_USE);
>
> Should TPM_TIS_ACCESS_REQUEST_USE be modified for the old locality 
> when we are in here for TPM_TIS_ACCESS_SEIZE?
>
> The TPM TIS document says the following (in the TPM_ACCESS_x table, 
> under the Seize bit description):
>
> "2. Setting this bit does not affect the state of the 
> TPM_ACCESS_x.requestUse bit for any locality except the one issuing 
> the Seize bit."
>

Good catch. In the case of the function being called as part of a seize, 
the REQUEST_USE flag will not be touched anymore.


>> +    tis->loc[locty].sts = TPM_TIS_STS_VALID | 
>> TPM_TIS_STS_DATA_AVAILABLE;
>> +    tis->loc[locty].status = TPM_TIS_STATUS_COMPLETION;
>
> Can tis->loc[locty].status be changed to tis->loc[locty].state?  This 
> is very confusing when named "status" because it is easy to confuse 
> with the TPM_INT_STATUS register, which in actuality it is unrelated.
>

Yes, it's now called TPMTISState and the previously existing TPMTISState 
has now been renamed to TPMTISEmuState.


>> +        ret = 
>> tis->loc[locty].r_buffer.buffer[tis->loc[locty].r_offset++];
>> +        if (tis->loc[locty].r_offset >= len) {
>> +            /* got last byte */
>> +            tis->loc[locty].sts = TPM_TIS_STS_VALID;
>
> Should dataAvail be turned off here?
>

The data available flag TPM_TIS_STS_DATA_AVAILABLE is part of the .sts 
field and is turned off due to the above value assignment.


>> +        if (tis->active_locty == locty) {
>> +            if ((tis->loc[locty].sts & TPM_TIS_STS_DATA_AVAILABLE)) {
>> +                val = 
>> (tpm_tis_get_size_from_buffer(&tis->loc[locty].r_buffer)
>> +                        - tis->loc[locty].r_offset) << 8 | 
>> tis->loc[locty].sts;
>
> Can you create/use a #define for burstCount instead of using a 
> hard-coded 8?
>
Ok.

>> +    switch (off) {
>> +    case TPM_TIS_REG_ACCESS:
>> +
>> +        if ((val & TPM_TIS_ACCESS_SEIZE)) {
>> +            val &= ~(TPM_TIS_ACCESS_REQUEST_USE |
>> +                     TPM_TIS_ACCESS_ACTIVE_LOCALITY);
>> +        }
>
> Is there a reason why this code can't be merged with the "(val & 
> TPM_TIS_ACCESS_SEIZE)" check that is down below?
>

The above code means that in case the SEIZE flag is set, all other flags 
are ignored. It makes the subsequent tests for single bits a lot easier 
to handle. I prefer to do the masking of those bits at the beginning.


>> +                /* check for ongoing seize by a higher locality */
>> +                for (l = locty + 1; l < TPM_TIS_NUM_LOCALITIES; l++) {
>> +                    if ((tis->loc[l].access & TPM_TIS_ACCESS_SEIZE)) {
>> +                        break;
>
> Were you intending to break from the for loop or the while?
>

Right. I am setting a flag here now to then leave the while loop.

>> +
>> +        tis->loc[locty].inte = (val & (TPM_TIS_INT_ENABLED | (0x3 << 
>> 3) |
>> + TPM_TIS_INTERRUPTS_SUPPORTED));
>
> Is 0x3 << 3 == typePolarity? Could a #define be introduced for this 
> instead of hard coding it?
>

Ok.

>> +            case TPM_TIS_STATUS_EXECUTION:
>> +            case TPM_TIS_STATUS_RECEPTION:
>> +                /* abort currently running command */
>> +                dprintf("tpm_tis: %s: Initiating abort.\n",
>> +                        __func__);
>> +                tpm_tis_prep_abort(s, locty, locty);
>> +            break;
>> +
>> +            case TPM_TIS_STATUS_COMPLETION:
>
> Does this path need to abort if TPM_STS_x.dataAvail is on? This 
> comment is based on "Table 19: State Transition Table." from the TPM 
> TIS document.
>

If TPM_TIS_STATUS_COMPLETION is the current state, then independent of 
the TPM_TIS_STS_DATA_AVAILABLE flag the state transition is to idle 
(states 30 and 37 in the spec). Following state 0.B in the spec, we 
implement a TPM without idle state and so we transition to READY state 
immediately. The data available flag should be reset, though.


>> + tis->loc[locty].sts = TPM_TIS_STS_EXPECT |
>> +                                          TPM_TIS_STS_VALID;
>> +                } else {
>> +                    /* packet complete */
>> +                    tis->loc[locty].sts = TPM_TIS_STS_VALID;
>
> Should EXPECT be turned off here instead of where it is currently 
> turned off in tpm_tis_tpm_send?
>

The TPM_TIS_STS_EXPECT is turned off as part of the above value 
assignment but I removed the unnecessary masking of this bit in 
tpm_tis_tpm_send now and let the GO flag only submit the command if the 
EXPECT flag is not set anymore.

I hope this addresses your concerns in this part.

  Regards,
       Stefan

  reply	other threads:[~2012-10-24 18:47 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-04 19:37 [Qemu-devel] [PATCH V19 0/7] Qemu Trusted Platform Module (TPM) integration Stefan Berger
2012-06-04 19:37 ` [Qemu-devel] [PATCH V19 1/7] Support for TPM command line options Stefan Berger
2012-09-27 14:12   ` Corey Bryant
2012-10-24 19:06     ` Stefan Berger
2012-11-08 15:52       ` Corey Bryant
2012-11-12 13:04         ` Stefan Berger
2012-06-04 19:37 ` [Qemu-devel] [PATCH V19 2/7] Add TPM (frontend) hardware interface (TPM TIS) to Qemu Stefan Berger
2012-09-27 14:22   ` Corey Bryant
2012-10-24 18:46     ` Stefan Berger [this message]
2012-11-08 15:39       ` Corey Bryant
2012-11-12 13:16         ` Stefan Berger
2012-11-12 18:48           ` Corey Bryant
2012-10-03 18:35   ` Corey Bryant
2012-06-04 19:37 ` [Qemu-devel] [PATCH V19 3/7] Add a debug register Stefan Berger
2012-09-27 14:23   ` Corey Bryant
2012-06-04 19:37 ` [Qemu-devel] [PATCH V19 4/7] Build the TPM frontend code Stefan Berger
2012-09-27 14:24   ` Corey Bryant
2012-06-04 19:37 ` [Qemu-devel] [PATCH V19 5/7] Add a TPM Passthrough backend driver implementation Stefan Berger
2012-09-27 14:28   ` Corey Bryant
2012-10-24 19:07     ` Stefan Berger
2012-06-04 19:37 ` [Qemu-devel] [PATCH V19 6/7] Introduce --enable-tpm-passthrough configure option Stefan Berger
2012-09-27 14:29   ` Corey Bryant
2012-06-04 19:37 ` [Qemu-devel] [PATCH V19 7/7] Add fd parameter for TPM passthrough driver Stefan Berger
2012-09-27 14:35   ` Corey Bryant
2012-10-03 18:46   ` Corey Bryant
2012-10-24 19:06     ` Stefan Berger
2012-06-04 19:56 ` [Qemu-devel] [PATCH V19 0/7] Qemu Trusted Platform Module (TPM) integration Stefan Weil
2012-06-04 23:08   ` Anthony Liguori
2012-09-27 14:59 ` Corey Bryant
2012-09-28 22:43   ` Stefan Berger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5088376B.8020504@linux.vnet.ibm.com \
    --to=stefanb@linux.vnet.ibm.com \
    --cc=andreas.niederl@iaik.tugraz.at \
    --cc=anthony@codemonkey.ws \
    --cc=coreyb@linux.vnet.ibm.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).