VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-TrapRmV86Init.c@ 66112

Last change on this file since 66112 was 62471, checked in by vboxsync, 8 years ago

Misc: scm

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.3 KB
Line 
1/* $Id: bs3-cmn-TrapRmV86Init.c 62471 2016-07-22 18:04:30Z vboxsync $ */
2/** @file
3 * BS3Kit - Bs3TrapRmV86Init
4 */
5
6/*
7 * Copyright (C) 2007-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include "bs3kit-template-header.h"
32
33
34/*********************************************************************************************************************************
35* Global Variables *
36*********************************************************************************************************************************/
37/* We ASSUME that BS3CLASS16CODE is 64KB aligned, so the low 16-bit of the
38 flat address matches. Also, these symbols are defined both with
39 and without underscore prefixes. */
40extern BS3_DECL(void) BS3_FAR_CODE Bs3TrapRmV86GenericEntries(void);
41
42/* These two are ugly. Need data access for patching purposes. */
43extern uint8_t BS3_FAR_DATA bs3TrapRmV86GenericTrapOrInt[];
44
45/* bs3-cmn-TrapRmV86Data.c: */
46#define g_fBs3RmIvtCopied BS3_DATA_NM(g_fBs3RmIvtCopied)
47extern bool g_fBs3RmIvtCopied;
48
49
50#undef Bs3TrapRmV86InitEx
51BS3_CMN_DEF(void, Bs3TrapRmV86InitEx,(bool f386Plus))
52{
53 RTFAR16 BS3_FAR *paIvt = Bs3XptrFlatToCurrent(0);
54 unsigned iIvt;
55
56 /*
57 * Copy the real mode IVT the first time we are here.
58 */
59 if (!g_fBs3RmIvtCopied)
60 {
61 Bs3MemCpy(g_aBs3RmIvtOriginal, paIvt, sizeof(g_aBs3RmIvtOriginal));
62 g_fBs3RmIvtCopied = true;
63 }
64 /*
65 * The rest of the times, we copy back the original and modify it.
66 */
67 else
68 Bs3MemCpy(paIvt, g_aBs3RmIvtOriginal, sizeof(g_aBs3RmIvtOriginal));
69
70
71 /*
72 * If 386 or later, patch the trap handler code to not jump to the 80286
73 * code but continue with the next instruction (the 386+ code).
74 */
75 if (f386Plus)
76 {
77 uint8_t BS3_FAR_DATA *pbFunction = &bs3TrapRmV86GenericTrapOrInt[0];
78#if ARCH_BITS == 16
79 if (g_bBs3CurrentMode != BS3_MODE_RM)
80 pbFunction = (uint8_t BS3_FAR_DATA *)BS3_FP_MAKE(BS3_SEL_TILED + 1, BS3_FP_OFF(pbFunction));
81#endif
82 pbFunction[1] = 0;
83 pbFunction[2] = 0;
84 }
85
86 /*
87 * Since we want to play with V86 mode as well as 8086 and 186 CPUs, we
88 * cannot move the IVT from its default location. So, modify it in place.
89 *
90 * Note! We must keep INT 10h working, which is easy since the CPU does
91 * use it (well, it's been reserved for 30+ years).
92 * Turns out we must not hook INT 6Dh either then, as some real VGA
93 * BIOS installs their INT 10h handler there as well, and seemingly
94 * must be using it internally or something.
95 */
96 for (iIvt = 0; iIvt < 256; iIvt++)
97 if (iIvt != 0x10 && iIvt != 0x6d && iIvt != BS3_TRAP_SYSCALL)
98 {
99 paIvt[iIvt].off = (uint16_t)(uintptr_t)Bs3TrapRmV86GenericEntries + iIvt * 8;
100 paIvt[iIvt].sel = BS3_SEL_TEXT16;
101 }
102}
103
104
105#undef Bs3TrapRmV86Init
106BS3_CMN_DEF(void, Bs3TrapRmV86Init,(void))
107{
108 BS3_CMN_NM(Bs3TrapRmV86InitEx)((g_uBs3CpuDetected & BS3CPU_TYPE_MASK) >= BS3CPU_80386);
109}
110
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette