3 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 extern EDB_DISASM_INSTRUCTION mEdbDisasmInstructionTable
[];
20 CHAR16 Name
[EDB_INSTRUCTION_NAME_MAX_LENGTH
];
21 CHAR16 Content
[EDB_INSTRUCTION_CONTENT_MAX_LENGTH
];
23 } EDB_INSTRUCTION_STRING
;
25 EDB_INSTRUCTION_STRING mInstructionString
;
26 UINTN mInstructionNameOffset
;
27 UINTN mInstructionContentOffset
;
31 Set offset for Instruction name and content.
33 @param InstructionNameOffset - Instruction name offset
34 @param InstructionContentOffset - Instruction content offset
39 IN UINTN InstructionNameOffset
,
40 IN UINTN InstructionContentOffset
43 mInstructionNameOffset
= InstructionNameOffset
;
44 mInstructionContentOffset
= InstructionContentOffset
;
51 Pre instruction string construction.
53 @return Instruction string
57 EdbPreInstructionString (
61 ZeroMem (&mInstructionString
, sizeof(mInstructionString
));
62 mInstructionNameOffset
= 0;
63 mInstructionContentOffset
= 0;
65 return (CHAR16
*)&mInstructionString
;
70 Post instruction string construction.
72 @return Instruction string
76 EdbPostInstructionString (
82 for (Char
= (CHAR16
*)&mInstructionString
; Char
< &mInstructionString
.Tail
; Char
++) {
87 mInstructionString
.Tail
= 0;
89 mInstructionNameOffset
= 0;
90 mInstructionContentOffset
= 0;
92 return (CHAR16
*)&mInstructionString
;
97 Get Sign, NaturalUnits, and ConstantUnits of the WORD data.
99 @param Data16 - WORD data
100 @param NaturalUnits - Natural Units of the WORD
101 @param ConstantUnits - Constant Units of the WORD
103 @return Sign value of WORD
107 EdbGetNaturalIndex16 (
109 OUT UINTN
*NaturalUnits
,
110 OUT UINTN
*ConstantUnits
114 UINTN NaturalUnitBit
;
116 Sign
= (BOOLEAN
)(Data16
>> 15);
117 NaturalUnitBit
= (UINTN
)((Data16
>> 12) & 0x7);
119 Data16
= Data16
& 0xFFF;
120 *NaturalUnits
= (UINTN
)(Data16
& ((1 << NaturalUnitBit
) - 1));
121 *ConstantUnits
= (UINTN
)((Data16
>> NaturalUnitBit
) & ((1 << (12 - NaturalUnitBit
)) - 1));
128 Get Sign, NaturalUnits, and ConstantUnits of the DWORD data.
130 @param Data32 - DWORD data
131 @param NaturalUnits - Natural Units of the DWORD
132 @param ConstantUnits - Constant Units of the DWORD
134 @return Sign value of DWORD
138 EdbGetNaturalIndex32 (
140 OUT UINTN
*NaturalUnits
,
141 OUT UINTN
*ConstantUnits
145 UINTN NaturalUnitBit
;
147 Sign
= (BOOLEAN
)(Data32
>> 31);
148 NaturalUnitBit
= (UINTN
)((Data32
>> 28) & 0x7);
150 Data32
= Data32
& 0xFFFFFFF;
151 *NaturalUnits
= (UINTN
)(Data32
& ((1 << NaturalUnitBit
) - 1));
152 *ConstantUnits
= (UINTN
)((Data32
>> NaturalUnitBit
) & ((1 << (28 - NaturalUnitBit
)) - 1));
159 Get Sign, NaturalUnits, and ConstantUnits of the QWORD data.
161 @param Data64 - QWORD data
162 @param NaturalUnits - Natural Units of the QWORD
163 @param ConstantUnits - Constant Units of the QWORD
165 @return Sign value of QWORD
169 EdbGetNaturalIndex64 (
171 OUT UINT64
*NaturalUnits
,
172 OUT UINT64
*ConstantUnits
176 UINTN NaturalUnitBit
;
178 Sign
= (BOOLEAN
)RShiftU64 (Data64
, 63);
179 NaturalUnitBit
= (UINTN
)(RShiftU64 (Data64
, 60) & 0x7);
181 Data64
= RShiftU64 (LShiftU64 (Data64
, 4), 4);
182 *NaturalUnits
= (UINT64
)(Data64
& (LShiftU64 (1, NaturalUnitBit
) - 1));
183 *ConstantUnits
= (UINT64
)(RShiftU64 (Data64
, NaturalUnitBit
) & (LShiftU64 (1, (60 - NaturalUnitBit
)) - 1));
190 Get Bit Width of the value.
202 if (Value
>= 10000000000000) {
204 } else if (Value
>= 1000000000000) {
206 } else if (Value
>= 100000000000) {
208 } else if (Value
>= 10000000000) {
210 } else if (Value
>= 1000000000) {
212 } else if (Value
>= 100000000) {
214 } else if (Value
>= 10000000) {
216 } else if (Value
>= 1000000) {
218 } else if (Value
>= 100000) {
220 } else if (Value
>= 10000) {
222 } else if (Value
>= 1000) {
224 } else if (Value
>= 100) {
226 } else if (Value
>= 10) {
235 Print the instruction name.
237 @param Name - instruction name
239 @return Instruction name offset
243 EdbPrintInstructionName (
247 EDBSPrintWithOffset (
248 mInstructionString
.Name
,
249 EDB_INSTRUCTION_NAME_MAX_SIZE
,
250 mInstructionNameOffset
,
254 mInstructionNameOffset
+= StrLen (Name
);
256 return mInstructionNameOffset
;
261 Print register 1 in operands.
263 @param Operands - instruction operands
265 @return Instruction content offset
273 if ((Operands
& OPERAND_M_INDIRECT1
) != 0) {
274 EDBSPrintWithOffset (
275 mInstructionString
.Content
,
276 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
277 mInstructionContentOffset
,
280 mInstructionContentOffset
+= 1;
282 EDBSPrintWithOffset (
283 mInstructionString
.Content
,
284 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
285 mInstructionContentOffset
,
287 (UINTN
)(Operands
& OPERAND_M_OP1
)
289 mInstructionContentOffset
+= 2;
291 return mInstructionContentOffset
;
296 Print register 2 in operands.
298 @param Operands - instruction operands
300 @return Instruction content offset
308 if ((Operands
& OPERAND_M_INDIRECT2
) != 0) {
309 EDBSPrintWithOffset (
310 mInstructionString
.Content
,
311 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
312 mInstructionContentOffset
,
315 mInstructionContentOffset
+= 1;
317 EDBSPrintWithOffset (
318 mInstructionString
.Content
,
319 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
320 mInstructionContentOffset
,
322 (UINTN
)((Operands
& OPERAND_M_OP2
) >> 4)
324 mInstructionContentOffset
+= 2;
326 return mInstructionContentOffset
;
331 Print dedicated register 1 in operands.
333 @param Operands - instruction operands
335 @return Instruction content offset
339 EdbPrintDedicatedRegister1 (
343 switch (Operands
& OPERAND_M_OP1
) {
345 EDBSPrintWithOffset (
346 mInstructionString
.Content
,
347 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
348 mInstructionContentOffset
,
351 mInstructionContentOffset
+= 7;
354 EDBSPrintWithOffset (
355 mInstructionString
.Content
,
356 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
357 mInstructionContentOffset
,
360 mInstructionContentOffset
+= 4;
364 return mInstructionContentOffset
;
369 Print dedicated register 2 in operands.
371 @param Operands - instruction operands
373 @return Instruction content offset
377 EdbPrintDedicatedRegister2 (
381 switch ((Operands
& OPERAND_M_OP2
) >> 4) {
383 EDBSPrintWithOffset (
384 mInstructionString
.Content
,
385 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
386 mInstructionContentOffset
,
389 mInstructionContentOffset
+= 7;
392 EDBSPrintWithOffset (
393 mInstructionString
.Content
,
394 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
395 mInstructionContentOffset
,
398 mInstructionContentOffset
+= 4;
402 return mInstructionContentOffset
;
407 Print the hexical UINTN index data to instruction content.
409 @param Sign - Signed bit of UINTN data
410 @param NaturalUnits - natural units of UINTN data
411 @param ConstantUnits - natural units of UINTN data
413 @return Instruction content offset
419 IN UINTN NaturalUnits
,
420 IN UINTN ConstantUnits
423 EDBSPrintWithOffset (
424 mInstructionString
.Content
,
425 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
426 mInstructionContentOffset
,
433 mInstructionContentOffset
= mInstructionContentOffset
+ 5 + EdbGetBitWidth (NaturalUnits
) + EdbGetBitWidth (ConstantUnits
);
435 return mInstructionContentOffset
;
440 Print the hexical QWORD index data to instruction content.
442 @param Sign - Signed bit of QWORD data
443 @param NaturalUnits - natural units of QWORD data
444 @param ConstantUnits - natural units of QWORD data
446 @return Instruction content offset
450 EdbPrintIndexData64 (
452 IN UINT64 NaturalUnits
,
453 IN UINT64 ConstantUnits
456 EDBSPrintWithOffset (
457 mInstructionString
.Content
,
458 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
459 mInstructionContentOffset
,
466 mInstructionContentOffset
= mInstructionContentOffset
+ 5 + EdbGetBitWidth (NaturalUnits
) + EdbGetBitWidth (ConstantUnits
);
468 return mInstructionContentOffset
;
473 Print the hexical WORD raw index data to instruction content.
475 @param Data16 - WORD data
477 @return Instruction content offset
481 EdbPrintRawIndexData16 (
490 Sign
= EdbGetNaturalIndex16 (Data16
, &NaturalUnits
, &ConstantUnits
);
491 Offset
= EdbPrintIndexData (Sign
, NaturalUnits
, ConstantUnits
);
498 Print the hexical DWORD raw index data to instruction content.
500 @param Data32 - DWORD data
502 @return Instruction content offset
506 EdbPrintRawIndexData32 (
515 Sign
= EdbGetNaturalIndex32 (Data32
, &NaturalUnits
, &ConstantUnits
);
516 Offset
= EdbPrintIndexData (Sign
, NaturalUnits
, ConstantUnits
);
523 Print the hexical QWORD raw index data to instruction content.
525 @param Data64 - QWORD data
527 @return Instruction content offset
531 EdbPrintRawIndexData64 (
537 UINT64 ConstantUnits
;
540 Sign
= EdbGetNaturalIndex64 (Data64
, &NaturalUnits
, &ConstantUnits
);
541 Offset
= EdbPrintIndexData64 (Sign
, NaturalUnits
, ConstantUnits
);
548 Print the hexical BYTE immediate data to instruction content.
550 @param Data - BYTE data
552 @return Instruction content offset
560 EDBSPrintWithOffset (
561 mInstructionString
.Content
,
562 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
563 mInstructionContentOffset
,
567 mInstructionContentOffset
+= 6;
569 return mInstructionContentOffset
;
574 Print the hexical WORD immediate data to instruction content.
576 @param Data - WORD data
578 @return Instruction content offset
586 EDBSPrintWithOffset (
587 mInstructionString
.Content
,
588 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
589 mInstructionContentOffset
,
593 mInstructionContentOffset
+= 8;
595 return mInstructionContentOffset
;
600 Print the hexical DWORD immediate data to instruction content.
602 @param Data - DWORD data
604 @return Instruction content offset
612 EDBSPrintWithOffset (
613 mInstructionString
.Content
,
614 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
615 mInstructionContentOffset
,
619 mInstructionContentOffset
+= 12;
621 return mInstructionContentOffset
;
626 Print the hexical QWORD immediate data to instruction content.
628 @param Data - QWORD data
630 @return Instruction content offset
638 EDBSPrintWithOffset (
639 mInstructionString
.Content
,
640 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
641 mInstructionContentOffset
,
645 mInstructionContentOffset
+= 20;
647 return mInstructionContentOffset
;
652 Print the decimal UINTN immediate data to instruction content.
654 @param Data - UINTN data
656 @return Instruction content offset
664 EDBSPrintWithOffset (
665 mInstructionString
.Content
,
666 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
667 mInstructionContentOffset
,
671 mInstructionContentOffset
= mInstructionContentOffset
+ 2 + EdbGetBitWidth (Data
);
673 return mInstructionContentOffset
;
678 Print the decimal QWORD immediate data to instruction content.
680 @param Data64 - QWORD data
682 @return Instruction content offset
690 EDBSPrintWithOffset (
691 mInstructionString
.Content
,
692 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
693 mInstructionContentOffset
,
697 mInstructionContentOffset
= mInstructionContentOffset
+ 2 + EdbGetBitWidth (Data64
);
699 return mInstructionContentOffset
;
704 Print the hexical BYTE to instruction content.
706 @param Data8 - BYTE data
708 @return Instruction content offset
716 EDBSPrintWithOffset (
717 mInstructionString
.Content
,
718 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
719 mInstructionContentOffset
,
723 mInstructionContentOffset
+= 4;
725 return mInstructionContentOffset
;
730 Print the hexical WORD to instruction content.
732 @param Data16 - WORD data
734 @return Instruction content offset
742 EDBSPrintWithOffset (
743 mInstructionString
.Content
,
744 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
745 mInstructionContentOffset
,
749 mInstructionContentOffset
+= 6;
751 return mInstructionContentOffset
;
756 Print the hexical DWORD to instruction content.
758 @param Data32 - DWORD data
760 @return Instruction content offset
768 EDBSPrintWithOffset (
769 mInstructionString
.Content
,
770 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
771 mInstructionContentOffset
,
775 mInstructionContentOffset
+= 10;
777 return mInstructionContentOffset
;
782 Print the hexical QWORD to instruction content.
784 @param Data64 - QWORD data
786 @return Instruction content offset
794 EDBSPrintWithOffset (
795 mInstructionString
.Content
,
796 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
797 mInstructionContentOffset
,
801 mInstructionContentOffset
+= 18;
803 return mInstructionContentOffset
;
808 Print the decimal unsigned UINTN to instruction content.
810 @param Data - unsigned UINTN data
812 @return Instruction content offset
820 EDBSPrintWithOffset (
821 mInstructionString
.Content
,
822 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
823 mInstructionContentOffset
,
827 mInstructionContentOffset
= mInstructionContentOffset
+ EdbGetBitWidth (Data
);
829 return mInstructionContentOffset
;
834 Print the decimal unsigned QWORD to instruction content.
836 @param Data64 - unsigned QWORD data
838 @return Instruction content offset
846 EDBSPrintWithOffset (
847 mInstructionString
.Content
,
848 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
849 mInstructionContentOffset
,
853 mInstructionContentOffset
= mInstructionContentOffset
+ EdbGetBitWidth (Data64
);
855 return mInstructionContentOffset
;
860 Print the decimal signed BYTE to instruction content.
862 @param Data8 - signed BYTE data
864 @return Instruction content offset
874 Sign
= (BOOLEAN
)(Data8
>> 7);
876 EDBSPrintWithOffset (
877 mInstructionString
.Content
,
878 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
879 mInstructionContentOffset
,
882 (UINTN
)(Data8
& 0x7F)
884 mInstructionContentOffset
= mInstructionContentOffset
+ 1 + EdbGetBitWidth (Data8
& 0x7F);
886 return mInstructionContentOffset
;
891 Print the decimal signed WORD to instruction content.
893 @param Data16 - signed WORD data
895 @return Instruction content offset
905 Sign
= (BOOLEAN
)(Data16
>> 15);
907 EDBSPrintWithOffset (
908 mInstructionString
.Content
,
909 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
910 mInstructionContentOffset
,
913 (UINTN
)(Data16
& 0x7FFF)
915 mInstructionContentOffset
= mInstructionContentOffset
+ 1 + EdbGetBitWidth (Data16
& 0x7FFF);
917 return mInstructionContentOffset
;
922 Print the decimal signed DWORD to instruction content.
924 @param Data32 - signed DWORD data
926 @return Instruction content offset
936 Sign
= (BOOLEAN
)(Data32
>> 31);
938 EDBSPrintWithOffset (
939 mInstructionString
.Content
,
940 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
941 mInstructionContentOffset
,
944 (UINTN
)(Data32
& 0x7FFFFFFF)
946 mInstructionContentOffset
= mInstructionContentOffset
+ 1 + EdbGetBitWidth (Data32
& 0x7FFFFFFF);
948 return mInstructionContentOffset
;
953 Print the decimal signed QWORD to instruction content.
955 @param Data64 - signed QWORD data
957 @return Instruction content offset
968 Sign
= (BOOLEAN
)RShiftU64 (Data64
, 63);
969 Data64s
= (INT64
)RShiftU64 (LShiftU64 (Data64
, 1), 1);
971 EDBSPrintWithOffset (
972 mInstructionString
.Content
,
973 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
974 mInstructionContentOffset
,
979 mInstructionContentOffset
= mInstructionContentOffset
+ 1 + EdbGetBitWidth (Data64s
);
981 return mInstructionContentOffset
;
986 Print the comma to instruction content.
988 @return Instruction content offset
996 EDBSPrintWithOffset (
997 mInstructionString
.Content
,
998 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
999 mInstructionContentOffset
,
1002 mInstructionContentOffset
+= 2;
1004 return mInstructionContentOffset
;
1009 Find the symbol string according to address, then print it.
1011 @param Address - instruction address
1013 @retval 1 - symbol string is found and printed
1014 @retval 0 - symbol string not found
1018 EdbFindAndPrintSymbol (
1024 SymbolStr
= FindSymbolStr (Address
);
1025 if (SymbolStr
!= NULL
) {
1026 EDBSPrintWithOffset (
1027 mInstructionString
.Content
,
1028 EDB_INSTRUCTION_CONTENT_MAX_SIZE
,
1029 mInstructionContentOffset
,
1041 Print the EBC byte code.
1043 @param InstructionAddress - instruction address
1044 @param InstructionNumber - instruction number
1049 IN EFI_PHYSICAL_ADDRESS InstructionAddress
,
1050 IN UINTN InstructionNumber
1059 if (InstructionNumber
== 0) {
1063 LineNumber
= InstructionNumber
/ EDB_BYTECODE_NUMBER_IN_LINE
;
1064 ByteNumber
= InstructionNumber
% EDB_BYTECODE_NUMBER_IN_LINE
;
1065 if (ByteNumber
== 0) {
1067 ByteNumber
= EDB_BYTECODE_NUMBER_IN_LINE
;
1073 SymbolStr
= FindSymbolStr ((UINTN
)InstructionAddress
);
1074 if (SymbolStr
!= NULL
) {
1075 EDBPrint (L
"[%a]:\n", SymbolStr
);
1078 for (LineIndex
= 0; LineIndex
< LineNumber
; LineIndex
++) {
1079 EDBPrint (EDB_PRINT_ADDRESS_FORMAT
, (UINTN
)InstructionAddress
);
1080 for (ByteIndex
= 0; ByteIndex
< EDB_BYTECODE_NUMBER_IN_LINE
; ByteIndex
++) {
1081 EDBPrint (L
"%02x ", *(UINT8
*)(UINTN
)InstructionAddress
);
1082 InstructionAddress
+= 1;
1087 EDBPrint (EDB_PRINT_ADDRESS_FORMAT
, (UINTN
)InstructionAddress
);
1088 for (ByteIndex
= 0; ByteIndex
< ByteNumber
; ByteIndex
++) {
1089 EDBPrint (L
"%02x ", *(UINT8
*)(UINTN
)InstructionAddress
);
1090 InstructionAddress
+= 1;
1092 for (ByteIndex
= 0; ByteIndex
< EDB_BYTECODE_NUMBER_IN_LINE
- ByteNumber
; ByteIndex
++) {
1101 Print the EBC asm code.
1103 @param DebuggerPrivate - EBC Debugger private data structure
1104 @param SystemContext - EBC system context.
1106 @retval EFI_SUCCESS - show disasm successfully
1111 IN EFI_DEBUGGER_PRIVATE_DATA
*DebuggerPrivate
,
1112 IN EFI_SYSTEM_CONTEXT SystemContext
1115 EFI_PHYSICAL_ADDRESS InstructionAddress
;
1116 UINTN InstructionNumber
;
1117 UINTN InstructionLength
;
1119 CHAR16
*InstructionString
;
1122 InstructionAddress
= DebuggerPrivate
->InstructionScope
;
1123 for (InstructionNumber
= 0; InstructionNumber
< DebuggerPrivate
->InstructionNumber
; InstructionNumber
++) {
1126 // Break each 0x10 instruction
1128 if (((InstructionNumber
% EFI_DEBUGGER_LINE_NUMBER_IN_PAGE
) == 0) &&
1129 (InstructionNumber
!= 0)) {
1130 if (SetPageBreak ()) {
1135 Opcode
= GET_OPCODE(InstructionAddress
);
1136 if ((Opcode
< OPCODE_MAX
) && (mEdbDisasmInstructionTable
[Opcode
] != NULL
)) {
1137 InstructionLength
= mEdbDisasmInstructionTable
[Opcode
] (InstructionAddress
, SystemContext
, &InstructionString
);
1138 if (InstructionLength
!= 0) {
1143 // Result = EdbPrintSource ((UINTN)InstructionAddress, FALSE);
1145 if (!DebuggerPrivate
->DebuggerSymbolContext
.DisplayCodeOnly
) {
1147 EdbPrintRaw (InstructionAddress
, InstructionLength
);
1148 if (InstructionString
!= NULL
) {
1149 EDBPrint (L
"%s\n", InstructionString
);
1151 EDBPrint (L
"%s\n", L
"<Unknown Instruction>");
1155 EdbPrintSource ((UINTN
)InstructionAddress
, TRUE
);
1157 InstructionAddress
+= InstructionLength
;
1160 // Something wrong with OPCODE
1162 EdbPrintRaw (InstructionAddress
, EDB_BYTECODE_NUMBER_IN_LINE
);
1163 EDBPrint (L
"%s\n", L
"<Bad Instruction>");
1168 // Something wrong with OPCODE
1170 EdbPrintRaw (InstructionAddress
, EDB_BYTECODE_NUMBER_IN_LINE
);
1171 EDBPrint (L
"%s\n", L
"<Bad Instruction>");
1181 Get register value according to the system context, and register index.
1183 @param SystemContext - EBC system context.
1184 @param Index - EBC register index
1186 @return register value
1191 IN EFI_SYSTEM_CONTEXT SystemContext
,
1197 return SystemContext
.SystemContextEbc
->R0
;
1199 return SystemContext
.SystemContextEbc
->R1
;
1201 return SystemContext
.SystemContextEbc
->R2
;
1203 return SystemContext
.SystemContextEbc
->R3
;
1205 return SystemContext
.SystemContextEbc
->R4
;
1207 return SystemContext
.SystemContextEbc
->R5
;
1209 return SystemContext
.SystemContextEbc
->R6
;
1211 return SystemContext
.SystemContextEbc
->R7
;