• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   CPU DXE Module.
3 
4   Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef _CPU_DXE_H_
16 #define _CPU_DXE_H_
17 
18 #include <PiDxe.h>
19 
20 #include <Protocol/Cpu.h>
21 
22 #include <Library/UefiDriverEntryPoint.h>
23 #include <Library/UefiBootServicesTableLib.h>
24 #include <Library/DxeServicesTableLib.h>
25 #include <Library/BaseLib.h>
26 #include <Library/CpuLib.h>
27 #include <Library/BaseMemoryLib.h>
28 #include <Library/MemoryAllocationLib.h>
29 #include <Library/DebugLib.h>
30 #include <Library/MtrrLib.h>
31 #include <Library/LocalApicLib.h>
32 #include <Library/UefiCpuLib.h>
33 #include <Library/UefiLib.h>
34 #include <Library/CpuExceptionHandlerLib.h>
35 #include <Library/TimerLib.h>
36 #include <Guid/IdleLoopEvent.h>
37 #include <Guid/VectorHandoffTable.h>
38 
39 #define EFI_MEMORY_CACHETYPE_MASK     (EFI_MEMORY_UC  | \
40                                        EFI_MEMORY_WC  | \
41                                        EFI_MEMORY_WT  | \
42                                        EFI_MEMORY_WB  | \
43                                        EFI_MEMORY_UCE   \
44                                        )
45 
46 
47 /**
48   Flush CPU data cache. If the instruction cache is fully coherent
49   with all DMA operations then function can just return EFI_SUCCESS.
50 
51   @param  This              Protocol instance structure
52   @param  Start             Physical address to start flushing from.
53   @param  Length            Number of bytes to flush. Round up to chipset
54                             granularity.
55   @param  FlushType         Specifies the type of flush operation to perform.
56 
57   @retval EFI_SUCCESS       If cache was flushed
58   @retval EFI_UNSUPPORTED   If flush type is not supported.
59   @retval EFI_DEVICE_ERROR  If requested range could not be flushed.
60 
61 **/
62 EFI_STATUS
63 EFIAPI
64 CpuFlushCpuDataCache (
65   IN EFI_CPU_ARCH_PROTOCOL     *This,
66   IN EFI_PHYSICAL_ADDRESS      Start,
67   IN UINT64                    Length,
68   IN EFI_CPU_FLUSH_TYPE        FlushType
69   );
70 
71 /**
72   Enables CPU interrupts.
73 
74   @param  This              Protocol instance structure
75 
76   @retval EFI_SUCCESS       If interrupts were enabled in the CPU
77   @retval EFI_DEVICE_ERROR  If interrupts could not be enabled on the CPU.
78 
79 **/
80 EFI_STATUS
81 EFIAPI
82 CpuEnableInterrupt (
83   IN EFI_CPU_ARCH_PROTOCOL     *This
84   );
85 
86 /**
87   Disables CPU interrupts.
88 
89   @param  This              Protocol instance structure
90 
91   @retval EFI_SUCCESS       If interrupts were disabled in the CPU.
92   @retval EFI_DEVICE_ERROR  If interrupts could not be disabled on the CPU.
93 
94 **/
95 EFI_STATUS
96 EFIAPI
97 CpuDisableInterrupt (
98   IN EFI_CPU_ARCH_PROTOCOL     *This
99   );
100 
101 /**
102   Return the state of interrupts.
103 
104   @param  This                   Protocol instance structure
105   @param  State                  Pointer to the CPU's current interrupt state
106 
107   @retval EFI_SUCCESS            If interrupts were disabled in the CPU.
108   @retval EFI_INVALID_PARAMETER  State is NULL.
109 
110 **/
111 EFI_STATUS
112 EFIAPI
113 CpuGetInterruptState (
114   IN  EFI_CPU_ARCH_PROTOCOL     *This,
115   OUT BOOLEAN                   *State
116   );
117 
118 /**
119   Generates an INIT to the CPU.
120 
121   @param  This              Protocol instance structure
122   @param  InitType          Type of CPU INIT to perform
123 
124   @retval EFI_SUCCESS       If CPU INIT occurred. This value should never be
125                             seen.
126   @retval EFI_DEVICE_ERROR  If CPU INIT failed.
127   @retval EFI_UNSUPPORTED   Requested type of CPU INIT not supported.
128 
129 **/
130 EFI_STATUS
131 EFIAPI
132 CpuInit (
133   IN EFI_CPU_ARCH_PROTOCOL     *This,
134   IN EFI_CPU_INIT_TYPE         InitType
135   );
136 
137 /**
138   Registers a function to be called from the CPU interrupt handler.
139 
140   @param  This                   Protocol instance structure
141   @param  InterruptType          Defines which interrupt to hook. IA-32
142                                  valid range is 0x00 through 0xFF
143   @param  InterruptHandler       A pointer to a function of type
144                                  EFI_CPU_INTERRUPT_HANDLER that is called
145                                  when a processor interrupt occurs.  A null
146                                  pointer is an error condition.
147 
148   @retval EFI_SUCCESS            If handler installed or uninstalled.
149   @retval EFI_ALREADY_STARTED    InterruptHandler is not NULL, and a handler
150                                  for InterruptType was previously installed.
151   @retval EFI_INVALID_PARAMETER  InterruptHandler is NULL, and a handler for
152                                  InterruptType was not previously installed.
153   @retval EFI_UNSUPPORTED        The interrupt specified by InterruptType
154                                  is not supported.
155 
156 **/
157 EFI_STATUS
158 EFIAPI
159 CpuRegisterInterruptHandler (
160   IN EFI_CPU_ARCH_PROTOCOL         *This,
161   IN EFI_EXCEPTION_TYPE            InterruptType,
162   IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler
163   );
164 
165 /**
166   Returns a timer value from one of the CPU's internal timers. There is no
167   inherent time interval between ticks but is a function of the CPU frequency.
168 
169   @param  This                - Protocol instance structure.
170   @param  TimerIndex          - Specifies which CPU timer is requested.
171   @param  TimerValue          - Pointer to the returned timer value.
172   @param  TimerPeriod         - A pointer to the amount of time that passes
173                                 in femtoseconds (10-15) for each increment
174                                 of TimerValue. If TimerValue does not
175                                 increment at a predictable rate, then 0 is
176                                 returned.  The amount of time that has
177                                 passed between two calls to GetTimerValue()
178                                 can be calculated with the formula
179                                 (TimerValue2 - TimerValue1) * TimerPeriod.
180                                 This parameter is optional and may be NULL.
181 
182   @retval EFI_SUCCESS           - If the CPU timer count was returned.
183   @retval EFI_UNSUPPORTED       - If the CPU does not have any readable timers.
184   @retval EFI_DEVICE_ERROR      - If an error occurred while reading the timer.
185   @retval EFI_INVALID_PARAMETER - TimerIndex is not valid or TimerValue is NULL.
186 
187 **/
188 EFI_STATUS
189 EFIAPI
190 CpuGetTimerValue (
191   IN  EFI_CPU_ARCH_PROTOCOL       *This,
192   IN  UINT32                      TimerIndex,
193   OUT UINT64                      *TimerValue,
194   OUT UINT64                      *TimerPeriod OPTIONAL
195   );
196 
197 /**
198   Set memory cacheability attributes for given range of memeory.
199 
200   @param  This                   Protocol instance structure
201   @param  BaseAddress            Specifies the start address of the
202                                  memory range
203   @param  Length                 Specifies the length of the memory range
204   @param  Attributes             The memory cacheability for the memory range
205 
206   @retval EFI_SUCCESS            If the cacheability of that memory range is
207                                  set successfully
208   @retval EFI_UNSUPPORTED        If the desired operation cannot be done
209   @retval EFI_INVALID_PARAMETER  The input parameter is not correct,
210                                  such as Length = 0
211 
212 **/
213 EFI_STATUS
214 EFIAPI
215 CpuSetMemoryAttributes (
216   IN EFI_CPU_ARCH_PROTOCOL      *This,
217   IN EFI_PHYSICAL_ADDRESS       BaseAddress,
218   IN UINT64                     Length,
219   IN UINT64                     Attributes
220   );
221 
222 /**
223   Initialize Global Descriptor Table.
224 
225 **/
226 VOID
227 InitGlobalDescriptorTable (
228   VOID
229   );
230 
231 /**
232   Sets the code selector (CS).
233 
234   @param  Selector  Value of code selector.
235 
236 **/
237 VOID
238 EFIAPI
239 SetCodeSelector (
240   UINT16 Selector
241   );
242 
243 /**
244   Sets the data selector (DS).
245 
246   @param  Selector  Value of data selector.
247 
248 **/
249 VOID
250 EFIAPI
251 SetDataSelectors (
252   UINT16 Selector
253   );
254 
255 #endif
256 
257