Krótka historia o debugowaniu laptopa, który nie budził się z uśpienia
15.05.2019, Warsaw C++ Users' Group�Michał “Redford” Kowalczyk
O mnie
Intro
Standardowe sprawdzenia
Nie widać żadnej oczywistej przyczyny → pora na debugowanie!
Ale najpierw, jak to wszystko działa?
Jak działa komputer: BIOS, ACPI, OS...
CPU
Northbridge
RAM
GPU
Southbridge
HDD
Audio
Ethernet
EC/KBC
Battery
Keyboard
PSC
Touchpad
BIOS
Boot
CPU
Northbridge
RAM
GPU
Southbridge
HDD
Audio
Ethernet
EC/KBC
Battery
Keyboard
PSC
Touchpad
BIOS
EIP=...�RAX=...
RBX=...
...
Boot
CPU
Northbridge
RAM
GPU
Southbridge
HDD
Audio
Ethernet
EC/KBC
Battery
Keyboard
PSC
Touchpad
BIOS
EIP=...�RAX=...
RBX=...
...
Boot
CPU
Northbridge
RAM
GPU
Southbridge
HDD
Audio
Ethernet
EC/KBC
Battery
Keyboard
PSC
Touchpad
BIOS
EIP=...�RAX=...
RBX=...
...
Przejście w S3
CPU
Northbridge
RAM
GPU
Southbridge
HDD
Audio
Ethernet
EC/KBC
Battery
Keyboard
PSC
Touchpad
BIOS
EIP=...�RAX=...
RBX=...
...
Budzenie z S3
CPU
Northbridge
RAM
GPU
Southbridge
HDD
Audio
Ethernet
EC/KBC
Battery
Keyboard
PSC
Touchpad
BIOS
EIP=...�RAX=...
RBX=...
...
Qubes OS / Xen
Hardware
Xen
Dom0
DomU
DomU
...
management domain (VM)
host OS
user domains (VMs)
Debugowanie
Sposoby na debugowanie
pm_trace
static int device_resume_noirq(struct device *dev, pm_message_t state, bool async)
{
pm_callback_t callback;
const char *info;
bool skip_resume;
int error = 0;
TRACE_DEVICE(dev);
TRACE_RESUME(0);
if (dev->power.syscore || dev->power.direct_complete)
goto Out;
pm_trace
pm_trace
0
Complete:� complete_all(&dev->power.completion);� TRACE_SUSPEND(error);� return error;
pm_trace w Xenie?
Dokąd dociera wykonanie?
arch/x86/boot/wakeup.S#L152:
movl $MSR_EFER,%ecx
rdmsr
btsl $_EFER_LME,%eax /* Long Mode */
btsl $_EFER_SCE,%eax /* SYSCALL/SYSRET */
btl $20,%edi /* No Execute? */
jnc 1f
btsl $_EFER_NX,%eax /* No Execute */
1: wrmsr
NX?
NX
Intel SDM, Volume 3:
If the execute-disable capability is not available, a write to set IA32_EFER.NXE produces a #GP exception.
Ale procesor w tym laptopie wspiera NX….
NX
IA32_MISC_ENABLE MSR:
BIOS!
Naprawa
Pytania?