Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ef621d3 authored by Tan, Li's avatar Tan, Li Committed by Avi Kivity
Browse files

KVM: Support mixed endian machines



Currently kvmtrace is not portable. This will prevent from copying a
trace file from big-endian target to little-endian workstation for analysis.
In the patch, kernel outputs metadata containing a magic number to trace
log, and changes 64-bit words to be u64 instead of a pair of u32s.

Signed-off-by: default avatarTan Li <li.tan@intel.com>
Acked-by: default avatarJerone Young <jyoung5@us.ibm.com>
Acked-by: default avatarHollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
parent 25be4608
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -318,14 +318,14 @@ struct kvm_trace_rec {
	__u32 vcpu_id;
	union {
		struct {
			__u32 cycle_lo, cycle_hi;
			__u64 cycle_u64;
			__u32 extra_u32[KVM_TRC_EXTRA_MAX];
		} cycle;
		struct {
			__u32 extra_u32[KVM_TRC_EXTRA_MAX];
		} nocycle;
	} u;
};
} __attribute__((packed));

#define KVMIO 0xAE

+12 −6
Original line number Diff line number Diff line
@@ -72,11 +72,7 @@ static void kvm_add_trace(void *probe_private, void *call_data,
	rec.cycle_in 	= p->cycle_in;

	if (rec.cycle_in) {
		u64 cycle = 0;

		cycle = get_cycles();
		rec.u.cycle.cycle_lo = (u32)cycle;
		rec.u.cycle.cycle_hi = (u32)(cycle >> 32);
		rec.u.cycle.cycle_u64 = get_cycles();

		for (i = 0; i < rec.extra_u32; i++)
			rec.u.cycle.extra_u32[i] = va_arg(*args, u32);
@@ -114,8 +110,18 @@ static int kvm_subbuf_start_callback(struct rchan_buf *buf, void *subbuf,
{
	struct kvm_trace *kt;

	if (!relay_buf_full(buf))
	if (!relay_buf_full(buf)) {
		if (!prev_subbuf) {
			/*
			 * executed only once when the channel is opened
			 * save metadata as first record
			 */
			subbuf_start_reserve(buf, sizeof(u32));
			*(u32 *)subbuf = 0x12345678;
		}

		return 1;
	}

	kt = buf->chan->private_data;
	atomic_inc(&kt->lost_records);