VirtualBox

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

Last change on this file since 61533 was 60660, checked in by vboxsync, 9 years ago

bs3kit: Don't try override IVT[0x6d] as it turns out real VGA BIOSes likes using it and it may totally blow up INT 10h.

  • 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 60660 2016-04-22 16:45:50Z 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* Header Files *
29*********************************************************************************************************************************/
30#include "bs3kit-template-header.h"
31
32
33/*********************************************************************************************************************************
34* Global Variables *
35*********************************************************************************************************************************/
36/* We ASSUME that BS3CLASS16CODE is 64KB aligned, so the low 16-bit of the
37 flat address matches. Also, these symbols are defined both with
38 and without underscore prefixes. */
39extern BS3_DECL(void) BS3_FAR_CODE Bs3TrapRmV86GenericEntries(void);
40
41/* These two are ugly. Need data access for patching purposes. */
42extern uint8_t BS3_FAR_DATA bs3TrapRmV86GenericTrapOrInt[];
43
44/* bs3-cmn-TrapRmV86Data.c: */
45#define g_fBs3RmIvtCopied BS3_DATA_NM(g_fBs3RmIvtCopied)
46extern bool g_fBs3RmIvtCopied;
47
48
49#undef Bs3TrapRmV86InitEx
50BS3_CMN_DEF(void, Bs3TrapRmV86InitEx,(bool f386Plus))
51{
52 RTFAR16 BS3_FAR *paIvt = Bs3XptrFlatToCurrent(0);
53 unsigned iIvt;
54
55 /*
56 * Copy the real mode IVT the first time we are here.
57 */
58 if (!g_fBs3RmIvtCopied)
59 {
60 Bs3MemCpy(g_aBs3RmIvtOriginal, paIvt, sizeof(g_aBs3RmIvtOriginal));
61 g_fBs3RmIvtCopied = true;
62 }
63 /*
64 * The rest of the times, we copy back the original and modify it.
65 */
66 else
67 Bs3MemCpy(paIvt, g_aBs3RmIvtOriginal, sizeof(g_aBs3RmIvtOriginal));
68
69
70 /*
71 * If 386 or later, patch the trap handler code to not jump to the 80286
72 * code but continue with the next instruction (the 386+ code).
73 */
74 if (f386Plus)
75 {
76 uint8_t BS3_FAR_DATA *pbFunction = &bs3TrapRmV86GenericTrapOrInt[0];
77#if ARCH_BITS == 16
78 if (g_bBs3CurrentMode != BS3_MODE_RM)
79 pbFunction = (uint8_t BS3_FAR_DATA *)BS3_FP_MAKE(BS3_SEL_TILED + 1, BS3_FP_OFF(pbFunction));
80#endif
81 pbFunction[1] = 0;
82 pbFunction[2] = 0;
83 }
84
85 /*
86 * Since we want to play with V86 mode as well as 8086 and 186 CPUs, we
87 * cannot move the IVT from its default location. So, modify it in place.
88 *
89 * Note! We must keep INT 10h working, which is easy since the CPU does
90 * use it (well, it's been reserved for 30+ years).
91 * Turns out we must not hook INT 6Dh either then, as some real VGA
92 * BIOS installs their INT 10h handler there as well, and seemingly
93 * must be using it internally or something.
94 */
95 for (iIvt = 0; iIvt < 256; iIvt++)
96 if (iIvt != 0x10 && iIvt != 0x6d && iIvt != BS3_TRAP_SYSCALL)
97 {
98 paIvt[iIvt].off = (uint16_t)(uintptr_t)Bs3TrapRmV86GenericEntries + iIvt * 8;
99 paIvt[iIvt].sel = BS3_SEL_TEXT16;
100 }
101}
102
103
104#undef Bs3TrapRmV86Init
105BS3_CMN_DEF(void, Bs3TrapRmV86Init,(void))
106{
107 BS3_CMN_NM(Bs3TrapRmV86InitEx)((g_uBs3CpuDetected & BS3CPU_TYPE_MASK) >= BS3CPU_80386);
108}
109
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