singrdk/base/Kernel/Native/ix64/kdasm.asm

172 lines
6.5 KiB
NASM

;; ----------------------------------------------------------------------------
;;
;; Copyright (c) Microsoft Corporation. All rights reserved.
;;
;; ----------------------------------------------------------------------------
include hal.inc
;public: static void __cdecl Class_Microsoft_Singularity_DebugStub::g_Break(void)"
?g_Break@Class_Microsoft_Singularity_DebugStub@@SAXXZ proc
int 3
ret;
?g_Break@Class_Microsoft_Singularity_DebugStub@@SAXXZ endp
;void __cdecl KdpPause(void)"
?KdpPause@@YAXXZ proc
pause
ret;
?KdpPause@@YAXXZ endp
; NB: Without these, we share routines with the mainline code and we get
; caught in a loop when the debugger inserts a break after the pushfd when
; someone tries to single step through Processor:g_DisableInterrupts!
;
;bool __cdecl KdpDisableInterruptsInline(void)"
?KdpDisableInterruptsInline@@YA_NXZ proc
pushfq
pop rax
test rax, Struct_Microsoft_Singularity_Isal_IX_EFlags_IF
setnz al
nop; // required so that the linker doesn't combine with g_Disable
cli;
ret;
?KdpDisableInterruptsInline@@YA_NXZ endp
;void __cdecl KdpRestoreInterruptsInline(bool)"
?KdpRestoreInterruptsInline@@YAX_N@Z proc
nop;
test cl, cl;
je done;
nop; // required so that the linker doesn't combine with g_Restore
sti;
done:
ret;
?KdpRestoreInterruptsInline@@YAX_N@Z endp
;void __cdecl KdpFlushInstCache(void)"
?KdpFlushInstCache@@YAXXZ proc
wbinvd; // privileged instruction
ret;
?KdpFlushInstCache@@YAXXZ endp
; "unsigned __int64 __cdecl KdpX64ReadMsr(unsigned long)"
?KdpX64ReadMsr@@YA_KK@Z proc
rdmsr;
ret;
?KdpX64ReadMsr@@YA_KK@Z endp
; "void __cdecl KdpX64WriteMsr(unsigned long,unsigned __int64)"
?KdpX64WriteMsr@@YAXK_K@Z proc
mov eax, edx;
shr rdx, 32;
wrmsr;
ret;
?KdpX64WriteMsr@@YAXK_K@Z endp
;?KdpX64ReadMsr@@YA_KK@Z endp
; "void __cdecl KdpX64GetSegmentRegisters(struct Struct_Microsoft_Singularity_Kd_X64Context *)"
?KdpX64GetSegmentRegisters@@YAXPEAUStruct_Microsoft_Singularity_Kd_X64Context@@@Z proc
mov ax,cs
mov [rcx].Struct_Microsoft_Singularity_Kd_X64Context._SegCs, ax
mov ax,gs
mov [rcx].Struct_Microsoft_Singularity_Kd_X64Context._SegGs, ax
mov ax,fs
mov [rcx].Struct_Microsoft_Singularity_Kd_X64Context._SegFs, ax
mov ax,es
mov [rcx].Struct_Microsoft_Singularity_Kd_X64Context._SegEs, ax
mov ax,ds
mov [rcx].Struct_Microsoft_Singularity_Kd_X64Context._SegDs, ax
mov ax,ss
mov [rcx].Struct_Microsoft_Singularity_Kd_X64Context._SegSs, ax
ret;
?KdpX64GetSegmentRegisters@@YAXPEAUStruct_Microsoft_Singularity_Kd_X64Context@@@Z endp
; "void __cdecl KdpX64SetControlReport(struct Struct_Microsoft_Singularity_Kd_X64KdControlReport *)"
?KdpX64SetControlReport@@YAXPEAUStruct_Microsoft_Singularity_Kd_X64KdControlReport@@@Z proc
mov rax, dr6;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlReport._Dr6, rax;
mov rax, dr7;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlReport._Dr7, rax;
mov ax, cs
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlReport._SegCs, ax
mov ax, es
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlReport._SegEs, ax
mov ax, ds
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlReport._SegDs, ax
mov ax, fs
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlReport._SegFs, ax
pushfq
pop rax
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlReport._EFlags, eax
ret;
?KdpX64SetControlReport@@YAXPEAUStruct_Microsoft_Singularity_Kd_X64KdControlReport@@@Z endp
; "void __cdecl KdpX64SetControlSet(struct Struct_Microsoft_Singularity_Kd_X64KdControlSet *)"
?KdpX64SetControlSet@@YAXPEBUStruct_Microsoft_Singularity_Kd_X64KdControlSet@@@Z proc
mov rax, [rcx].Struct_Microsoft_Singularity_Kd_X64KdControlSet._Dr7;
mov dr7, rax;
ret;
?KdpX64SetControlSet@@YAXPEBUStruct_Microsoft_Singularity_Kd_X64KdControlSet@@@Z endp
; "void __cdecl KdpX64WriteSpecialRegisters(struct Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters const *)"
?KdpX64ReadSpecialRegisters@@YAXPEAUStruct_Microsoft_Singularity_Kd_X64KSpecialRegisters@@@Z proc
mov rax, dr0;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr0, rax;
mov rax, dr1;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr1, rax;
mov rax, dr2;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr2, rax;
mov rax, dr3;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr3, rax;
mov rax, dr6;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr6, rax;
mov rax, dr7;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr7, rax;
sidt [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._Idtr._Limit;
sgdt [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._Gdtr._Limit;
;; Should we save the segment regs as well?
str ax;
mov [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._Tr, ax;
ret;
?KdpX64ReadSpecialRegisters@@YAXPEAUStruct_Microsoft_Singularity_Kd_X64KSpecialRegisters@@@Z endp
; "void __cdecl KdpX64WriteSpecialRegisters(struct Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters const *)"
?KdpX64WriteSpecialRegisters@@YAXPEBUStruct_Microsoft_Singularity_Kd_X64KSpecialRegisters@@@Z proc
mov rax, [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr0;
mov dr0, rax;
mov rax, [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr1;
mov dr1, rax;
mov rax, [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr2;
mov dr2, rax;
mov rax, [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr3;
mov dr3, rax;
mov rax, [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr6;
mov dr6, rax;
mov rax, [rcx].Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters._KernelDr7;
mov dr7, rax;
ret;
?KdpX64WriteSpecialRegisters@@YAXPEBUStruct_Microsoft_Singularity_Kd_X64KSpecialRegisters@@@Z endp
;static void KdWriteInt8(UINT16 port, UINT8 value)
?KdWriteInt8@@YAXGE@Z proc
mov al,dl
mov dx,cx
out dx, al
ret;
?KdWriteInt8@@YAXGE@Z ENDP
;static UINT8 KdReadInt8(UINT16 port)
?KdReadInt8@@YAEG@Z proc
mov eax, 0
mov dx, cx
in al, dx
ret;
?KdReadInt8@@YAEG@Z endp
end