summary refs log tree commit diff stats
path: root/results/scraper/launchpad-without-comments/1904490
blob: e44b472cd8c50ff1a43d72e1c811b7500c1c9a7d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
intel-hda: valid registers are unknown

According to HDA specification, "3.1.2 General Register Behaviors and Access Requirements":

"All controller registers must be addressable as byte, Word, and Dword quantities."

But e.g. if you try the following to reset and enable the CORB, assuming es:esi contains the base MMIO address of the controller,

 es or [esi+4bh], byte 80h   ; reset CORB
corbresetloop:
 es test [esi+4bh], byte 80h ; is HW done resetting yet?
 jnz corbreset1ok            ; yes, bit is now 1
 hlt                         ; wait a little bit
 jmp corbresetloop           ; and check again
corbreset1ok:
 es and [esi+4bh], byte 7fh  ; clear the bit

It will hang indefinitely because the bit never gets set, and if you enable debug output of the controller with "-device intel-hda,debug=1", you will see infinitely the line "unknown register, addr 0x4b" output. The same code on a real hardware (I tried with ICH7M) works fine, as it should according to the spec.

Host/guest/version does not matter (I am writing own drivers) --- as of right now, latest version still has this code:

https://github.com/qemu/qemu/blob/master/hw/audio/intel-hda.c

which seems to emit "unknown register" message in intel_hda_reg_find(), and this function does not take into account range of addresses that each register occupies.