1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
|
//*****************************************************************//
//*****************************************************************//
//*****************************************************************//
//** **//
//** (C)Copyright 2009, American Megatrends, Inc. **//
//** **//
//** All Rights Reserved. **//
//** **//
//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 **//
//** **//
//** Phone (770)-246-8600 **//
//** **//
//*****************************************************************//
//*****************************************************************//
//*****************************************************************//
// $Header: /Alaska/BIN/Modules/AMIDebugRx/binaries/PeiAMIDebugRx/INC/AMIpeidebug.h 6 3/16/11 4:43p Sudhirv $
//
// $Revision: 6 $
//
// $Date: 3/16/11 4:43p $
//*****************************************************************
//*****************************************************************
//
// peidebug.h
//
//
// Revision History
// ----------------
// $Log: /Alaska/BIN/Modules/AMIDebugRx/binaries/PeiAMIDebugRx/INC/AMIpeidebug.h $
//
// 6 3/16/11 4:43p Sudhirv
// Changes to Support Older Cores before 4.6.5.0
//
// 5 3/09/11 8:22a Sudhirv
// EIP 53658 - AMIDebugRx\Debugger support for PI 1.1
//
// 4 9/22/10 7:09p Sudhirv
// 4.6.2_AMIDebugRx_2.01.0026_Beta Release
//
// 3 9/30/09 8:00p Madhans
// Updated for 1.31. Refer release notes.
//
// 2 7/17/09 7:15p Madhans
// DebugRx 1.30.0022
//
// 2 7/13/09 2:49p Sudhirv
// Update with Coding Standards
//
// 1 7/07/09 4:46p Sudhirv
// Restructure Binaries Created
//
// 1 5/01/09 7:48p Madhans
// AMIDebug Rx Module. Intial Checkin.
//
// 1 4/29/09 7:52a Sudhirv
// AMI Debug Rx module created
//
// 25 3/19/09 3:41p Sudhirv
// Added After changes for Target Sending Exception Packets
//
// 23 1/30/09 12:32p Sudhirv
// Added after Console Redirection Support
//
// 22 9/25/08 4:29p Sudhirv
// Updated SMM Debugging and Read/Write Mem
//
// 21 7/29/08 1:09p Sudhirv
// Changes made to support SMM debugging in savemem and loadmem
// extension commands
//
// 20 6/26/08 3:30p Sudhirv
// Uploaded after checking coding standards
//
// 19 6/11/08 2:24p Sudhirv
// After Addibg GP Handling in MSR
//
// 18 6/11/08 5:46a Sudhirv
// Uploaded for Release with Read/WriteMSR restriction, Readio/Writeio
// restriction, Read/Write IndirectIO, ListModules and PciList
//
// 17 12/05/07 8:23a Sudhirv
// Added to support and Restrict ReadMSR/WriteMSR commands
//
// 16 10/24/07 10:31a Madhans
// Hatdriver Support.
//
// 15 8/29/07 3:49p Madhans
// To resolve AMD Platfrom issues.
//
// 14 8/29/07 12:49p Madhans
// Common code for 4.x and 3.x
//
// 13 6/13/07 3:16p Madhans
// Copyright Year updated.
//
// 12 6/13/07 2:37p Madhans
// To improve the performance in Load FV though Serial.
//
// 11 6/05/07 7:10p Natalyak
// Load FV support
//
// 10 4/05/07 6:33p Madhans
// CAR_BASE_ADJUST_OFFSET removed.
//
// 9 3/10/07 1:24p Madhans
// CAR_BASE_ADJUST_OFFSET allows to have PEI_SERVICES address above IDT
//
// 8 2/23/07 5:36p Madhans
// PeiDbgr_SendPeiLoadImage function added.
//
// 7 1/22/07 11:41a Madhans
// Modification made for Binary Release 1.04.0003.
//
// 11 1/05/07 6:15p Madhan
//
// 10 1/05/07 1:05p Ashrafj
// Latest version 1.04.0001 Beta
// Known issues from previous 1.04.000 Beta release has been fixed.
//
// 9 12/26/06 7:07p Ashrafj
// Support added to support the Aptio 4.5 x64 EFI BIOS (use latest
// Host.zip).
// PEI Debugger in FV_MAIN (use new PEIDEBUGFIXUP).
// Support added for StatusCode redirection without Debug feature enabled
// (not working if DXE only and x64 is enabled).
// Plus, some new SDL tokens defined to support the Aptio 4.5 build
// process in Debug or non-debug mode.
// All the components of Debugger eModule in source form.
//
// 7 6/27/06 11:44a Ashrafj
// New feature added:
// To enable the PEI Debug support after system memory is installed, based
// on build option provided through a new SDL token named
// "PEI_DEBUG_SUPPORT_AFTER_MEMORY".
//
// 6 3/15/06 7:45p Ashrafj
// Modfication done to provide the Binary integration for Aptio 4
// projects.
//
// 5 12/22/05 12:42p Ashrafj
// Changes done to support the complete Chipset template porting.
//
// To use this changes, make sure to have the latest Board components of
// CPU, SB and SIO, which have the following ELINKS ported:
// - SBPEIDBG_Initialize,
// - CPUPEIDBG_Initialize,
// - SIOPEIDBG_Initialize,
// - SBPEIDBG_InitUsbEhci.
//
// 4 12/05/05 7:29p Ashrafj
// Serial Port Debug Support added for PEI - DXE Debugger.
//
// Change in Serial Port Communication: Now the data transmission through
// Serial Port is supported with the hardware Flow control feature of the
// Serial Port controller.
//
// 3 11/29/05 6:07p Markw
// Change USB interface function parameters.
//
// 2 10/25/05 11:38a Ashrafj
// Minor fix - packed structure alignment and width size of global
// variable.
//
// 1 10/19/05 10:54a Felixp
//
// 1 10/19/05 10:44a Felixp
//
//
//
//*****************************************************************
//<AMI_FHDR_START>
//----------------------------------------------------------------------------
//
// Name: AMIPeiDebug.h
//
// Description: Contains 32 bit Pei Debugger prototypes
//
//----------------------------------------------------------------------------
//<AMI_FHDR_END>
#ifndef _AMI_PEIDEBUG_H_
#define _AMI_PEIDEBUG_H_
#ifdef USB_DEBUGGER
#include "EHCI.h"
#endif
#ifdef ALASKA_SUPPORT
#include "token.h"
#else
#include "tokens.h"
#endif
#define EFI_PEI_DBG_BASEADDRESS_PPI_GUID \
{ 0x9bf4e141, 0xa4ec, 0x4d72, {0xbc, 0xc4, 0x94, 0x2, 0x1d, 0x2b, 0x80, 0xbd }}
#if defined (PI_SPECIFICATION_VERSION)
#if PI_SPECIFICATION_VERSION>=0x00010000
UINTN GetCARBaseAddress();
#define PEI_DEBUG_DATASECTION_BASEADDRESS GetCARBaseAddress() //Starting address of PEI debugger data section
#define PEI_DEBUG_DATASECTION_SIZE 0x2048
#else //if PI_SPECIFICATION_VERSION >= 0x00010000
#ifdef ALASKA_SUPPORT
#define PEI_DEBUG_DATASECTION_BASEADDRESS CAR_BASE_ADDRESS //Starting address of PEI debugger data section
#define PEI_DEBUG_DATASECTION_SIZE CAR_TOTAL_SIZE
#else //ifdef ALASKA_SUPPORT
#define PM_BASE_ADDRESS APLIB_PM_BASE_ADDRESS
#define DATA_STACK_BASEADDRESS APLIB_CAR_BASEADDRESS
#define PEI_DEBUG_DATASECTION_BASEADDRESS DATA_STACK_BASEADDRESS //Starting address of PEI debugger data section
#define PEI_DEBUG_DATASECTION_SIZE 0x400
#endif //ifdef ALASKA_SUPPORT
#endif //if PI_SPECIFICATION_VERSION >= 0x00010000
#else //if not defined (PI_SPECIFICATION_VERSION)
#ifdef ALASKA_SUPPORT
#define PEI_DEBUG_DATASECTION_BASEADDRESS CAR_BASE_ADDRESS //Starting address of PEI debugger data section
#define PEI_DEBUG_DATASECTION_SIZE CAR_TOTAL_SIZE
#else //ifdef ALASKA_SUPPORT
#define PM_BASE_ADDRESS APLIB_PM_BASE_ADDRESS
#define DATA_STACK_BASEADDRESS APLIB_CAR_BASEADDRESS
#define PEI_DEBUG_DATASECTION_BASEADDRESS DATA_STACK_BASEADDRESS //Starting address of PEI debugger data section
#define PEI_DEBUG_DATASECTION_SIZE 0x400
#endif //ifdef ALASKA_SUPPORT
#endif //if defined (PI_SPECIFICATION_VERSION)
#define IRQ_VECTOR_BASE 0x8
typedef struct {
UINT8 Signature[4];
UINT32 DATABASEADDRESS;
}PEI_DBG_DATA_SECTION;
#ifdef RELOCATE
#if defined PI_SPECIFICATION_VERSION
#if (PI_SPECIFICATION_VERSION >= 0x00010000)
#define PEI_DEBUG_DATA_BASEADDRESS GetCARBaseAddress() //(PeiDbgDataSection.DATABASEADDRESS)
#else
extern PEI_DBG_DATA_SECTION PeiDbgDataSection;
#define PEI_DEBUG_DATA_BASEADDRESS (PeiDbgDataSection.DATABASEADDRESS)
#endif
#else
extern PEI_DBG_DATA_SECTION PeiDbgDataSection;
#define PEI_DEBUG_DATA_BASEADDRESS (PeiDbgDataSection.DATABASEADDRESS)
#endif
#else
#define PEI_DEBUG_DATA_BASEADDRESS PEI_DEBUG_DATASECTION_BASEADDRESS // Fixed Base Address
#endif
#define IDT_ENTRIES 0x14 // Number of Entries in IDT
#define IDT_SIZE 0xa0 // Total Size = 160 Bytes
#define CONTEXT_SIZE 0x74 // Total Size = 116 Bytes
#define XPORTLOCALVAR_SIZE 0x48 // Total Size = 72 Bytes
#define XPORTGLOBALVAR_SIZE 0x18 // Total Size = 24 Bytes
//#define DBGRLOCALVAR_SIZE 0x2c // Total Size = 44 Bytes
#define DBGRLOCALVAR_SIZE 0x36 // Total Size = 56 Bytes
#define XPORTEXPTNBUF_SIZE 0x20 // Total Size = 32 Bytes
//#define GLOBALBUF_SIZE 0x235 // Total Size = 565 Bytes
#define GLOBALBUF_SIZE 0x210 // Total Size = 528 Bytes
#define ACKBUF_SIZE 0x0a // Total Size = 10 Bytes
#define PEI_DEBUG_IDTBASEADDR PEI_DEBUG_DATA_BASEADDRESS
#define PEI_DEBUG_CONTEXTADDR PEI_DEBUG_DATA_BASEADDRESS + IDT_SIZE
#define PEI_DEBUG_XPORTLOCALVARADDR PEI_DEBUG_CONTEXTADDR + CONTEXT_SIZE
#define PEI_DEBUG_XPORTGLOBALVARADDR PEI_DEBUG_XPORTLOCALVARADDR + XPORTLOCALVAR_SIZE
#define PEI_DEBUG_DBGRLOCALVARADDR PEI_DEBUG_XPORTGLOBALVARADDR + XPORTGLOBALVAR_SIZE
#define PEI_DEBUG_XPORTEXPTNADDR PEI_DEBUG_DBGRLOCALVARADDR + DBGRLOCALVAR_SIZE
#define PEI_DEBUG_BUFADDR PEI_DEBUG_XPORTEXPTNADDR + XPORTEXPTNBUF_SIZE
#define PEI_DEBUG_ACKADDR PEI_DEBUG_BUFADDR + GLOBALBUF_SIZE
#define IN_PEI_BEFORE_MEMORY 0
#define IN_PEI_AFTER_MEMORY 01
#define IN_DXE_WITH_PEI_DBGR 02
#define IN_DXE_WITH_DXE_DBGR 03
#pragma pack (push, pei_struct_data_pack, 1)
typedef struct {
unsigned char IDTSet[IDT_SIZE];
unsigned char ContextReg[CONTEXT_SIZE];
unsigned char XportLocalVar[XPORTLOCALVAR_SIZE];
unsigned char XportGlobalVar[XPORTGLOBALVAR_SIZE];
unsigned char DbgrLocalVar[DBGRLOCALVAR_SIZE];
unsigned char XportExptn[XPORTEXPTNBUF_SIZE];
unsigned char GlobalBuf[GLOBALBUF_SIZE];
unsigned char AckBuf[ACKBUF_SIZE];
} PEIDebugData_T;
#pragma pack (pop, pei_struct_data_pack)
typedef struct _AMI_PEI_TRANSPORT_PROTOCOL {
UINT8 Signature[4];
UINT16 (*Initialize)();
UINT16 (*Restore)();
UINT16 (*Send)();
UINT16 (*Receive)();
UINT16 (*SyncPacketNumber)();
UINT16 (*RegisterHandler)();
VOID (*Callback)();
UINT16 (*SendNoAck)();
EFI_STATUS (*ConsoleIn)();
VOID (*SendExptn)();
} AMI_PEI_TRANSPORT_PROTOCOL;
typedef struct{
UINT8 Signature[4];
VOID (*ExceptionCallback)();
VOID (*SendMessage)();
UINTN (*PeiDbgr_EnableDebugSupport)(UINTN BrkPtAddr);
UINTN (*PeiDbgr_SendPeiLoadImage)(UINTN FileHandle,UINTN ImageAddr,UINTN ImageSize,void * PDBFileName);
VOID (*DoSpecialBreakPoint)(UINT32 EaxValue,UINT32 EdxValue);
}AMI_DEBUGGER_INTERFACE;
#pragma pack(1)
typedef struct {
UINT32 m_EIP;
UINT16 m_SendPktSize;
UINT8 m_CurSendPktNum;
UINT16 m_CurIxInRcvPkt;
UINT8 m_CurRcvPktNum;
UINT32 m_ExptnHndlr;
UINT8 m_IsSending;
UINT16 m_ExptnType;
UINT8 m_PrevByteEsc;
UINT8 m_RcvingPkt;
UINT8 m_RcvPktReady;
UINT16 m_RcvPktSize;
UINT8 m_IsPortInListenMode;
UINT8 m_IsHostConnected;
UINT8 m_IsPeiDbgIsS3;
#ifndef USB_DEBUGGER
UINT16 m_BaseAddr;
// UINT8 m_IsCOMPortInListenMode;
// UINT32 m_ReadAttempts; //only for debugging purpose -remove later
// UINT8 m_CacheRecvFIFO[24];
// UINT8 m_CacheSize;
// UINT8 m_CacheIndex;
//To obtain info from Porting template support, and use it to publish HOB
UINT8 m_SIO_LDN_UART; //Logical Device Number for COM port
#else
UINT32 USBBASE;
UINT32 USB2_DEBUG_PORT_REGISTER_INTERFACE;
UINT8 gDebugUSBAddress;
UINT8 gDebugInEndpoint;
UINT8 gDebugOutEndpoint;
GET_DESCRIPTOR_DEBUG_PORT Descriptor;
UINT8 gUSBBulkTransferSetAddr;
UINT8 gIN_DATAPID;
UINT8 gOUT_DATAPID;
UINT8 gIN_DATABUFFER[8];
UINT8 gOUT_DATABUFFER[8];
UINT8 gCurrentINDataBufferLength;
UINT8 gCurrentINDataBufferIndex;
UINT8 gCurrentOUTDataBufferIndex;
UINT8 lastdata;
UINT8 gIsUsbDebugPortInUse;
// UINT8 gIsUsbDebugPortInListenMode;
//To obtain info from Porting template support, and use it to publish HOB
UINT16 m_EHCI_MEMORY_SIZE;
UINT8 m_PCI_EHCI_BUS_NUMBER;
UINT8 m_PCI_EHCI_DEVICE_NUMBER;
UINT8 m_PCI_EHCI_FUNCTION_NUMBER;
UINT8 m_PCI_EHCI_BAR_OFFSET;
#endif
UINT64 m_PeiDbgRxInitTimerVal;
}SerXPortGblData_T;
typedef struct {
AMI_PEI_TRANSPORT_PROTOCOL *gTransportProtocol;
UINT16 (*Handler)();
//Additional parameters added in order to support DXE phase callback of
//IRQ register handlers
UINTN InterruptType;
UINTN ContextData;
VOID (*IRQRegisterHandler)(UINTN,UINTN);
#ifdef USB_DEBUGGER
//Additional interface for PeiDbgSIO module to reinit EHCI memory base
// void (*PeiDbgSIO_Init_USB_EHCI)(UINTN PeiDbgData_BaseAddr,UINTN MMIO_BaseAddr);
// void (*PeiDbgSIO_Init_USB_EHCI)(UINTN UsbBaseAddress, UINTN *Usb2DebugPortReg);
void (*PeiDbgSIO_Init_USB_EHCI)(VOID *);
#endif
}SerXPortGblVar_T;
typedef struct {
UINT8 m_BrkPtType;
UINT16 m_CS;
UINT32 m_EIP;
UINT16 m_SS;
UINT32 m_ESP;
UINT32 m_DR2;
UINT32 m_DR7;
UINT8 m_TargetRunning;
UINT8 m_DbgrBusy;
UINT8 m_DR2Valid;
UINT8 m_GPOccrd;
UINT8 m_MSRState;
UINT8 m_NotifyAndBreak;
UINT16 m_DbgSendBufSize;
UINT16 m_DbgRcvBufSize;
VOID (*PeiDbgrReportStatusCode)();
UINT8 m_FlagToDebugAfterMemory;
UINTN (*PeiDbgr_EnableDebugSupport)(UINTN BrkPtAddr);
AMI_DEBUGGER_INTERFACE *pPeiDbgDbgrIfc;
UINT8 m_TargetState;
VOID* m_ppPeiSVC;
EFI_STATUS (*UpdateFVHob)();
}DbgGblData_T;
#pragma pack()
#pragma pack(1)
typedef struct {
UINT16 m_OffLow;
UINT16 m_SegSel;
UINT16 m_Reserved;
UINT16 m_OffHigh;
}IDTEntry_T;
typedef struct {
UINT16 IDTLength;
UINTN IDTBaseAddr; //should work for both 32 and 64 mode
}IDTBASE;
typedef UINT8 (DBG_IS_S3)(void);
#pragma pack()
void DriverSpecialBreakPoint(UINT32 EaxVal, UINT32 EdxVal);
#endif
//*****************************************************************//
//*****************************************************************//
//*****************************************************************//
//** **//
//** (C)Copyright 2009, American Megatrends, Inc. **//
//** **//
//** All Rights Reserved. **//
//** **//
//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 **//
//** **//
//** Phone (770)-246-8600 **//
//** **//
//*****************************************************************//
//*****************************************************************//
//*****************************************************************//
|