Slightly unconventional coding style, but Acked-by: Hollis Blanchard
<[EMAIL PROTECTED]>

Eric, as I mentioned previously, bitfields cannot be used in portable
binary formats.

Avi, would you apply please?

-- 
Hollis Blanchard
IBM Linux Technology Center

On Thu, 2008-06-19 at 23:19 -0500, Jerone Young wrote:
> 2 files changed, 21 insertions(+), 11 deletions(-)
> include/linux/kvm.h  |   10 +++++++---
> virt/kvm/kvm_trace.c |   22 ++++++++++++++--------
> 
> 
> This patch fixes kvmtrace use on big endian systems. When using bit fields 
> the compiler will lay data out in the wrong order expected when laid down 
> into a file. This fixes it by using one variable instead of using bit fields.
> 
> Signed-off-by: Jerone Young <[EMAIL PROTECTED]>
> 
> diff --git a/include/linux/kvm.h b/include/linux/kvm.h
> --- a/include/linux/kvm.h
> +++ b/include/linux/kvm.h
> @@ -311,9 +311,13 @@ struct kvm_s390_interrupt {
> 
>  /* This structure represents a single trace buffer record. */
>  struct kvm_trace_rec {
> -     __u32 event:28;
> -     __u32 extra_u32:3;
> -     __u32 cycle_in:1;
> +     /* variable rec_val
> +      * is split into:
> +      * bits 0 - 27  -> event id
> +      * bits 28 -30  -> number of extra data args of size u32
> +      * bits 31      -> binary indicator for if tsc is in record
> +      */
> +     __u32 rec_val;
>       __u32 pid;
>       __u32 vcpu_id;
>       union {
> diff --git a/virt/kvm/kvm_trace.c b/virt/kvm/kvm_trace.c
> --- a/virt/kvm/kvm_trace.c
> +++ b/virt/kvm/kvm_trace.c
> @@ -54,12 +54,15 @@ static void kvm_add_trace(void *probe_pr
>       struct kvm_trace *kt = kvm_trace;
>       struct kvm_trace_rec rec;
>       struct kvm_vcpu *vcpu;
> -     int    i, extra, size;
> +     int    i, size;
> +     u32 extra;
> 
>       if (unlikely(kt->trace_state != KVM_TRACE_STATE_RUNNING))
>               return;
> +     
> +     /* set event id */      
> +     rec.rec_val     = 0x0fffffff & va_arg(*args, u32);
> 
> -     rec.event       = va_arg(*args, u32);
>       vcpu            = va_arg(*args, struct kvm_vcpu *);
>       rec.pid         = current->tgid;
>       rec.vcpu_id     = vcpu->vcpu_id;
> @@ -67,21 +70,24 @@ static void kvm_add_trace(void *probe_pr
>       extra           = va_arg(*args, u32);
>       WARN_ON(!(extra <= KVM_TRC_EXTRA_MAX));
>       extra           = min_t(u32, extra, KVM_TRC_EXTRA_MAX);
> -     rec.extra_u32   = extra;
> 
> -     rec.cycle_in    = p->cycle_in;
> +     /* set inidicator for tcs record */
> +     rec.rec_val     |= 0x80000000 & (p->cycle_in << 31);
> +     
> +     /* set extra data num */
> +     rec.rec_val     |= 0x70000000 & (extra << 28);
> 
> -     if (rec.cycle_in) {
> +     if (p->cycle_in) {
>               rec.u.cycle.cycle_u64 = get_cycles();
> 
> -             for (i = 0; i < rec.extra_u32; i++)
> +             for (i = 0; i < extra; i++)
>                       rec.u.cycle.extra_u32[i] = va_arg(*args, u32);
>       } else {
> -             for (i = 0; i < rec.extra_u32; i++)
> +             for (i = 0; i < extra; i++)
>                       rec.u.nocycle.extra_u32[i] = va_arg(*args, u32);
>       }
> 
> -     size = calc_rec_size(rec.cycle_in, rec.extra_u32 * sizeof(u32));
> +     size = calc_rec_size(p->cycle_in, extra * sizeof(u32));
>       relay_write(kt->rchan, &rec, size);
>  }
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to