• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1;------------------------------------------------------------------------------ ;
2; Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
3; This program and the accompanying materials
4; are licensed and made available under the terms and conditions of the BSD License
5; which accompanies this distribution.  The full text of the license may be found at
6; http://opensource.org/licenses/bsd-license.php.
7;
8; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
10;
11; Module Name:
12;
13;   SmiException.asm
14;
15; Abstract:
16;
17;   Exception handlers used in SM mode
18;
19;-------------------------------------------------------------------------------
20
21EXTERNDEF   gcStmPsd:BYTE
22
23EXTERNDEF   SmmStmExceptionHandler:PROC
24EXTERNDEF   SmmStmSetup:PROC
25EXTERNDEF   SmmStmTeardown:PROC
26EXTERNDEF   gStmXdSupported:BYTE
27
28CODE_SEL    EQU 38h
29DATA_SEL    EQU 20h
30TR_SEL      EQU 40h
31
32MSR_IA32_MISC_ENABLE  EQU     1A0h
33MSR_EFER              EQU     0c0000080h
34MSR_EFER_XD           EQU     0800h
35
36    .data
37
38;
39; This structure serves as a template for all processors.
40;
41gcStmPsd     LABEL   BYTE
42            DB      'TXTPSSIG'
43            DW      PSD_SIZE
44            DW      1              ; Version
45            DD      0              ; LocalApicId
46            DB      0Fh            ; Cr4Pse;Cr4Pae;Intel64Mode;ExecutionDisableOutsideSmrr
47            DB      0              ; BIOS to STM
48            DB      0              ; STM to BIOS
49            DB      0
50            DW      CODE_SEL
51            DW      DATA_SEL
52            DW      DATA_SEL
53            DW      DATA_SEL
54            DW      TR_SEL
55            DW      0
56            DQ      0              ; SmmCr3
57            DQ      _OnStmSetup
58            DQ      _OnStmTeardown
59            DQ      0              ; SmmSmiHandlerRip - SMM guest entrypoint
60            DQ      0              ; SmmSmiHandlerRsp
61            DQ      0
62            DD      0
63            DD      80010100h      ; RequiredStmSmmRevId
64            DQ      _OnException
65            DQ      0              ; ExceptionStack
66            DW      DATA_SEL
67            DW      01Fh           ; ExceptionFilter
68            DD      0
69            DQ      0
70            DQ      0              ; BiosHwResourceRequirementsPtr
71            DQ      0              ; AcpiRsdp
72            DB      0              ; PhysicalAddressBits
73PSD_SIZE  = $ - offset gcStmPsd
74
75    .code
76;------------------------------------------------------------------------------
77; SMM Exception handlers
78;------------------------------------------------------------------------------
79_OnException       PROC
80    mov  rcx, rsp
81    add  rsp, -28h
82    call SmmStmExceptionHandler
83    add  rsp, 28h
84    mov  ebx, eax
85    mov  eax, 4
86    DB  0fh, 01h, 0c1h ; VMCALL
87    jmp $
88_OnException       ENDP
89
90_OnStmSetup PROC
91;
92; Check XD disable bit
93;
94    xor     r8, r8
95    mov     rax, offset ASM_PFX(gStmXdSupported)
96    mov     al, [rax]
97    cmp     al, 0
98    jz      @StmXdDone1
99    mov     ecx, MSR_IA32_MISC_ENABLE
100    rdmsr
101    mov     r8, rdx                   ; save MSR_IA32_MISC_ENABLE[63-32]
102    test    edx, BIT2                  ; MSR_IA32_MISC_ENABLE[34]
103    jz      @f
104    and     dx, 0FFFBh                 ; clear XD Disable bit if it is set
105    wrmsr
106@@:
107    mov     ecx, MSR_EFER
108    rdmsr
109    or      ax, MSR_EFER_XD            ; enable NXE
110    wrmsr
111@StmXdDone1:
112    push    r8
113
114  add  rsp, -20h
115  call SmmStmSetup
116  add  rsp, 20h
117
118    mov     rax, offset ASM_PFX(gStmXdSupported)
119    mov     al, [rax]
120    cmp     al, 0
121    jz      @f
122    pop     rdx                       ; get saved MSR_IA32_MISC_ENABLE[63-32]
123    test    edx, BIT2
124    jz      @f
125    mov     ecx, MSR_IA32_MISC_ENABLE
126    rdmsr
127    or      dx, BIT2                  ; set XD Disable bit if it was set before entering into SMM
128    wrmsr
129@@:
130
131  rsm
132_OnStmSetup ENDP
133
134_OnStmTeardown PROC
135;
136; Check XD disable bit
137;
138    xor     r8, r8
139    mov     rax, offset ASM_PFX(gStmXdSupported)
140    mov     al, [rax]
141    cmp     al, 0
142    jz      @StmXdDone2
143    mov     ecx, MSR_IA32_MISC_ENABLE
144    rdmsr
145    mov     r8, rdx                   ; save MSR_IA32_MISC_ENABLE[63-32]
146    test    edx, BIT2                  ; MSR_IA32_MISC_ENABLE[34]
147    jz      @f
148    and     dx, 0FFFBh                 ; clear XD Disable bit if it is set
149    wrmsr
150@@:
151    mov     ecx, MSR_EFER
152    rdmsr
153    or      ax, MSR_EFER_XD            ; enable NXE
154    wrmsr
155@StmXdDone2:
156    push    r8
157
158  add  rsp, -20h
159  call SmmStmTeardown
160  add  rsp, 20h
161
162    mov     rax, offset ASM_PFX(gStmXdSupported)
163    mov     al, [rax]
164    cmp     al, 0
165    jz      @f
166    pop     rdx                       ; get saved MSR_IA32_MISC_ENABLE[63-32]
167    test    edx, BIT2
168    jz      @f
169    mov     ecx, MSR_IA32_MISC_ENABLE
170    rdmsr
171    or      dx, BIT2                  ; set XD Disable bit if it was set before entering into SMM
172    wrmsr
173@@:
174
175  rsm
176_OnStmTeardown ENDP
177
178    END
179