summaryrefslogtreecommitdiffstats
path: root/src/VBox/VMM/testcase/Makefile.kmk
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/VBox/VMM/testcase/Makefile.kmk842
1 files changed, 842 insertions, 0 deletions
diff --git a/src/VBox/VMM/testcase/Makefile.kmk b/src/VBox/VMM/testcase/Makefile.kmk
new file mode 100644
index 00000000..43cb7b40
--- /dev/null
+++ b/src/VBox/VMM/testcase/Makefile.kmk
@@ -0,0 +1,842 @@
+# $Id: Makefile.kmk $
+## @file
+# Sub-Makefile for the VMM testcases.
+#
+
+#
+# Copyright (C) 2006-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>.
+#
+# SPDX-License-Identifier: GPL-3.0-only
+#
+
+SUB_DEPTH = ../../../..
+include $(KBUILD_PATH)/subheader.kmk
+
+#
+# Include sub-makefiles.
+#
+if 0 # Not ready for general consumption yet.
+ include $(PATH_SUB_CURRENT)/Instructions/Makefile.kmk
+endif
+
+#
+# Target lists.
+#
+PROGRAMS += tstVMStructSize tstAsmStructs
+ifdef VBOX_WITH_RAW_MODE
+ PROGRAMS += tstVMStructRC tstAsmStructsRC
+endif
+if !defined(VBOX_ONLY_EXTPACKS) \
+ && ( defined(VBOX_WITH_DTRACE_R3) \
+ || defined(VBOX_WITH_DTRACE_R0) \
+ || defined(VBOX_WITH_DTRACE_RC))
+ PROGRAMS += tstVMStructDTrace
+ INSTALLS += VMMLibDTraceStructTest
+endif
+ifndef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ PROGRAMS += tstGlobalConfigHardened
+ DLL += tstGlobalConfig
+ else
+ PROGRAMS += tstGlobalConfig
+ endif
+
+ ifdef VBOX_WITH_RAW_MODE
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ PROGRAMS += tstVMMHardened
+ DLLS += tstVMM
+ else
+ PROGRAMS += tstVMM tstVMM-HM
+ endif
+ ifneq ($(KBUILD_TARGET),win)
+ PROGRAMS += tstVMMFork
+ endif
+ endif
+ ifdef VBOX_WITH_TESTCASES
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ PROGRAMS += tstCFGMHardened tstVMREQHardened tstAnimateHardened
+ DLLS += tstCFGM tstVMREQ tstAnimate
+ else
+ PROGRAMS += tstCFGM tstVMREQ tstAnimate
+ endif
+ PROGRAMS += \
+ tstCompressionBenchmark \
+ tstIEMCheckMc \
+ tstIEMAImpl \
+ tstPDMQueue \
+ tstSSM
+ PROGRAMS.amd64 += tstIEMAImplAsm
+
+ if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
+ PROGRAMS += \
+ tstVMMR0CallHost-1 \
+ tstX86-FpuSaveRestore
+ ifn1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), solaris.x86 solaris.amd64 win.amd64) ## TODO: Fix the code.
+ PROGRAMS += tstX86-1
+ endif
+ endif
+ ifdef VBOX_WITH_RAW_MODE
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ PROGRAMS += tstMicroHardened
+ DLLS += tstMicro
+ else
+ PROGRAMS += tstMicro
+ endif
+ SYSMODS += tstMicroRC
+ endif
+ ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ PROGRAMS += tstPDMAsyncCompletionHardened tstPDMAsyncCompletionStressHardened
+ DLLS += tstPDMAsyncCompletion tstPDMAsyncCompletionStress
+ else
+ PROGRAMS += tstPDMAsyncCompletion tstPDMAsyncCompletionStress
+ endif
+ endif
+ endif # VBOX_WITH_TESTCASES
+endif # !VBOX_ONLY_EXTPACKS_USE_IMPLIBS
+
+# Where we put our temporary files (just for simplicity)
+VBOX_VMM_TESTCASE_OUT_DIR := $(PATH_TARGET)/VMM
+BLDDIRS += $(VBOX_VMM_TESTCASE_OUT_DIR)
+
+#
+# We setup two 'other' targets for executing the two structure & alignment
+# validation testcases. Perhaps a bit hackish, but extremely useful.
+#
+ifeq ($(KBUILD_TARGET),$(KBUILD_HOST))
+ ifeq ($(filter-out x86.x86 amd64.amd64 x86.amd64, $(KBUILD_TARGET_ARCH).$(KBUILD_HOST_ARCH)),)
+ OTHERS += \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructs.run \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructSize.run
+ endif
+endif
+
+# The normal testing pass.
+TESTING += \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructs.run \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructSize.run
+
+OTHER_CLEAN += \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructs.run \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructSize.run \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.o \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.o.dep \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.mac \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.mac.o \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.mac.lst \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsRC.h \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsHC.h \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructRC.h
+
+#
+# Globals
+#
+VBOX_PATH_VMM_SRC = $(PATH_ROOT)/src/VBox/VMM
+
+#
+# Targets
+#
+ifdef VBOX_WITH_RAW_MODE
+ tstVMStructRC_TEMPLATE = VBoxRcExe
+ tstVMStructRC_DEFS = VBOX_IN_VMM IN_VMM_RC IN_DIS IN_RT_RC VBOX_WITH_RAW_MODE $(VMM_COMMON_DEFS)
+ ifdef VBOX_WITH_R0_LOGGING
+ tstVMStructRC_DEFS += VBOX_WITH_R0_LOGGING
+ endif
+ tstVMStructRC_SOURCES = tstVMStructRC.cpp
+ tstVMStructRC_INCS = \
+ $(VBOX_PATH_VMM_SRC)/include \
+ $(VBOX_PATH_VMM_SRC)/PATM
+endif
+
+tstVMStructSize_TEMPLATE = VBoxR3AutoTest
+ifneq ($(KBUILD_TARGET),win)
+ tstVMStructSize_CXXFLAGS += $(VBOX_GCC_Wno-invalid-offsetof)
+endif
+tstVMStructSize_DEFS = VBOX_IN_VMM IN_VMM_R3 IN_DIS $(VMM_COMMON_DEFS)
+ifdef VBOX_WITH_RAW_MODE
+ tstVMStructSize_DEFS += VBOX_WITH_RAW_MODE
+endif
+tstVMStructSize_INCS = \
+ $(VBOX_PATH_VMM_SRC)/include \
+ $(VBOX_PATH_VMM_SRC)/PATM \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)
+tstVMStructSize_SOURCES = tstVMStructSize.cpp
+ifdef VBOX_WITH_RAW_MODE
+ tstVMStructSize.cpp_DEPS = $(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructRC.h
+endif
+ifdef VBOX_WITH_R0_LOGGING
+ tstVMStructSize_DEFS += VBOX_WITH_R0_LOGGING
+endif
+
+tstAsmStructs_TEMPLATE = VBoxR3AutoTest
+ifneq ($(KBUILD_TARGET),win)
+ tstAsmStructSize_CXXFLAGS += $(VBOX_GCC_Wno-invalid-offsetof)
+endif
+tstAsmStructs_DEFS = VBOX_IN_VMM IN_VMM_R3 IN_DIS $(VMM_COMMON_DEFS)
+ifdef VBOX_WITH_RAW_MODE
+ tstAsmStructs_DEFS += VBOX_WITH_RAW_MODE
+endif
+ifdef VBOX_WITH_R0_LOGGING
+ tstAsmStructs_DEFS += VBOX_WITH_R0_LOGGING
+endif
+tstAsmStructs_INCS = \
+ $(VBOX_PATH_VMM_SRC)/include \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)
+tstAsmStructs_SOURCES = tstAsmStructs.cpp
+tstAsmStructs.cpp_DEPS = $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsHC.h
+
+ifdef VBOX_WITH_RAW_MODE
+ tstAsmStructsRC_TEMPLATE = VBoxRcExe
+ tstAsmStructsRC_DEFS = VBOX_IN_VMM IN_VMM_RC IN_DIS IN_RT_RC VBOX_WITH_RAW_MODE $(VMM_COMMON_DEFS)
+ ifdef VBOX_WITH_R0_LOGGING
+ tstAsmStructsRC_DEFS += VBOX_WITH_R0_LOGGING
+ endif
+ tstAsmStructsRC_INCS = \
+ $(VBOX_PATH_VMM_SRC)/include \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)
+ tstAsmStructsRC_SOURCES = tstAsmStructs.cpp
+ tstAsmStructs.cpp_DEPS += $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsRC.h
+endif # VBOX_WITH_RAW_MODE
+
+
+#
+# Global config tool.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstGlobalConfigHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstGlobalConfigHardened_NAME = tstGlobalConfig
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstGlobalConfigHardened_DEFS = PROGRAM_NAME_STR="tstGlobalConfig"
+ else
+ tstGlobalConfigHardened_DEFS = PROGRAM_NAME_STR=\"tstGlobalConfig\"
+ endif
+ tstGlobalConfigHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplateTestcase.cpp
+ tstGlobalConfig_TEMPLATE = VBoxR3HardenedTstDll
+else
+ tstGlobalConfig_TEMPLATE = VBoxR3TstExe
+endif
+tstGlobalConfig_SOURCES = tstGlobalConfig.cpp
+tstGlobalConfig_LIBS = $(LIB_RUNTIME)
+
+
+#
+# Testcase for checking the C (IEMAllAImplC.cpp) and assembly (IEMAllAImpl.asm)
+# instruction emulation helpers.
+#
+# Note! The IN_TSTVMSTRUCT define is for avoiding IEMInstructionStatisticsTmpl.h.
+#
+TSTIEMAIMPL_TEST_DATA_DEPS = \
+ tstIEMAImplDataSseBinary-addps_u128.bin \
+ tstIEMAImplDataSseBinary-mulps_u128.bin \
+ tstIEMAImplDataSseBinary-subps_u128.bin \
+ tstIEMAImplDataSseBinary-minps_u128.bin \
+ tstIEMAImplDataSseBinary-divps_u128.bin \
+ tstIEMAImplDataSseBinary-maxps_u128.bin \
+ tstIEMAImplDataSseBinary-haddps_u128.bin \
+ tstIEMAImplDataSseBinary-hsubps_u128.bin \
+ tstIEMAImplDataSseBinary-sqrtps_u128.bin \
+ tstIEMAImplDataSseBinary-addsubps_u128.bin \
+ tstIEMAImplDataSseBinary-cvtps2pd_u128.bin \
+ tstIEMAImplDataSseBinary-addpd_u128.bin \
+ tstIEMAImplDataSseBinary-mulpd_u128.bin \
+ tstIEMAImplDataSseBinary-subpd_u128.bin \
+ tstIEMAImplDataSseBinary-minpd_u128.bin \
+ tstIEMAImplDataSseBinary-divpd_u128.bin \
+ tstIEMAImplDataSseBinary-maxpd_u128.bin \
+ tstIEMAImplDataSseBinary-haddpd_u128.bin \
+ tstIEMAImplDataSseBinary-hsubpd_u128.bin \
+ tstIEMAImplDataSseBinary-sqrtpd_u128.bin \
+ tstIEMAImplDataSseBinary-addsubpd_u128.bin \
+ tstIEMAImplDataSseBinary-cvtpd2ps_u128.bin \
+ tstIEMAImplDataSseBinary-addss_u128_r32.bin \
+ tstIEMAImplDataSseBinary-addsd_u128_r64.bin \
+ tstIEMAImplDataSseBinary-mulss_u128_r32.bin \
+ tstIEMAImplDataSseBinary-mulsd_u128_r64.bin \
+ tstIEMAImplDataSseBinary-subss_u128_r32.bin \
+ tstIEMAImplDataSseBinary-subsd_u128_r64.bin \
+ tstIEMAImplDataSseBinary-minss_u128_r32.bin \
+ tstIEMAImplDataSseBinary-minsd_u128_r64.bin \
+ tstIEMAImplDataSseBinary-divss_u128_r32.bin \
+ tstIEMAImplDataSseBinary-divsd_u128_r64.bin \
+ tstIEMAImplDataSseBinary-maxss_u128_r32.bin \
+ tstIEMAImplDataSseBinary-maxsd_u128_r64.bin \
+ tstIEMAImplDataSseBinary-cvtss2sd_u128_r32.bin \
+ tstIEMAImplDataSseBinary-cvtsd2ss_u128_r64.bin \
+ tstIEMAImplDataSseBinary-sqrtss_u128_r32.bin \
+ tstIEMAImplDataSseBinary-sqrtsd_u128_r64.bin \
+ tstIEMAImplDataSseBinary-cvttsd2si_i32_r64.bin \
+ tstIEMAImplDataSseBinary-cvtsd2si_i32_r64.bin \
+ tstIEMAImplDataSseBinary-cvttsd2si_i64_r64.bin \
+ tstIEMAImplDataSseBinary-cvtsd2si_i64_r64.bin \
+ tstIEMAImplDataSseBinary-cvttss2si_i32_r32.bin \
+ tstIEMAImplDataSseBinary-cvtss2si_i32_r32.bin \
+ tstIEMAImplDataSseBinary-cvttss2si_i64_r32.bin \
+ tstIEMAImplDataSseBinary-cvtss2si_i64_r32.bin \
+ tstIEMAImplDataSseBinary-cvtsi2ss_r32_i32.bin \
+ tstIEMAImplDataSseBinary-cvtsi2ss_r32_i64.bin \
+ tstIEMAImplDataSseBinary-cvtsi2sd_r64_i32.bin \
+ tstIEMAImplDataSseBinary-cvtsi2sd_r64_i64.bin \
+ tstIEMAImplDataSseCompare-ucomiss_u128.bin \
+ tstIEMAImplDataSseCompare-vucomiss_u128.bin \
+ tstIEMAImplDataSseCompare-comiss_u128.bin \
+ tstIEMAImplDataSseCompare-vcomiss_u128.bin \
+ tstIEMAImplDataSseCompare-ucomisd_u128.bin \
+ tstIEMAImplDataSseCompare-vucomisd_u128.bin \
+ tstIEMAImplDataSseCompare-comisd_u128.bin \
+ tstIEMAImplDataSseCompare-vcomisd_u128.bin \
+ tstIEMAImplDataSseCompare-cmpps_u128.bin \
+ tstIEMAImplDataSseCompare-cmpss_u128.bin \
+ tstIEMAImplDataSseCompare-cmppd_u128.bin \
+ tstIEMAImplDataSseCompare-cmpsd_u128.bin \
+ tstIEMAImplDataSseConvert-cvtdq2ps_u128.bin \
+ tstIEMAImplDataSseConvert-cvtps2dq_u128.bin \
+ tstIEMAImplDataSseConvert-cvttps2dq_u128.bin \
+ tstIEMAImplDataSseConvert-cvtdq2pd_u128.bin \
+ tstIEMAImplDataSseConvert-cvtpd2dq_u128.bin \
+ tstIEMAImplDataSseConvert-cvttpd2dq_u128.bin \
+ tstIEMAImplDataSseConvert-cvtpd2pi_u128.bin \
+ tstIEMAImplDataSseConvert-cvttpd2pi_u128.bin \
+ tstIEMAImplDataSseConvert-cvtpi2ps_u128.bin \
+ tstIEMAImplDataSseConvert-cvtpi2pd_u128.bin \
+ tstIEMAImplDataSseConvert-cvtps2pi_u128.bin \
+ tstIEMAImplDataSseConvert-cvttps2pi_u128.bin
+
+tstIEMAImpl_TEMPLATE = VBoxR3TstExe
+tstIEMAImpl_DEFS = $(VMM_COMMON_DEFS) IEM_WITHOUT_ASSEMBLY IN_TSTVMSTRUCT
+tstIEMAImpl_SDKS = VBoxSoftFloatR3Shared
+tstIEMAImpl_INCS = ../include .
+tstIEMAImpl_CLEAN = \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataInt.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataInt-Amd.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataInt-Intel.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuLdSt.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuLdSt-Amd.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuLdSt-Intel.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuBinary1.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuBinary1-Amd.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuBinary1-Intel.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuBinary2.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuOther.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuOther-Amd.cpp \
+ $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuOther-Intel.cpp
+tstIEMAImpl_SOURCES = \
+ tstIEMAImpl.cpp \
+ ../VMMAll/IEMAllAImplC.cpp \
+ $(tstIEMAImpl_CLEAN)
+tstIEMAImpl_SOURCES.x86 += tstIEMAImplDataSseBinary.asm
+tstIEMAImpl_SOURCES.amd64 += tstIEMAImplDataSseBinary.asm
+tstIEMAImplDataSseBinary.asm_DEPS = \
+ $(TSTIEMAIMPL_TEST_DATA_DEPS)
+
+tstIEMAImpl_SOURCES.arm64 += tstIEMAImplDataSseBinary.S
+tstIEMAImplDataSseBinary.S_DEPS = \
+ $(TSTIEMAIMPL_TEST_DATA_DEPS)
+$(call KB_FN_DO_PASS0_ON_TARGET,tstIEMAImpl)
+
+# This variant mainly for generating data.
+tstIEMAImplAsm_TEMPLATE := VBoxR3TstExe
+tstIEMAImplAsm_SDKS := VBoxSoftFloatR3Shared
+tstIEMAImplAsm_DEFS = $(VMM_COMMON_DEFS) IEM_WITH_ASSEMBLY IN_TSTVMSTRUCT TSTIEMAIMPL_WITH_GENERATOR
+tstIEMAImplAsm_ASFLAGS.amd64 := -Werror
+tstIEMAImplAsm_ASFLAGS.x86 := -Werror
+tstIEMAImplAsm_INCS := ../include .
+tstIEMAImplAsm_SOURCES = \
+ tstIEMAImpl.cpp \
+ ../VMMAll/IEMAllAImpl.asm \
+ ../VMMAll/IEMAllAImplC.cpp \
+ $(tstIEMAImpl_CLEAN)
+tstIEMAImplAsm_SOURCES.x86 += tstIEMAImplDataSseBinary.asm
+tstIEMAImplAsm_SOURCES.amd64 += tstIEMAImplDataSseBinary.asm
+tstIEMAImplDataSseBinary.asm_DEPS = \
+ $(TSTIEMAIMPL_TEST_DATA_DEPS)
+
+tstIEMAImplAsm_SOURCES.arm64 += tstIEMAImplDataSseBinary.S
+tstIEMAImplDataSseBinary.S_DEPS = \
+ $(TSTIEMAIMPL_TEST_DATA_DEPS)
+
+## @param 1 The sub-name of the file in question.
+define def_tstIEMAImplData_adjust
+ $$(tstIEMAImpl_0_OUTDIR)/tstIEMAImplData$(1).cpp: \
+ $$(tstIEMAImpl_DEFPATH)/tstIEMAImplData$(1).cpp \
+ $$(tstIEMAImpl_DEFPATH)/tstIEMAImplData.sh \
+ $$(tstIEMAImpl_DEFPATH)/tstIEMAImpl.h \
+ | $$(tstIEMAImpl_0_OUTDIR)/
+ $$(ASH) "$$(tstIEMAImpl_DEFPATH)/tstIEMAImplData.sh" \
+ "$$(CP_EXT)" \
+ "$$(MV_EXT)" \
+ "$$(SED_EXT)" \
+ "$$(APPEND_EXT)" \
+ "$$(tstIEMAImpl_0_OUTDIR)" \
+ "$$(tstIEMAImpl_DEFPATH)" \
+ "$(1)"
+endef
+$(evalcall2 def_tstIEMAImplData_adjust,Int)
+$(evalcall2 def_tstIEMAImplData_adjust,Int-Amd)
+$(evalcall2 def_tstIEMAImplData_adjust,Int-Intel)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuLdSt)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuLdSt-Amd)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuLdSt-Intel)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuBinary1)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuBinary1-Amd)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuBinary1-Intel)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuBinary2)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuOther)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuOther-Amd)
+$(evalcall2 def_tstIEMAImplData_adjust,FpuOther-Intel)
+
+
+#
+# Testcase for checking the repurposing of the IEM instruction code.
+#
+tstIEMCheckMc_TEMPLATE = VBoxR3TstExe
+tstIEMCheckMc_SOURCES = tstIEMCheckMc.cpp
+tstIEMCheckMc_DEFS = $(VMM_COMMON_DEFS)
+tstIEMCheckMc_LIBS = $(LIB_RUNTIME)
+ifeq ($(KBUILD_TARGET),win)
+ tstIEMCheckMc_CXXFLAGS = $(VBOX_C_CXX_FLAGS_NO_UNUSED_PARAMETERS) -wd4189 # local variable is initialized but not used.
+else
+ tstIEMCheckMc_CXXFLAGS = $(VBOX_C_CXX_FLAGS_NO_UNUSED_PARAMETERS) -Wno-unused-value -Wno-unused-variable
+endif
+
+#
+# Saved state manager testcase.
+#
+tstSSM_TEMPLATE = VBoxR3TstExe
+tstSSM_INCS = $(VBOX_PATH_VMM_SRC)/include
+tstSSM_DEFS = $(VMM_COMMON_DEFS)
+tstSSM_SOURCES = tstSSM.cpp
+tstSSM_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+#
+# VMM configuration manager tests.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstCFGMHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstCFGMHardened_NAME = tstCFGM
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstCFGMHardened_DEFS = PROGRAM_NAME_STR="tstCFGM"
+ else
+ tstCFGMHardened_DEFS = PROGRAM_NAME_STR=\"tstCFGM\"
+ endif
+ tstCFGMHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplateTestcase.cpp
+ tstCFGM_TEMPLATE = VBoxR3HardenedTstDll
+else
+ tstCFGM_TEMPLATE = VBoxR3TstExe
+endif
+tstCFGM_DEFS = $(VMM_COMMON_DEFS)
+tstCFGM_SOURCES = tstCFGM.cpp
+tstCFGM_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+#
+# Comparing some compression algorithms considered for SSM usage.
+#
+tstCompressionBenchmark_TEMPLATE = VBoxR3TstExe
+tstCompressionBenchmark_SOURCES = tstCompressionBenchmark.cpp
+
+#
+# Two testcases for checking the ring-0 setjmp/longjmp code.
+#
+tstVMMR0CallHost-1_TEMPLATE = VBoxR3TstExe
+tstVMMR0CallHost-1_INCS = $(VBOX_PATH_VMM_SRC)/include
+tstVMMR0CallHost-1_SOURCES = \
+ tstVMMR0CallHost-1.cpp
+tstVMMR0CallHost-1_SOURCES.amd64 = \
+ $(VBOX_PATH_VMM_SRC)/VMMR0/VMMR0JmpA-amd64.asm
+tstVMMR0CallHost-1_SOURCES.x86 = \
+ $(VBOX_PATH_VMM_SRC)/VMMR0/VMMR0JmpA-x86.asm
+
+
+#
+# For testing the VM request queue code.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstVMREQHardened_TEMPLATE = VBoxR3HardenedExe
+ tstVMREQHardened_NAME = tstVMREQ
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstVMREQHardened_DEFS = PROGRAM_NAME_STR="tstVMREQ"
+ else
+ tstVMREQHardened_DEFS = PROGRAM_NAME_STR=\"tstVMREQ\"
+ endif
+ tstVMREQHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstVMREQ_TEMPLATE = VBoxR3Dll
+else
+ tstVMREQ_TEMPLATE = VBoxR3Exe
+endif
+tstVMREQ_DEFS = $(VMM_COMMON_DEFS)
+tstVMREQ_SOURCES = tstVMREQ.cpp
+tstVMREQ_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+#
+# Tool for reanimate things like OS/2 dumps.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstAnimateHardened_TEMPLATE = VBoxR3HardenedExe
+ tstAnimateHardened_NAME = tstAnimate
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstAnimateHardened_DEFS = PROGRAM_NAME_STR="tstAnimate"
+ else
+ tstAnimateHardened_DEFS = PROGRAM_NAME_STR=\"tstAnimate\"
+ endif
+ tstAnimateHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstAnimate_TEMPLATE = VBoxR3Dll
+else
+ tstAnimate_TEMPLATE = VBoxR3Exe
+endif
+tstAnimate_DEFS = $(VMM_COMMON_DEFS)
+tstAnimate_SOURCES = tstAnimate.cpp
+tstAnimate_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+tstX86-1_TEMPLATE = VBoxR3TstExe
+tstX86-1_SOURCES = tstX86-1.cpp tstX86-1A.asm
+tstX86-1_LIBS = $(LIB_RUNTIME)
+tstX86-1_LDFLAGS.linux = $(VBOX_GCC_no-pie)
+
+tstX86-FpuSaveRestore_TEMPLATE = VBoxR3TstExe
+tstX86-FpuSaveRestore_SOURCES = tstX86-FpuSaveRestore.cpp tstX86-FpuSaveRestoreA.asm
+tstX86-FpuSaveRestore_LIBS = $(LIB_RUNTIME)
+
+ifdef VBOX_WITH_RAW_MODE
+
+ #
+ # Raw-mode VMM testcase.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstVMMHardened_TEMPLATE = VBoxR3HardenedExe
+ tstVMMHardened_NAME = tstVMM
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstVMMHardened_DEFS = PROGRAM_NAME_STR="tstVMM"
+ else
+ tstVMMHardened_DEFS = PROGRAM_NAME_STR=\"tstVMM\"
+ endif
+ tstVMMHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstVMM_TEMPLATE = VBoxR3Dll
+ else
+ tstVMM_TEMPLATE = VBoxR3Exe
+ endif
+ tstVMM_SOURCES = tstVMM.cpp
+ tstVMM_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+ #
+ # HM VMM testcase.
+ #
+ tstVMM-HM_TEMPLATE = VBoxR3Exe
+ tstVMM-HM_SOURCES = tstVMM-HM.cpp
+ tstVMM-HM_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+ #
+ # VMM host process fork test case (memory ++).
+ #
+ tstVMMFork_TEMPLATE = VBoxR3Exe
+ tstVMMFork_SOURCES = tstVMMFork.cpp
+ tstVMMFork_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+ #
+ # Raw-mode micro benchmark.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstMicroHardened_TEMPLATE = VBoxR3HardenedExe
+ tstMicroHardened_NAME = tstMicro
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstMicroHardened_DEFS = PROGRAM_NAME_STR="tstMicro"
+ else
+ tstMicroHardened_DEFS = PROGRAM_NAME_STR=\"tstMicro\"
+ endif
+ tstMicroHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstMicro_TEMPLATE = VBoxR3Dll
+ else
+ tstMicro_TEMPLATE = VBoxR3Exe
+ endif
+ tstMicro_SOURCES = tstMicro.cpp
+ tstMicro_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+ tstMicro_DEFS = $(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,)
+
+ tstMicroRC_TEMPLATE = VBoxRc
+ tstMicroRC_SOURCES = tstMicroRC.cpp tstMicroRCA.asm
+ tstMicroRC_DEFS = $(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,)
+ tstMicroRC_INCS = $(VBOX_PATH_VMM_SRC)/testcase
+ ifeq ($(VBOX_LDR_FMT32),pe)
+ tstMicroRC_LDFLAGS = -Entry:tstMicroRC
+ endif
+ tstMicroRC_SYSSUFF = .gc
+ tstMicroRC_LIBS = \
+ $(PATH_STAGE_LIB)/DisasmRC$(VBOX_SUFF_LIB) \
+ $(PATH_STAGE_LIB)/RuntimeRC$(VBOX_SUFF_LIB)
+ ifeq ($(filter-out pe lx,$(VBOX_LDR_FMT32)),)
+ tstMicroRC_LIBS += \
+ $(PATH_STAGE_LIB)/VMMRCBuiltin$(VBOX_SUFF_LIB) \
+ $(LIB_VMMRC)
+ endif
+ tstMicroRC_SOURCES.win = tstMicroRC.def
+
+endif # VBOX_WITH_RAW_MODE
+
+
+if !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS)
+ #
+ # Special NEM host testcase.
+ #
+ if ("$(KBUILD_TARGET_ARCH).$(KBUILD_TARGET_ARCH)" == "darwin.amd64" && (defined(VBOX_WITH_NATIVE_NEM) || "$(USERNAME)" == "bird")) \
+ || ("$(KBUILD_TARGET_ARCH).$(KBUILD_TARGET_ARCH)" == "linux.amd64" && (defined(VBOX_WITH_NATIVE_NEM) || "$(USERNAME)" == "bird")) \
+ || ("$(KBUILD_TARGET_ARCH).$(KBUILD_TARGET_ARCH)" == "win.amd64" && defined(VBOX_WITH_NATIVE_NEM))
+ PROGRAMS += NemRawBench-1
+ NemRawBench-1_TEMPLATE = VBoxR3Static
+ NemRawBench-1_SOURCES = NemRawBench-1.cpp
+ NemRawBench-1_BLD_TYPE = release
+ NemRawBench-1_INCS.win = \
+ $(KBUILD_DEVTOOLS)/win.x86/sdk/v10.0.17134.0/include/10.0.17134.0/um \
+ $(KBUILD_DEVTOOLS)/win.x86/sdk/v10.0.17134.0/include/10.0.17134.0/shared
+ NemRawBench-1_CXXFLAGS.darwin = \
+ -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform//Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks
+ #NemRawBench-1_LDFLAGS.darwin = \
+# -F/System/Library/Frameworks \
+# -framework Hypervisor
+ NemRawBench-1_LDFLAGS.darwin = \
+ /System/Library/Frameworks/Hypervisor.framework/Hypervisor
+ endif
+endif
+
+#
+# PDM Queue tests.
+#
+tstPDMQueue_TEMPLATE := VBoxR3Exe
+tstPDMQueue_DEFS = $(VMM_COMMON_DEFS)
+tstPDMQueue_SOURCES := tstPDMQueue.cpp
+tstPDMQueue_LIBS := $(LIB_VMM) $(LIB_RUNTIME)
+
+
+ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
+ #
+ # PDM asynchronous completation test.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstPDMAsyncCompletionHardened_TEMPLATE = VBoxR3HardenedExe
+ tstPDMAsyncCompletionHardened_NAME = tstPDMAsyncCompletion
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstPDMAsyncCompletionHardened_DEFS = PROGRAM_NAME_STR="tstPDMAsyncCompletion"
+ else
+ tstPDMAsyncCompletionHardened_DEFS = PROGRAM_NAME_STR=\"tstPDMAsyncCompletion\"
+ endif
+ tstPDMAsyncCompletionHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstPDMAsyncCompletion_TEMPLATE = VBoxR3Dll
+ else
+ tstPDMAsyncCompletion_TEMPLATE = VBoxR3Exe
+ endif
+ tstPDMAsyncCompletion_DEFS = $(VMM_COMMON_DEFS)
+ tstPDMAsyncCompletion_INCS = $(VBOX_PATH_VMM_SRC)/include
+ tstPDMAsyncCompletion_SOURCES = tstPDMAsyncCompletion.cpp
+ tstPDMAsyncCompletion_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+
+ #
+ # PDM asynchronous completation stress test.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstPDMAsyncCompletionStressHardened_TEMPLATE = VBoxR3HardenedExe
+ tstPDMAsyncCompletionStressHardened_NAME = tstPDMAsyncCompletionStress
+ ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
+ tstPDMAsyncCompletionStressHardened_DEFS = PROGRAM_NAME_STR="tstPDMAsyncCompletionStress"
+ else
+ tstPDMAsyncCompletionStressHardened_DEFS = PROGRAM_NAME_STR=\"tstPDMAsyncCompletionStress\"
+ endif
+ tstPDMAsyncCompletionStressHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstPDMAsyncCompletionStress_TEMPLATE = VBoxR3Dll
+ else
+ tstPDMAsyncCompletionStress_TEMPLATE = VBoxR3Exe
+ endif
+ tstPDMAsyncCompletionStress_DEFS = $(VMM_COMMON_DEFS)
+ tstPDMAsyncCompletionStress_INCS = $(VBOX_PATH_VMM_SRC)/include
+ tstPDMAsyncCompletionStress_SOURCES = tstPDMAsyncCompletionStress.cpp
+ tstPDMAsyncCompletionStress_LIBS = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
+endif
+
+ifndef VBOX_ONLY_EXTPACKS
+ PROGRAMS += tstSSM-2
+ tstSSM-2_TEMPLATE = VBoxR3TstExe
+ tstSSM-2_DEFS = IN_VMM_STATIC
+ tstSSM-2_SOURCES = tstSSM-2.cpp
+ tstSSM-2_LIBS = $(PATH_STAGE_LIB)/SSMStandalone$(VBOX_SUFF_LIB)
+endif
+
+#
+# Generate VM structure tests.
+#
+if !defined(VBOX_ONLY_EXTPACKS) \
+ && ( defined(VBOX_WITH_DTRACE_R3) \
+ || defined(VBOX_WITH_DTRACE_R0) \
+ || defined(VBOX_WITH_DTRACE_RC))
+ tstVMStructDTrace_TEMPLATE = VBoxR3AutoTest
+ tstVMStructDTrace_DEFS = VBOX_IN_VMM IN_VMM_R3 IN_DIS $(VMM_COMMON_DEFS)
+ ifdef VBOX_WITH_RAW_MODE
+ tstVMStructDTrace_DEFS += VBOX_WITH_RAW_MODE
+ endif
+ tstVMStructDTrace_INCS = \
+ $(VBOX_PATH_VMM_SRC)/include \
+ $(VBOX_PATH_VMM_SRC)/PATM \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)
+ tstVMStructDTrace_SOURCES = tstVMStructDTrace.cpp
+ ifdef VBOX_WITH_R0_LOGGING
+ tstVMStructDTrace_DEFS += VBOX_WITH_R0_LOGGING
+ endif
+
+
+ VMMLibDTraceStructTest_INST = $(VBOX_INST_DTRACE_TST)$(KBUILD_TARGET_ARCH)/
+ VMMLibDTraceStructTest_SOURCES = \
+ $(tstVMStructDTrace_0_OUTDIR)/vbox-vm-struct-test.d
+ VMMLibDTraceStructTest_CLEAN = \
+ $(tstVMStructDTrace_0_OUTDIR)/vbox-vm-struct-test.d
+
+ $$(tstVMStructDTrace_0_OUTDIR)/vbox-vm-struct-test.d: \
+ $$(tstVMStructDTrace_1_STAGE_TARGET) | $$(dir $$@)
+ $(QUIET)$(RM) -f $@
+ $< > $@
+
+endif
+
+
+include $(FILE_KBUILD_SUB_FOOTER)
+
+
+#
+# Some handcrafted support targets for tstAsmStructs.
+#
+MY_ASA_ASM_STUFF = \
+ $(addprefix -D, \
+ $(DEFS) \
+ $(DEFS.$(KBUILD_TYPE)) \
+ $(DEFS.$(KBUILD_TARGET)) \
+ IN_RING3 $(ARCH_BITS_DEFS) \
+ $(DEFS.$(KBUILD_TARGET_ARCH)) \
+ $(DEFS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
+ $(VMM_COMMON_DEFS) \
+ ) \
+ -f $(if $(eq $(KBUILD_TARGET),darwin),macho,elf) \
+ $(foreach inc,$(INCS) $(VBOX_PATH_VMM_SRC)/testcase $(VBOX_PATH_VMM_SRC)/include $(VBOX_VMM_TESTCASE_OUT_DIR) \
+ ,-I$(inc)/)
+
+# 1a. make a header file which makes all the structures+members globals.
+$(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.mac: \
+ $(VBOX_PATH_VMM_SRC)/testcase/tstAsmStructsAsm.asm \
+ $(VBOX_PATH_VMM_SRC)/testcase/tstAsmStructsAsm-lst.sed \
+ $(DEPTH)/include/iprt/asmdefs.mac \
+ $(DEPTH)/include/VBox/vmm/cpum.mac \
+ $(DEPTH)/include/VBox/vmm/vm.mac \
+ $(DEPTH)/include/VBox/vmm/gvm.mac \
+ $(DEPTH)/include/VBox/sup.mac \
+ $(DEPTH)/include/iprt/x86.mac \
+ $(VBOX_PATH_VMM_SRC)/include/CPUMInternal.mac \
+ $(VBOX_PATH_VMM_SRC)/include/HMInternal.mac \
+ $(VBOX_PATH_VMM_SRC)/include/VMMInternal.mac \
+ $(VBOX_PATH_VMM_SRC)/testcase/Makefile.kmk \
+ $(PATH_ROOT)/Config.kmk $(LOCALCFG) $(AUTOCFG) \
+ | $$(dir $$@)
+ $(call MSG_GENERATE,tstVMStructSize,$@,$<)
+ifndef DONT_USE_YASM
+ $(QUIET)$(TOOL_YASM_AS) $(MY_ASA_ASM_STUFF) -o $@.o -l $@.lst $<
+ $(SED) -f $(VBOX_PATH_VMM_SRC)/testcase/tstAsmStructsAsm-lst.sed --output $@ $@.lst
+else
+ $(QUIET)$(TOOL_NASM_AS) -g $(MY_ASA_ASM_STUFF) -o $@.o -l $@.lst $<
+ $(VBOX_NM) $@.o | $(SED) \
+ -e '/[0-9a-fA-F][0-9a-fA-F]* [^a] /d' \
+ -e 's/[0-9a-fA-F][0-9a-fA-F]* a \([^ ]*\)/global \1/' \
+ > $@
+endif
+
+# 1b. make an elf/macho object containing the offsets.
+includedep $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.o.dep
+$(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.o: \
+ $(VBOX_PATH_VMM_SRC)/testcase/tstAsmStructsAsm.asm \
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.mac \
+ $(DEPTH)/include/iprt/asmdefs.mac \
+ $(DEPTH)/include/VBox/vmm/cpum.mac \
+ $(DEPTH)/include/VBox/vmm/hm_vmx.mac \
+ $(DEPTH)/include/VBox/vmm/stam.mac \
+ $(DEPTH)/include/VBox/vmm/vm.mac \
+ $(DEPTH)/include/VBox/sup.mac \
+ $(DEPTH)/include/iprt/x86.mac \
+ $(VBOX_PATH_VMM_SRC)/include/CPUMInternal.mac \
+ $(VBOX_PATH_VMM_SRC)/include/HMInternal.mac \
+ $(VBOX_PATH_VMM_SRC)/include/VMMInternal.mac \
+ $(VBOX_PATH_VMM_SRC)/testcase/Makefile.kmk \
+ $$(if $$(eq $$(tstAsmStructsAsmDep_STUFF),$$(MY_ASA_ASM_STUFF)),,FORCE) \
+ | $$(dir $$@)
+ $(call MSG_COMPILE,tstAsmStructsasm,$<,$@,AS)
+ifndef DONT_USE_YASM
+ $(QUIET)$(TOOL_YASM_AS) $(MY_ASA_ASM_STUFF) -DDO_GLOBALS -o $@ $<
+else
+ $(QUIET)$(TOOL_NASM_AS) $(MY_ASA_ASM_STUFF) -DDO_GLOBALS -o $@ $<
+endif
+ %$(QUIET2)$(RM) -f -- $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.o.dep
+ %$(QUIET2)$(APPEND) '$(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.o.dep' 'tstAsmStructsAsmDep_STUFF=$(MY_ASA_ASM_STUFF)'
+
+# 2. use nm and sed to transform this into the header we want.
+$(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsHC.h: $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsAsm.o
+ $(call MSG_GENERATE,tstVMStructSize,$@,$<)
+ $(QUIET)$(RM) -f $@ $@.dump $@.tmp
+ $(QUIET)$(REDIRECT) -wo $@.dump -- $(VBOX_NM) $<
+ $(QUIET)$(SED) \
+ -e '/STAMPROFILEADV/d' \
+ \
+ -e '/^\(0x\)\{0,1\}00[0-9a-fA-F]* [aAnN] [^_.]*\./!d' \
+ -e 's/^\(0x\)\{0,1\}\(00[0-9a-fA-F]*\) [aAnN] \([^.]*\)\.\(.*$$\)/ CHECK_OFF(\3, 0x0\2, \4);/' \
+ --output $@.tmp $@.dump
+ $(QUIET)$(SED) \
+ -e '/VM_size$$/d' \
+ -e '/VMCPU_size$$/d' \
+ -e '/VMMCPU_size$$/d' \
+ -e '/SUPDRVTRACERUSRCTX32_size$$/d' \
+ -e '/HMCPU_size$$/d' \
+ \
+ -e '/^\(0x\)\{0,1\}00[0-9a-fA-F]* [aAnN] [^_.]*_size$$/!d' \
+ -e 's/^\(0x\)\{0,1\}\(00[0-9a-fA-F]*\) [aAnN] \([^_.]*\)_size/ CHECK_SIZE(\3, 0x0\2);/' \
+ --append $@.tmp $@.dump
+ $(QUIET)$(MV) -f $@.tmp $@
+ $(QUIET)$(RM) -f $@.dump
+
+# 3. run it.
+$(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructs.run: \
+ $$(tstAsmStructs_1_STAGE_TARGET) \
+ $(if-expr defined(VBOX_WITH_RAW_MODE),$$(tstAsmStructsRC_1_STAGE_TARGET),)
+ $(QUIET)$(RM) -f $@
+ $(tstAsmStructs_1_STAGE_TARGET)
+ifdef VBOX_WITH_RAW_MODE
+ $(tstAsmStructsRC_1_STAGE_TARGET)
+endif
+ $(QUIET)$(APPEND) "$@" "done"
+
+
+
+#
+# Run rule for tstVMStructSize.
+#
+
+ifdef VBOX_WITH_RAW_MODE
+ # 1. Manually dump selected structures and members.
+ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructRC.h: $$(tstVMStructRC_1_STAGE_TARGET) | $$(dir $$@)
+ $(call MSG_GENERATE,tstVMStructSize,$@)
+ $(QUIET)$(REDIRECT) -wo $@ -- $<
+endif # VBOX_WITH_RAW_MODE
+
+# 2. run it.
+$(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructSize.run: $$(tstVMStructSize_1_STAGE_TARGET) | $$(dir $$@)
+ $(QUIET)$(RM) -f $@
+ $<
+ $(QUIET)$(APPEND) "$@" "done"
+
+# alias for the two struct tests.
+run-struct-tests: $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructs.run $(VBOX_VMM_TESTCASE_OUT_DIR)/tstVMStructSize.run
+