summaryrefslogtreecommitdiffstats
path: root/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm')
-rw-r--r--src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm283
1 files changed, 283 insertions, 0 deletions
diff --git a/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm b/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm
new file mode 100644
index 00000000..ac7c250e
--- /dev/null
+++ b/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm
@@ -0,0 +1,283 @@
+; $Id: bs3-cpu-basic-2-asm.asm $
+;; @file
+; BS3Kit - bs3-cpu-basic-2
+;
+
+;
+; 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.mac"
+
+
+;*********************************************************************************************************************************
+;* Global Variables *
+;*********************************************************************************************************************************
+BS3_BEGIN_DATA16
+BS3_GLOBAL_DATA g_bs3CpuBasic2_ud2_FlatAddr, 4
+ dd _bs3CpuBasic2_ud2 wrt FLAT
+
+
+
+;
+; CPU mode agnostic test code snippets.
+;
+BS3_BEGIN_TEXT16
+
+BS3_PROC_BEGIN _bs3CpuBasic2_ud2
+.again:
+ ud2
+ jmp .again
+BS3_PROC_END _bs3CpuBasic2_ud2
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_salc_ud2
+ salc ; #UD in 64-bit mode
+.again:
+ ud2
+ jmp .again
+BS3_PROC_END _bs3CpuBasic2_salc_ud2
+
+BS3_PROC_BEGIN _bs3CpuBasic2_swapgs
+.again:
+ db 00fh, 001h, 0f8h ; swapgs - #UD when not in 64-bit mode.
+ jmp .again
+BS3_PROC_END _bs3CpuBasic2_swapgs
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_Int80
+ int 80h
+.again: ud2
+ jmp .again
+BS3_PROC_END _bs3CpuBasic2_Int80
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_Int81
+ int 81h
+.again: ud2
+ jmp .again
+BS3_PROC_END _bs3CpuBasic2_Int81
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_Int82
+ int 82h
+.again: ud2
+ jmp .again
+BS3_PROC_END _bs3CpuBasic2_Int82
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_Int83
+ int 83h
+.again: ud2
+ jmp .again
+BS3_PROC_END _bs3CpuBasic2_Int83
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_iret
+ iret
+BS3_PROC_END _bs3CpuBasic2_iret
+AssertCompile(_bs3CpuBasic2_iret_EndProc - _bs3CpuBasic2_iret == 1)
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_iret_opsize
+ iretd
+BS3_PROC_END _bs3CpuBasic2_iret_opsize
+AssertCompile(_bs3CpuBasic2_iret_opsize_EndProc - _bs3CpuBasic2_iret_opsize == 2)
+
+
+BS3_PROC_BEGIN _bs3CpuBasic2_iret_rexw
+ BS3_SET_BITS 64
+ iretq
+ BS3_SET_BITS 16
+BS3_PROC_END _bs3CpuBasic2_iret_rexw
+AssertCompile(_bs3CpuBasic2_iret_rexw_EndProc - _bs3CpuBasic2_iret_rexw == 2)
+
+
+;
+; CPU mode agnostic test code snippets.
+;
+BS3_BEGIN_TEXT32
+
+;;
+; @param [xBP + xCB*2] puDst
+; @param [xBP + xCB*3] uNewValue
+BS3_PROC_BEGIN_CMN bs3CpuBasic2_Store_mov, BS3_PBC_NEAR
+ push xBP
+ mov xBP, xSP
+ mov xCX, [xBP + xCB*2]
+ mov xAX, [xBP + xCB*3]
+ mov [xCX], xAX
+ leave
+ ret
+BS3_PROC_END_CMN bs3CpuBasic2_Store_mov
+
+;;
+; @param [xBP + xCB*2] puDst
+; @param [xBP + xCB*3] uNewValue
+BS3_PROC_BEGIN_CMN bs3CpuBasic2_Store_xchg, BS3_PBC_NEAR
+ push xBP
+ mov xBP, xSP
+ mov xCX, [xBP + xCB*2]
+ mov xAX, [xBP + xCB*3]
+ xchg [xCX], xAX
+ leave
+ ret
+BS3_PROC_END_CMN bs3CpuBasic2_Store_xchg
+
+;;
+; @param [xBP + xCB*2] puDst
+; @param [xBP + xCB*3] uNewValue
+; @param [xBP + xCB*4] uOldValue
+BS3_PROC_BEGIN_CMN bs3CpuBasic2_Store_cmpxchg, BS3_PBC_NEAR
+ push xBP
+ mov xBP, xSP
+ mov xCX, [xBP + xCB*2]
+ mov xDX, [xBP + xCB*3]
+ mov xAX, [xBP + xCB*4]
+.again:
+ cmpxchg [xCX], xDX
+ jnz .again
+ leave
+ ret
+BS3_PROC_END_CMN bs3CpuBasic2_Store_cmpxchg
+
+
+;
+; Jump code segment 64KB.
+;
+; There is no ORG directive in OMF mode of course. :-(
+;
+section BS3JMPTEXT16 align=16 CLASS=BS3CLASS16JMPCODE PRIVATE USE16
+ GROUP BS3GROUPJMPTEXT16 BS3JMPTEXT16
+ BS3_SET_BITS 16
+
+; 0000: Start with two int3 filler instructions.
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmptext16_start), function, 2
+ int3
+ int3
+
+; 0002: This is the target for forward wrap around jumps, should they succeed.
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_target_wrap_forward), function, 2
+ ud2
+ align 8, int3
+
+; 0008
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_wrap_backward__ud2), function, 2
+ db 0ebh, -012h ; jmp (0x0008 + 2 - 0x12 = 0xFFFFFFF8 (-8))
+ int3
+
+; 000b
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_opsize_wrap_backward__ud2), function, 3
+ db 066h, 0ebh, -016h ; jmp (0x000b + 3 - 0x16 = 0xFFFFFFF8 (-8))
+ int3
+
+ align 0x80, int3
+; 0080
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_wrap_backward__ud2), function, 3
+ db 0e9h ; jmp (0x0080 + 3 - 0x8b = 0xFFFFFFF8 (-8))
+ dw -08bh
+ int3
+
+; 0084
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2), function, 6
+ db 066h, 0e9h ; jmp (0x0084 + 6 - 0x92 = 0xFFFFFFF8 (-8))
+ dd -092h
+ int3
+
+; 008b
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_wrap_backward__ud2), function, 3
+ db 0e8h ; call (0x008b + 3 - 0x96)
+ dw -096h
+ int3
+
+; 008f
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_opsize_wrap_backward__ud2), function, 6
+ db 066h, 0e8h ; call (0x008f + 6 - 0x9d = 0xFFFFFFF8 (-8))
+ dd -09dh
+ int3
+
+
+ align 0x100, int3 ; Note! Doesn't work correctly for higher values.
+ times (0xff6b - 0x100) int3
+
+; ff6b
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_wrap_forward__ud2), function, 4
+ db 0e8h ; call (0xff6b+3 + 0x94 = 0x10002 (65538))
+ dw 094h
+ int3
+
+; ff6f
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_opsize_wrap_forward__ud2), function, 7
+ db 066h, 0e8h ; o32 call (0xff6f+6 + 0x8d = 0x10002 (65538))
+ dd 08dh
+ int3
+
+; ff76
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_wrap_forward__ud2), function, 5
+ db 0e9h ; jmp (0xff76+4 + 0x88 = 0x10002 (65538))
+ dw 089h
+ int3
+
+; ff7a
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_opsize_wrap_forward__ud2), function, 7
+ db 066h, 0e9h ; o32 jmp (0xff7a+6 + 0x82 = 0x10002 (65538))
+ dd 082h
+ int3
+
+; ff81
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_wrap_forward__ud2), function, 2
+ db 0ebh, 07fh ; jmp (0xff81+2 + 0x7f = 0x10002 (65538))
+ int3
+
+; ff84
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_opsize_wrap_forward__ud2), function, 3
+ db 066h, 0ebh, 07bh ; o32 jmp (0xff84+3 + 0x7b = 0x10002 (65538))
+; ff87
+
+ times (0xfff8 - 0xff87) int3
+
+; fff8: This is the target for backward wrap around jumps, should they succeed.
+BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_target_wrap_backward), function, 2
+ ud2
+ times 6 int3
+; End of segment.
+
+BS3_BEGIN_TEXT16
+
+;
+; Instantiate code templates.
+;
+BS3_INSTANTIATE_COMMON_TEMPLATE "bs3-cpu-basic-2-template.mac"
+BS3_INSTANTIATE_TEMPLATE_WITH_WEIRD_ONES "bs3-cpu-basic-2-template.mac"
+