EFI рдмрд╛рдЗрдЯ рдХреЛрдб рддрдХрдиреАрдХ (рд╢реЙрд░реНрдЯ рдИрдмреАрд╕реА рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдлрд╝рд░реНрдо
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЧрдП рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░
рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдпреВрдирд┐рдлрд╛рдЗрдб рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдлрд░реНрдорд╡реЗрдпрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдПрдХ рдИрдмреАрд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдпреВрдИрдПрдлрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд╛рд▓рди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рдж рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреНрд░реЙрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рдЖрдк рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдореВрд▓ рдХреЛрдб рдореЗрдВ рд╕рдмрд░реВрдЯреАрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдПрдХ рдИрдмреАрд╕реА рдЖрд╡реЗрджрди рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ MSR (рдореЙрдбрд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░) рдкрдврд╝рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, x86 рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд╕рд┐рд╕реНрдЯрдо RDMSR (Read MSR) рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ ECX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ 32-рдмрд┐рдЯ MSR рдкрддрд╛ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ EDX (рдЙрдЪреНрдЪ 32 рдмрд┐рдЯреНрд╕) рдФрд░ EAX (рдХрдо 32 рдмрд┐рдЯреНрд╕) рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ 64-рдмрд┐рдЯ MSR рд╕рд╛рдордЧреНрд░реА рджреЗрддрд╛ рд╣реИред )ред рдИрдмреАрд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рджреЗрд╢реА рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдмрд░реВрдЯреАрди рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
UEFImark x64 рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ,
RDMSR рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░
UEFImark EBC рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП EBC рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рджреЗрд╢реА рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкреНрд░рдпреЛрдЧ рдХреА рд╕реНрдерд┐рддрд┐
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╢реНрди рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдИрдмреАрд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ x86 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ IA32 рдпрд╛ x64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ, рдЗрд╕реЗ рдмрд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, FASM 1.69.50 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдИрдмреАрд╕реА рдирд┐рд░реНрджреЗрд╢ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, x86 рдХреЛрдб 64-рдмрд┐рдЯ рдореЛрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 32-рдмрд┐рдЯ рдореЛрдб рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рд╕рдВрдЧрддрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред
рдХреЙрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ EBC_Read_MSR
;--- Subroutine: EBC/x86 gate for Read MSR ----------------------------------; ; Caller must verify x86 support (IA32 or x64) before call this subroutine, ; ; but this subroutine differentiate IA32/x64 internally. ; ; ; ; INPUT: R1 = Global variables pool base address ; ; R6 = MSR index (same as ECX before RDMSR instruction) ; ; OUTPUT: R3 = MSR data after Read (same as EDX:EAX after RDMSR instruction) ; ; R4-R7 can be changed ; ;----------------------------------------------------------------------------; EBC_Read_MSR: XOR64 R7,R7 ; R7=0 PUSH64 R7 ; Storage for output MOVQ R7,R0 ; Address of storage = stack pointer PUSHN R7 ; Parameter#2 = Output address PUSHN R6 ; Parameter#1 = MSR address MOVINW R7,1,0 CMPI32WEQ R7,4 ; R7=4 for 32-bit, R7=8 for 64-bit MOVIQW R7,_IA32_Read_MSR ; This pointer for IA32 (native width=4) JMP8CS Native_Gate MOVIQW R7,_x64_Read_MSR ; This pointer for x64 (native width=8) Native_Gate: ADD64 R7,R1 ; Add base address = R1 CALL32EXA R7 POPN R6 ; Remove Parameter#1 POPN R7 ; Remove Parameter#2 POP64 R3 ; Read R3 = Output RET
рдЕрдВрдЬреАрд░ред рез ред
X86 MSR рд░реАрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ EBC рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╣рддреЗ рд╣реИрдВрдХреЙрд▓рд┐рдВрдЧ рдИрдмреАрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
- 64-рдмрд┐рдЯ рдЪрд░ рдХреЗ рдвреЗрд░ рдореЗрдВ рдПрдХ рдЖрд░рдХреНрд╖рдг рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ MSR рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓рд┐рдЦреЗрдЧреАред
- рд╕реНрдЯреИрдХ рдХреЛ рд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ - рдПрдордПрд╕рдЖрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддрд╛ред рдпрд╣ рдЪрд░рдг 1 рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдЪрд░ рдХрд╛ рдкрддрд╛ рд╣реИред
- рд╕реНрдЯреИрдХ рдХреЛ рд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд▓рд┐рдЦрдирд╛ - рдПрдордПрд╕рдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдкрддрд╛, рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрд░ 6 рдореЗрдВ рд╕рдмрд░реВрдЯреАрди рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ред
- EBC рдирд┐рд░реНрджреЗрд╢ MOVINW рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХреНрд╖рдорддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдгред рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо x86- рд╕рдВрдЧрдд рд╣реИ, рддреЛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдмрд┐рдЯ 4 рдХрд╛ рдорд╛рди IA32 (4 рдмрд╛рдЗрдЯреНрд╕ = 32 рдмрд┐рдЯреНрд╕), 8 рдХрд╛ рдорддрд▓рдм x64 (8 рдмрд╛рдЗрдЯреНрд╕ = 64 рдмрд┐рдЯреНрд╕) рд╣реИред
- рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдбреНрд░реЗрд╕ рдХреЛ рдЪреБрдиреЗ рдЧрдП рд╕рдмрд░реВрдЯреАрди (рдЪрд░рдг 4 рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдФрд░ R7 рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрдХрд░ред
- рдЪрд░рдг 5 рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкрддреЗ рдкрд░ рд╕рдмрд░реВрдЯреАрди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
- рд╕реНрдЯреИрдХ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛, рдЪрд░рдг 1 рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ R3 рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд░реВрдЯреАрди рдиреЗ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрд╛ рдерд╛ - 64-рдмрд┐рдЯ MSR рд╕рд╛рдордЧреНрд░реАред
PUSHN (рдкреБрд╢ рдиреЗрдЪреБрд░рд▓) рдирд┐рд░реНрджреЗрд╢реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреИрдХ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рдФрд░ POPN (рдкреЙрдк рдиреЗрдЪреБрд░рд▓) рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕реНрдЯреИрдХ рд╕реЗ рдкрдврд╝реЗрдВ IA32 UEFI рдХреЗ рд▓рд┐рдП 32 рдмрд┐рдЯреНрд╕ рдФрд░ x64 UEFI рдХреЗ рд▓рд┐рдП 64 рдмрд┐рдЯреНрд╕ рд╣реИрдВред
рдХреЙрд▓ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛: IA32_Read_MSR, x64_Read_MSR
;--- Read Model-Specific Register, selected by input index --------------; ; INPUT: Parm#1 = MSR address (ECX before RDMSR), natural width 32/64 ; ; Parm#2 = Address for write output data, natural width 32/64 ; ; OUTPUT: R7 = Reserved for UEFI status ; ; QWORD at Address [Parm#2] = MSR data (EDX:EAX after RDMSR) ; ;------------------------------------------------------------------------; IA32_Read_MSR: ; Entry point for IA32 push rbx rcx rdx mov ecx,[rsp+16] ; ECX = Parm#1 = MSR address, assembled same as [esp+16], can use for IA32 mov ebx,[rsp+20] ; EBX = Parm#2 = Output address, assembled same as [esp+20], can use for IA32 jmp Entry_R_MSR x64_Read_MSR: ; Entry point for x64 push rbx rcx rdx mov rbx,rdx ; RBX=Output address (p#2), RCX=MSR address (p#1) Entry_R_MSR: rdmsr ; RCX=Input, EDX:EAX=Output mov [rbx+00],eax mov [rbx+04],edx pop rdx rcx rbx ret
рдЕрдВрдЬреАрд░ред реи ред
X86 рдХреЛ MSR рд░реАрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИX86 рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
- IA32 рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ (рд▓реЗрдмрд▓ IA32_Read_MSR)ред EBX, ECX, EDX рдХреЗ рдвреЗрд░ рдореЗрдВ рдмрдЪрддред рдЗрдирдкреБрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рд╕реЗ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдордПрд╕рдЖрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдордПрд╕рдЖрд░ рдкрддрд╛ рдФрд░ рдЪрд░ рдкрддрд╛ред рдЪрд░рдг 3 рдкрд░ рдЬрд╛рдПрдВред
- X64 рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ (рд▓реЗрдмрд▓ x64_Read_MSR)ред рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реНрдЯреИрдХ рдЖрд░рдмреАрдПрдХреНрд╕, рдЖрд░рд╕реАрдПрдХреНрд╕, рдЖрд░рдбреАрдПрдХреНрд╕ рдореЗрдВ рдмрдЪрддред рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ RCX рдФрд░ RDX рдХреНрд░рдорд╢рдГ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред
- рд▓рдХреНрд╖реНрдп рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ - RDMSR рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ MSR рдкрдврд╝реЗрдВред
- рджреВрд╕рд░реЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рд░реАрдб рдПрдордПрд╕рдЖрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рд╣реЗрдЬрдирд╛ред
- рд░рдЬрд┐рд╕реНрдЯрд░ EDX, ECX, EBX (IA32 рдХреЗ рд▓рд┐рдП) рдпрд╛ RDX, RCX, RBX (x64 рдХреЗ рд▓рд┐рдП) рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдХреЙрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд▓реМрдЯреЗрдВред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рдПрдХ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: 64-рдмрд┐рдЯ рдореЛрдб рдореЗрдВ рдХрдИ рдирд┐рд░реНрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрди рдХреА 32-рдмрд┐рдЯ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд PUSH рдФрд░ POP рдирд┐рд░реНрджреЗрд╢ред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ 32-рдмрд┐рдЯ рдФрд░ 64-рдмрд┐рдЯ рд░реВрдкреЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рддреЛ, 32-рдмрд┐рдЯ рдореЛрдб рдореЗрдВ рдХреЛрдб 53h PUSH EBX рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ 64-рдмрд┐рдЯ рдореЛрдб рдореЗрдВ рдпрд╣ PUSH RBX рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдЙрдкрдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдЪрд░рдг рддрдВрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
IA32 EFI рдХреЗ рд▓рд┐рдП, рдХреЙрд▓ рдХрд┐рдП рдЧрдП рд░реВрдЯреАрди рдХреЗ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ [ESP + 16] рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдСрдлрд╕реЗрдЯ 16 рджреЛ рд╢рдмреНрджреЛрдВ рд╕реЗ рдмрдирд╛ рд╣реИ: 4 рд╕реНрдЯреИрдХ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ EIP рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕рдмрд░реВрдЯреАрди рд╕реЗ рд▓реМрдЯрддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, EBX, ECX, EDX рдХреЗ рд▓рд┐рдП 12 рдмрд╛рдЗрдЯреНрд╕ рдЬреЛ PUSH рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреИрдХ рдХреЛ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред 4 + 12 = 16ред
X64 UEFI рдХреЗ рд▓рд┐рдП, рдмреБрд▓рд╛рдпрд╛ рд╕рдмрд░реВрдЯреАрди рдХреЗ рдкрд╣рд▓реЗ рдЪрд╛рд░ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ RCX, RDX, R8, R9, рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЧрд▓реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЗрд╡рд▓ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ RCX рдФрд░ RDX рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
IA32 UEFI рдХреЗ рд▓рд┐рдП, x86 рд╕рдмрд░реВрдЯреАрди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж 32-рдмрд┐рдЯ x86 EAX рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА 64-рдмрд┐рдЯ EBC рд░рдЬрд┐рд╕реНрдЯрд░ R7 рдХреЗ 32 рд▓реЛ-рдСрд░реНрдбрд░ рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╣реИрдВред R7 рдХреЗ рдЙрдЪреНрдЪ 32 рдмрд┐рдЯреНрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред X64 UEFI рдХреЗ рд▓рд┐рдП, x86 рд╕рдмрд░реВрдЯреАрди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж 64-рдмрд┐рдЯ x86 RAX рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА EBC рд░рдЬрд┐рд╕реНрдЯрд░ R7 рдореЗрдВ рд╣реИрдВред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрдЯреЗрдЯрд╕ рдХреЛрдбреНрд╕ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ; рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдЖрд╡реЗрджрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпреВрдИрдПрдлрдЖрдИ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди, рдЬрд┐рд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдлрд░реНрдорд╡реЗрдпрд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
CPU рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░
рдлрд╛рдЗрд▓ I / O рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред
рд╕рд╛рд░рд╛рдВрд╢
рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм
EFI рдмрд╛рдЗрдЯ рдХреЛрдб рдХреЗ рднреАрддрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛред рддреЛ, рд╕реВрдЪрдирд╛-рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдЙрдкрдпреЛрдЧрд┐рддрд╛
рдпреВрдИрдПрдлрдорд╛рд░реНрдХ рдИрдмреАрд╕реА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдореВрд▓ рдХреЛрдб рдореЗрдВ рд╕реАрдкреАрдпреВрдЖрдИрдбреА рдЕрдиреБрджреЗрд╢ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбрд▓ рдФрд░ рд╕рдорд░реНрдерд┐рдд рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдХреЛрдИ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдкреНрд░рд╛рд╡рдзрд╛рди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ x86- рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо IA32 рдФрд░ x64 рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрд╡реЗрджрди рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ x86 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдЖрд░рдПрдо рдпрд╛ рдЗрдЯреЗрдирд┐рдпрдо рдкрд░ рдЪрд▓рдиреЗ рд╕реЗ рд╕реАрдкреАрдпреВ рдЕрдиреБрджреЗрд╢ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдХрд╛рд░рдг рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реЛрдВрдЧреЗред