VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-c64-Trap64Generic.asm@ 61533

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

bs3kit: Use PIT for timing out the FPU testcase.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1; $Id: bs3-c64-Trap64Generic.asm 61389 2016-06-02 00:04:34Z vboxsync $
2;; @file
3; BS3Kit - Trap, 64-bit assembly handlers.
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.mac"
31
32%ifndef TMPL_64BIT
33 %error "64-bit only template"
34%endif
35
36
37;*********************************************************************************************************************************
38;* External Symbols *
39;*********************************************************************************************************************************
40BS3_EXTERN_DATA16 g_bBs3CurrentMode
41BS3_EXTERN_DATA16 g_apfnBs3TrapHandlers_c64
42TMPL_BEGIN_TEXT
43BS3_EXTERN_CMN Bs3TrapDefaultHandler
44BS3_EXTERN_CMN Bs3RegCtxRestore
45TMPL_BEGIN_TEXT
46
47
48;*********************************************************************************************************************************
49;* Global Variables *
50;*********************************************************************************************************************************
51BS3_BEGIN_DATA16
52;; Easy to access flat address of Bs3Trap64GenericEntries.
53BS3_GLOBAL_DATA g_Bs3Trap64GenericEntriesFlatAddr, 4
54 dd Bs3Trap64GenericEntries wrt FLAT
55
56
57TMPL_BEGIN_TEXT
58
59;;
60; Generic entry points for IDT handlers, 8 byte spacing.
61;
62BS3_PROC_BEGIN Bs3Trap64GenericEntries
63%macro Bs3Trap64GenericEntry 1
64 db 06ah, i ; push imm8 - note that this is a signextended value.
65 jmp %1
66 ALIGNCODE(8)
67%assign i i+1
68%endmacro
69
70%assign i 0 ; start counter.
71 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 0
72 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 1
73 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 2
74 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 3
75 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 4
76 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 5
77 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 6
78 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 7
79 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; 8
80 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 9
81 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; a
82 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; b
83 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; c
84 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; d
85 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; e
86 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; f (reserved)
87 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 10
88 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; 11
89 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 12
90 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 13
91 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 14
92 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 15 (reserved)
93 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 16 (reserved)
94 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 17 (reserved)
95 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 18 (reserved)
96 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 19 (reserved)
97 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 1a (reserved)
98 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 1b (reserved)
99 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 1c (reserved)
100 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 1d (reserved)
101 Bs3Trap64GenericEntry Bs3Trap64GenericTrapErrCode ; 1e
102 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt ; 1f (reserved)
103%rep 224
104 Bs3Trap64GenericEntry Bs3Trap64GenericTrapOrInt
105%endrep
106BS3_PROC_END Bs3Trap64GenericEntries
107
108
109
110
111;;
112; Trap or interrupt (no error code).
113;
114BS3_PROC_BEGIN Bs3Trap64GenericTrapOrInt
115 push rbp ; 0
116 mov rbp, rsp
117 pushfq ; -08h
118 cld
119 push rdi
120
121 ; Reserve space for the the register and trap frame.
122 mov edi, (BS3TRAPFRAME_size + 15) / 16
123.more_zeroed_space:
124 push qword 0
125 push qword 0
126 dec edi
127 jnz .more_zeroed_space
128 mov rdi, rsp ; rdi points to trapframe structure.
129
130 ; Free up rax.
131 mov [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.rax], rax
132
133 ; Copy stuff from the stack over.
134 mov al, [rbp + 08h]
135 mov [rdi + BS3TRAPFRAME.bXcpt], al
136 mov rax, [rbp]
137 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rbp], rax
138 mov rax, [rbp - 08h]
139 mov [rdi + BS3TRAPFRAME.fHandlerRfl], rax
140 mov rax, [rbp - 10h]
141 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rdi], rax
142
143 lea rbp, [rbp + 08h] ; iret - 8 (i.e. rbp frame chain location)
144 jmp Bs3Trap64GenericCommon
145BS3_PROC_END Bs3Trap64GenericTrapOrInt
146
147
148;;
149; Trap with error code.
150;
151BS3_PROC_BEGIN Bs3Trap64GenericTrapErrCode
152 push rbp ; 0
153 mov rbp, rsp
154 pushfq ; -08h
155 cld
156 push rdi
157
158 ; Reserve space for the the register and trap frame.
159 mov edi, (BS3TRAPFRAME_size + 15) / 16
160.more_zeroed_space:
161 push qword 0
162 push qword 0
163 dec edi
164 jnz .more_zeroed_space
165 mov rdi, rsp ; rdi points to trapframe structure.
166
167 ; Free up rax.
168 mov [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.rax], rax
169
170 ; Copy stuff from the stack over.
171 mov rax, [rbp + 10h]
172 mov [rdi + BS3TRAPFRAME.uErrCd], rax
173 mov al, [rbp + 08h]
174 mov [rdi + BS3TRAPFRAME.bXcpt], al
175 mov rax, [rbp]
176 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rbp], rax
177 mov rax, [rbp - 08h]
178 mov [rdi + BS3TRAPFRAME.fHandlerRfl], rax
179 mov rax, [rbp - 10h]
180 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rdi], rax
181
182 lea rbp, [rbp + 10h] ; iret - 8 (i.e. rbp frame chain location)
183 jmp Bs3Trap64GenericCommon
184BS3_PROC_END Bs3Trap64GenericTrapErrCode
185
186
187;;
188; Common context saving code and dispatching.
189;
190; @param rdi Pointer to the trap frame. The following members have been
191; filled in by the previous code:
192; - bXcpt
193; - uErrCd
194; - fHandlerRfl
195; - Ctx.rax
196; - Ctx.rbp
197; - Ctx.rdi
198;
199; @param rbp Pointer to the dword before the iret frame, i.e. where rbp
200; would be saved if this was a normal call.
201;
202BS3_PROC_BEGIN Bs3Trap64GenericCommon
203 ;
204 ; Fake RBP frame.
205 ;
206 mov rax, [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rbp]
207 mov [rbp], rax
208
209 ;
210 ; Save the remaining GPRs and segment registers.
211 ;
212 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rcx], rcx
213 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rdx], rdx
214 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rbx], rbx
215 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rsi], rsi
216 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r8 ], r8
217 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r9 ], r9
218 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r10], r10
219 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r11], r11
220 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r12], r12
221 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r13], r13
222 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r14], r14
223 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.r15], r15
224 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.ds], ds
225 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.es], es
226 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.fs], fs
227 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.gs], gs
228 lea rax, [rbp + 8h]
229 mov [rdi + BS3TRAPFRAME.uHandlerRsp], rax
230 mov [rdi + BS3TRAPFRAME.uHandlerSs], ss
231
232 ;
233 ; Load 32-bit data selector for the DPL we're executing at into DS, ES and SS.
234 ; Save the handler CS value first.
235 ;
236 mov ax, cs
237 mov [rdi + BS3TRAPFRAME.uHandlerCs], ax
238 AssertCompile(BS3_SEL_RING_SHIFT == 8)
239 and al, 3
240 mov ah, al
241 add ax, BS3_SEL_R0_DS64
242 mov ds, ax
243 mov es, ax
244 mov ss, ax
245
246 ;
247 ; Copy and update the mode.
248 ;
249 mov al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
250 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.bMode], al
251 and al, ~BS3_MODE_CODE_MASK
252 or al, BS3_MODE_CODE_64
253 mov [BS3_DATA16_WRT(g_bBs3CurrentMode)], al
254
255 ;
256 ; Copy iret info. Bless AMD for only doing one 64-bit iret frame layout.
257 ;
258 mov rcx, [rbp + 08]
259 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rip], rcx
260 mov cx, [rbp + 10h]
261 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.cs], cx
262 and cl, 3
263 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.bCpl], cl
264 mov rcx, [rbp + 18h]
265 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rflags], rcx
266 mov rcx, [rbp + 20h]
267 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.rsp], rcx
268 mov cx, [rbp + 28h]
269 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.ss], cx
270 mov byte [rdi + BS3TRAPFRAME.cbIretFrame], 5*8
271
272 ;
273 ; Control registers.
274 ;
275 str ax
276 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.tr], ax
277 sldt ax
278 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.ldtr], ax
279
280 mov ax, ss
281 test al, 3
282 jnz .skip_crX_because_cpl_not_0
283
284 mov rax, cr0
285 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr0], rax
286 mov rax, cr2
287 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr2], rax
288 mov rax, cr3
289 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr3], rax
290 mov rax, cr4
291 mov [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr4], rax
292 jmp .dispatch_to_handler
293
294.skip_crX_because_cpl_not_0:
295 or byte [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], \
296 BS3REG_CTX_F_NO_CR0_IS_MSW | BS3REG_CTX_F_NO_CR2_CR3 | BS3REG_CTX_F_NO_CR4
297 smsw [rdi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr0]
298
299 ;
300 ; Dispatch it to C code.
301 ;
302.dispatch_to_handler: ; The double fault code joins us here.
303 movzx ebx, byte [rdi + BS3TRAPFRAME.bXcpt]
304 lea rax, [BS3_DATA16_WRT(_g_apfnBs3TrapHandlers_c64)]
305 mov rax, [rax + rbx * 8]
306 or rax, rax
307 jnz .call_handler
308 lea rax, [BS3_WRT_RIP(Bs3TrapDefaultHandler)]
309.call_handler:
310 sub rsp, 20h
311 mov [rsp], rdi
312 mov rcx, rdi
313 call rax
314
315 ;
316 ; Resume execution using trap frame.
317 ;
318 xor edx, edx ; fFlags
319 mov [rsp + 8], rdx
320 lea rcx, [rdi + BS3TRAPFRAME.Ctx] ; pCtx
321 mov [rsp], rcx
322 call Bs3RegCtxRestore
323.panic:
324 hlt
325 jmp .panic
326BS3_PROC_END Bs3Trap64GenericCommon
327
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