summaryrefslogtreecommitdiffstats
path: root/src/VBox/ValidationKit/bootsectors/bs3-cpu-state64-1.c64
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/ValidationKit/bootsectors/bs3-cpu-state64-1.c64')
-rw-r--r--src/VBox/ValidationKit/bootsectors/bs3-cpu-state64-1.c64166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/VBox/ValidationKit/bootsectors/bs3-cpu-state64-1.c64 b/src/VBox/ValidationKit/bootsectors/bs3-cpu-state64-1.c64
new file mode 100644
index 00000000..c2645f59
--- /dev/null
+++ b/src/VBox/ValidationKit/bootsectors/bs3-cpu-state64-1.c64
@@ -0,0 +1,166 @@
+/* $Id: bs3-cpu-state64-1.c64 $ */
+/** @file
+ * BS3Kit - bs3-cpu-state64-1, 64-bit C code.
+ */
+
+/*
+ * Copyright (C) 2007-2023 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+
+/*********************************************************************************************************************************
+* Header Files *
+*********************************************************************************************************************************/
+#include <bs3kit.h>
+#include <iprt/asm-amd64-x86.h>
+
+
+/*********************************************************************************************************************************
+* Internal Functions *
+*********************************************************************************************************************************/
+BS3_DECL(void) bs3CpuState64Worker_Nop(void);
+BS3_DECL(void) bs3CpuState64Worker_ModAll32BitGrps(void);
+BS3_DECL(void) bs3CpuState64Worker_ModAll16BitGrps(void);
+BS3_DECL(void) bs3CpuState64Worker_ModAll8BitGrps(void);
+BS3_DECL(void) bs3CpuState64Worker_ModCr2(void);
+BS3_DECL(void) bs3CpuState64Worker(PFNBS3NEAR pfnWorker);
+
+
+/*********************************************************************************************************************************
+* Global Variables *
+*********************************************************************************************************************************/
+extern BS3REGCTX g_bs3CpuState64CtxToLoad;
+extern BS3REGCTX const g_bs3CpuState64CtxSaved;
+
+
+static void bs3CpuState64InitCtx(uint64_t uTweak)
+{
+ Bs3RegCtxSave(&g_bs3CpuState64CtxToLoad);
+ g_bs3CpuState64CtxToLoad.rax.u = UINT64_C(0x8877f055443322e0) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.rcx.u = UINT64_C(0x8877f155443322e1) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.rdx.u = UINT64_C(0x8877f255443322e2) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.rbx.u = UINT64_C(0x8877f355443322e3) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.rsp.u = UINT64_C(0x8877f455443322e4) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.rbp.u = UINT64_C(0x8877f555443322e5) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.rsi.u = UINT64_C(0x8877f655443322e6) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.rdi.u = UINT64_C(0x8877f755443322e7) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r8.u = UINT64_C(0x8877f855443322e8) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r9.u = UINT64_C(0x8877f955443322e9) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r10.u = UINT64_C(0x8877fa55443322ea) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r11.u = UINT64_C(0x8877fb55443322eb) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r12.u = UINT64_C(0x8877fc55443322ec) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r13.u = UINT64_C(0x8877fd55443322ed) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r14.u = UINT64_C(0x8877fe55443322ee) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.r15.u = UINT64_C(0x8877ff55443322ef) ^ uTweak;
+ g_bs3CpuState64CtxToLoad.cr2.u = UINT64_C(0x89abcdef76543210) ^ uTweak;
+ //Bs3TestPrintf("** Input:\n");
+ //Bs3RegCtxPrint(&g_bs3CpuState64CtxToLoad);
+}
+
+
+static void bs3CpuState64Comp(bool fModRbx)
+{
+ //Bs3TestPrintf("** Result:\n");
+ //Bs3RegCtxPrint(&g_bs3CpuState64CtxSaved);
+ g_bs3CpuState64CtxToLoad.rax = g_bs3CpuState64CtxSaved.rax;
+ g_bs3CpuState64CtxToLoad.rip = g_bs3CpuState64CtxSaved.rip;
+ g_bs3CpuState64CtxToLoad.rflags = g_bs3CpuState64CtxSaved.rflags;
+ g_bs3CpuState64CtxToLoad.rsp = g_bs3CpuState64CtxSaved.rsp;
+ if (!fModRbx)
+ g_bs3CpuState64CtxToLoad.rbx.au16[0] = g_bs3CpuState64CtxSaved.rbx.au16[0];
+ if (1)
+ g_bs3CpuState64CtxToLoad.ds = g_bs3CpuState64CtxSaved.ds;
+
+ Bs3TestCheckRegCtxEx(&g_bs3CpuState64CtxSaved, &g_bs3CpuState64CtxToLoad, 0 /*cbPcAdjust*/, 0 /*cbSpAdjust*/,
+ 0 /*fExtraEfl*/, "lm64", 0 /*idTestStep*/);
+}
+
+BS3_DECL(void) Main_lm64()
+{
+ Bs3TestInit("bs3-cpu-state64-1");
+ /*
+ * Switch to 64-bit mode and back to rm.
+ */
+ Bs3TestSub("noop");
+ bs3CpuState64InitCtx(0);
+ bs3CpuState64Worker(bs3CpuState64Worker_Nop);
+ bs3CpuState64Comp(false /*fModRbx*/);
+
+ Bs3TestSub("Modify all 32-bit GPRs");
+ bs3CpuState64InitCtx(0);
+ bs3CpuState64Worker(bs3CpuState64Worker_ModAll32BitGrps);
+ g_bs3CpuState64CtxToLoad.rax.u = UINT64_C(0xc0ffee0d);
+ g_bs3CpuState64CtxToLoad.rcx.u = UINT64_C(0xc0ffee1d);
+ g_bs3CpuState64CtxToLoad.rdx.u = UINT64_C(0xc0ffee2d);
+ g_bs3CpuState64CtxToLoad.rbx.u = UINT64_C(0xc0ffee3d);
+ g_bs3CpuState64CtxToLoad.rsp.u = UINT64_C(0xc0ffee4d);
+ g_bs3CpuState64CtxToLoad.rbp.u = UINT64_C(0xc0ffee5d);
+ g_bs3CpuState64CtxToLoad.rsi.u = UINT64_C(0xc0ffee6d);
+ g_bs3CpuState64CtxToLoad.rdi.u = UINT64_C(0xc0ffee7d);
+ bs3CpuState64Comp(true /*fModRbx*/);
+
+ Bs3TestSub("Modify all 16-bit GPRs");
+ bs3CpuState64InitCtx(0);
+ bs3CpuState64Worker(bs3CpuState64Worker_ModAll16BitGrps);
+ g_bs3CpuState64CtxToLoad.rax.au16[0] = UINT16_C(0xfad0);
+ g_bs3CpuState64CtxToLoad.rcx.au16[0] = UINT16_C(0xfad1);
+ g_bs3CpuState64CtxToLoad.rdx.au16[0] = UINT16_C(0xfad2);
+ g_bs3CpuState64CtxToLoad.rbx.au16[0] = UINT16_C(0xfad3);
+ g_bs3CpuState64CtxToLoad.rsp.au16[0] = UINT16_C(0xfad4);
+ g_bs3CpuState64CtxToLoad.rbp.au16[0] = UINT16_C(0xfad5);
+ g_bs3CpuState64CtxToLoad.rsi.au16[0] = UINT16_C(0xfad6);
+ g_bs3CpuState64CtxToLoad.rdi.au16[0] = UINT16_C(0xfad7);
+ bs3CpuState64Comp(true /*fModRbx*/);
+
+ Bs3TestSub("Modify all 8-bit GPRs");
+ bs3CpuState64InitCtx(0);
+ bs3CpuState64Worker(bs3CpuState64Worker_ModAll8BitGrps);
+ g_bs3CpuState64CtxToLoad.rax.au8[0] = 0x10;
+ g_bs3CpuState64CtxToLoad.rax.au8[1] = 0x11;
+ g_bs3CpuState64CtxToLoad.rcx.au8[0] = 0x20;
+ g_bs3CpuState64CtxToLoad.rcx.au8[1] = 0x21;
+ g_bs3CpuState64CtxToLoad.rdx.au8[0] = 0x30;
+ g_bs3CpuState64CtxToLoad.rdx.au8[1] = 0x31;
+ g_bs3CpuState64CtxToLoad.rbx.au8[0] = 0x40;
+ g_bs3CpuState64CtxToLoad.rbx.au8[1] = 0x41;
+ bs3CpuState64Comp(true /*fModRbx*/);
+
+ Bs3TestSub("Modify CR2");
+ bs3CpuState64InitCtx(0);
+ bs3CpuState64Worker(bs3CpuState64Worker_ModCr2);
+ g_bs3CpuState64CtxToLoad.cr2.u = 0xf00dface;
+ bs3CpuState64Comp(true /*fModRbx*/);
+
+ /** @todo DRx */
+ Bs3TestTerm();
+ for (;;)
+ ASMHalt();
+}
+