Home | History | Annotate | Download | only in X64
      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 
     21 EXTERNDEF   gcStmPsd:BYTE
     22 
     23 EXTERNDEF   SmmStmExceptionHandler:PROC
     24 EXTERNDEF   SmmStmSetup:PROC
     25 EXTERNDEF   SmmStmTeardown:PROC
     26 EXTERNDEF   gStmXdSupported:BYTE
     27 
     28 CODE_SEL    EQU 38h
     29 DATA_SEL    EQU 20h
     30 TR_SEL      EQU 40h
     31 
     32 MSR_IA32_MISC_ENABLE  EQU     1A0h
     33 MSR_EFER              EQU     0c0000080h
     34 MSR_EFER_XD           EQU     0800h
     35 
     36     .data
     37 
     38 ;
     39 ; This structure serves as a template for all processors.
     40 ;
     41 gcStmPsd     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
     73 PSD_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