From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gleb Natapov Subject: [PATCH] fix realmode.c emulator test Date: Mon, 1 Mar 2010 16:14:46 +0200 Message-ID: <20100301141446.GM16909@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm@vger.kernel.org To: mtosatti@redhat.com, avi@redhat.com Return-path: Received: from mx1.redhat.com ([209.132.183.28]:8810 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750798Ab0CAOOu (ORCPT ); Mon, 1 Mar 2010 09:14:50 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o21EEmpZ007002 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 1 Mar 2010 09:14:50 -0500 Content-Disposition: inline Sender: kvm-owner@vger.kernel.org List-ID: IO test doesn't clobber EAX register between out and in so if they do nothing test succeed where it should fail. Fix that. Enlarge space for tested code from 16 bytes to 32 bytes since now some tests are longer then 16 bytes. Change ".pushsection .text" (which does nothing since we are already in .text and thus test code is left in the middle of the main code) to use subsections. Signed-off-by: Gleb Natapov diff --git a/kvm/user/test/x86/realmode.c b/kvm/user/test/x86/realmode.c index 9bf6cb0..bc6b27f 100644 --- a/kvm/user/test/x86/realmode.c +++ b/kvm/user/test/x86/realmode.c @@ -87,7 +87,7 @@ static void exec_in_big_real_mode(const struct regs *inregs, "xchg %%esp, %[save]+24 \n\t" "xchg %%ebp, %[save]+28 \n\t" - "test_insn: . = . + 16\n\t" + "test_insn: . = . + 32\n\t" "test_insn_end: \n\t" "xchg %%eax, %[save]+0 \n\t" @@ -134,10 +134,10 @@ int regs_equal(const struct regs *r1, const struct regs *r2, int ignore) #define MK_INSN(name, str) \ asm ( \ - ".pushsection \".text\" \n\t" \ + ".text 1\n\t" \ "insn_" #name ": " str " \n\t" \ "insn_" #name "_end: \n\t" \ - ".popsection \n\t" \ + ".text\n\t" \ ); \ extern u8 insn_##name[], insn_##name##_end[] @@ -293,25 +293,31 @@ void test_io(void) { struct regs inregs = { 0 }, outregs; MK_INSN(io_test1, "mov $0xff, %al \n\t" - "out %al, $0x10 \n\t" - "in $0x10, %al \n\t"); + "out %al, $0xe0 \n\t" + "mov $0x00, %al \n\t" + "in $0xe0, %al \n\t"); MK_INSN(io_test2, "mov $0xffff, %ax \n\t" - "out %ax, $0x10 \n\t" - "in $0x10, %ax \n\t"); + "out %ax, $0xe0 \n\t" + "mov $0x0000, %ax \n\t" + "in $0xe0, %ax \n\t"); MK_INSN(io_test3, "mov $0xffffffff, %eax \n\t" - "out %eax, $0x10 \n\t" - "in $0x10, %eax \n\t"); - MK_INSN(io_test4, "mov $0x10, %dx \n\t" + "out %eax, $0xe0 \n\t" + "mov $0x000000, %eax \n\t" + "in $0xe0, %eax \n\t"); + MK_INSN(io_test4, "mov $0xe0, %dx \n\t" "mov $0xff, %al \n\t" "out %al, %dx \n\t" + "mov $0x00, %al \n\t" "in %dx, %al \n\t"); - MK_INSN(io_test5, "mov $0x10, %dx \n\t" + MK_INSN(io_test5, "mov $0xe0, %dx \n\t" "mov $0xffff, %ax \n\t" "out %ax, %dx \n\t" + "mov $0x0000, %ax \n\t" "in %dx, %ax \n\t"); - MK_INSN(io_test6, "mov $0x10, %dx \n\t" + MK_INSN(io_test6, "mov $0xe0, %dx \n\t" "mov $0xffffffff, %eax \n\t" "out %eax, %dx \n\t" + "mov $0x00000000, %eax \n\t" "in %dx, %eax \n\t"); exec_in_big_real_mode(&inregs, &outregs, -- Gleb.