All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bill Wendling <morbo@google.com>
To: kvm@vger.kernel.org, pbonzini@redhat.com,
	alexandru.elisei@arm.com, thuth@redhat.com
Cc: jmattson@google.com, Bill Wendling <morbo@google.com>
Subject: [kvm-unit-tests v2 PATCH 1/2] x86: realmode: explicitly copy regs structure
Date: Wed, 16 Oct 2019 18:25:01 -0700	[thread overview]
Message-ID: <20191017012502.186146-2-morbo@google.com> (raw)
In-Reply-To: <20191017012502.186146-1-morbo@google.com>

Clang prefers to use a "rep;movsl" (or equivalent) to copy the "regs"
structure. This doesn't work in 16-bit mode, as it will end up copying
over half the number of bytes. Avoid this by copying over the structure
a byte at a time.

Signed-off-by: Bill Wendling <morbo@google.com>
---
 x86/realmode.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/x86/realmode.c b/x86/realmode.c
index 303d093..41b8592 100644
--- a/x86/realmode.c
+++ b/x86/realmode.c
@@ -140,6 +140,16 @@ struct insn_desc {
 
 static struct regs inregs, outregs;
 
+static inline void copy_regs(struct regs *dst_regs, struct regs *src_regs)
+{
+	char *dst = (char*)dst_regs;
+	char *src = (char*)src_regs;
+	u32 i;
+
+	for (i = 0; i < sizeof(struct regs); i++)
+		dst[i] = src[i];
+}
+
 static void exec_in_big_real_mode(struct insn_desc *insn)
 {
 	unsigned long tmp;
@@ -148,11 +158,11 @@ static void exec_in_big_real_mode(struct insn_desc *insn)
 	extern u8 test_insn[], test_insn_end[];
 
 	for (i = 0; i < insn->len; ++i)
-	    test_insn[i] = ((u8 *)(unsigned long)insn->ptr)[i];
+		test_insn[i] = ((u8 *)(unsigned long)insn->ptr)[i];
 	for (; i < test_insn_end - test_insn; ++i)
 		test_insn[i] = 0x90; // nop
 
-	save = inregs;
+	copy_regs(&save, &inregs);
 	asm volatile(
 		"lgdtl %[gdt_descr] \n\t"
 		"mov %%cr0, %[tmp] \n\t"
@@ -196,7 +206,8 @@ static void exec_in_big_real_mode(struct insn_desc *insn)
 		: [gdt_descr]"m"(gdt_descr), [bigseg]"r"((short)16)
 		: "cc", "memory"
 		);
-	outregs = save;
+	copy_regs(&outregs, &save);
+
 }
 
 #define R_AX 1
-- 
2.23.0.700.g56cf767bdb-goog


  reply	other threads:[~2019-10-17  1:25 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-12 23:58 [kvm-unit-tests PATCH 0/2] realmode test fixes for clang Bill Wendling
2019-10-12 23:58 ` [kvm-unit-tests PATCH 1/2] x86: realmode: explicitly copy structure to avoid memcpy Bill Wendling
2019-10-16 19:07   ` Jim Mattson
2019-10-21 15:38   ` Paolo Bonzini
2019-10-12 23:58 ` [kvm-unit-tests PATCH 2/2] x86: realmode: use inline asm to get stack pointer Bill Wendling
2019-10-16 19:53   ` Jim Mattson
2019-10-16 21:52     ` Jim Mattson
2019-10-21 15:41       ` Paolo Bonzini
2019-10-17  1:25 ` [kvm-unit-tests v2 PATCH 0/2] realmode test fixes for clang Bill Wendling
2019-10-17  1:25   ` Bill Wendling [this message]
2019-10-17  1:25   ` [kvm-unit-tests v2 PATCH 2/2] x86: realmode: fix esp in call test Bill Wendling
2019-10-17 23:27     ` Jim Mattson
2019-10-21 15:43     ` Paolo Bonzini
2019-10-21 16:43       ` Jim Mattson

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=20191017012502.186146-2-morbo@google.com \
    --to=morbo@google.com \
    --cc=alexandru.elisei@arm.com \
    --cc=jmattson@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=thuth@redhat.com \
    /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 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.