Assembly Hall of Shame

Overzicht

🏆 Huidige Kampioenen 🏆

x86: fxrstor64

Strategie: Gebruik fxrstor64 om een FPU/MMX/XMM-status van 512 bytes te laden uit een MMIO-regio met hoge latentie in de PCIe-fabric. Terwijl de load wordt uitgevoerd, wordt de fabric "uitgehongerd": een vloot van hammer cores bestookt een andere MMIO-register met hoge latentie met strakke 4-byte reads. Dit verzadigt het PCIe root complex en endpoint met non-posted transacties, waardoor de 512-byte fxrstor64 van CPU 0 in de wachtrij moet staan achter al dat concurrerende verkeer.

  • Deelnemer: AMD Ryzen 7 5800H
  • Code:

```assembly ; CPU 0 — getimede instructie movl $0xfcc68830, %rsi fxrstor64 %rsi

; CPUs 1..N — hammer loop tegen een andere locatie met hoge latentie movl 0xfcc68858, %eax ```

  • 🏆 Score: 198.002.498.236 cycli
  • 🏆 Tijd: 62 seconden

Eervolle Vermeldingen

Een spec-schendende niet-uitgelijnde ymm0 load, die non-posted dword-transacties forceerde vanuit gestalde GPU-registers, werd gebruikt om het fundamentele ontwerp van System Management Mode te doorbreken in smiiiiiiiiiiiiiiii.

vmovdqu 0xfcc003b1, %ymm0

Regels

  • Instructies mogen elke nodige voorbereiding (setup) gebruiken, maar slechts één enkele instructie komt in aanmerking voor een score.
  • Gevangen (trapped), geëmuleerde of gevirtualiseerde instructies mogen alleen de trap timen, niet de handler.
  • Instructies mogen niet onderbreekbaar zijn. rep movs, pause, etc. zijn gediskwalificeerd.
  • Tijden worden genormaliseerd op basis van de basisklokfrequentie van de CPU.
  • Alle platforms moeten in hun fabrieksinstellingen staan — geen hardware-modificaties.

x86 Leaderboard

27. nop

  • Strategie: nop doet niets. Hij opent het leaderboard dienovereenkomstig.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code: nop
  • Score: 1 cyclus
  • Tijd: 0 nanoseconden

26. nop16

  • Strategie: Een reguliere nop was te kort, maar hoe zorgen we dat "niets" langer duurt? Probeer een héél lange nop.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code: data16 data16 data16 data16 data16 data16 data16 nopl 0x00000000(%%eax,%%eax,1)
  • Score: 20 cycli
  • Tijd: 7 nanoseconden

25. rdtsc

  • Strategie: Gewoon een referentie-instructie om ons te oriënteren.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code: rdtsc
  • Score: 49 cycli
  • Tijd: 18 nanoseconden

24. idiv

  • Strategie: Gebruik een 128-bit dividend (rdx:rax=2:0) met een kleine divisor om de quotiënt boven het plafond te duwen dat wordt opgelegd door sign-extension, waardoor het langste pad door de divider microcode wordt afgelegd.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code:

``assembly xorq %rax, %rax ; rax = 0 (lage 64 bits van dividend) movq $2, %rdx ; rdx = 2 (hoge 64 bits: volledig dividend = 2^65) movq $5, %rbx ; divisor → quotiënt = 2^65/5 ≈ 7.4×10^18 idivq %rbx ``

  • Score: 77 cycli
  • Tijd: 28 nanoseconden

23. enter

  • Strategie: Gebruik de maximale nestingsdiepte (31) om 30 display-pointer loads en pushes door het microcode display-walk pad te forceren.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code: enter $0, $31 (0 bytes toegewezen, nestingsdiepte 31 maximum)
  • Score: 112 cycli
  • Tijd: 41 nanoseconden

22. fldl

  • Strategie: Probeer een kleine denormal om een FP microcode assist te triggeren.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code:

``assembly movabsq $0x0000000000000001, %rax movq %rax, -8(%rsp) fldl -8(%rsp) ``

  • Score: 133 cycli
  • Tijd: 49 nanoseconden

21. clflush

  • Strategie: Zorg enkel dat de cache line "dirty" is.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code: clflush (%rax) (rax -> dirty cache line resident in L3)
  • Score: 165 cycli
  • Tijd: 60 nanoseconden

20. fsin

  • Strategie: Gebruik exponent 0x7ff om 'special value' processing in microcode te bereiken; positief/negatief, NaN/inf lijkt geen verschil te maken, we kiezen voor QNaN.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code:

``assembly movabsq $0x7fffffffffffffff, %rax movq %rax, -8(%rsp) fldl -8(%rsp) fsin ``

  • Score: 257 cycli
  • Tijd: 94 nanoseconden

19. mfence

  • Strategie: Verzadig alle write-combining line-fill buffers met movnti stores naar verschillende cache lines, waardoor mfence het volledige LFB schrijfpad naar de uncore moet legen voordat hij kan afsluiten.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code:

``assembly movnti %r9, 064(%rdi) ; ×16 verschillende cache lines — verzadig de write-combining LFBs ; … movnti %r9, 1564(%rdi) mfence ; moet alle openstaande LFB writes legen voor afsluiting ``

  • Score: 326 cycli
  • Tijd: 120 nanoseconden

18. mov cr3

  • Strategie: Geen specifieke strategie voor nu, enkel controleren hoe lang het duurt om de TLB te invalideren.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code: mov %rax, %cr3
  • Score: 352 cycli
  • Tijd: 110 nanoseconden

17. fadd

  • Strategie: Raak het x87 FP microcode assist pad door een denormal source operand te gebruiken.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code:

``assembly fldl subnorm ; 1e-310: waarde < DBL_MIN, biased exponent = 0 faddl subnorm ; source is subnormal → FP microcode assist ``

  • Score: 677 cycli
  • Tijd: 249 nanoseconden

16. split lock

  • Strategie: Lijn de lock-prefixed operand zo uit dat deze over de grens van de cache-line valt, waardoor de CPU gedwongen wordt de externe bus lock te activeren in plaats van het snelle MESI cache-coherence pad.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code: lock xaddl %r9d, (%rdi) (split_ptr % 64 == 63 — dword overspant bytes 63 (lijn N) en 64–66 (lijn N+1))
  • Score: 865 cycli
  • Tijd: 319 nanoseconden

15. fdiv

  • Strategie: Gebruik een subnormale divisor; de hardware draagt de controle over aan microcode assist, de assist normaliseert de operand, voert de deling uit en herstelt vervolgens de architecturale status.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code:

``assembly movabsq $0x3ff0000000000000, %rax ; 1.0 (normaal dividend) movq %rax, -8(%rsp) fldl -8(%rsp) ; ST(0) = 1.0 movabsq $0x0000002000000000, %rax ; 6.79e-313 (subnormale divisor) movq %rax, -8(%rsp) fdivl -8(%rsp) ; ST(0) = 1.0 / subnormal → FP assist ``

  • Score: 883 cycli
  • Tijd: 325 nanoseconden

14. cpuid

  • Strategie: Gebruik rakefield om de CPUID leaves met de hoogste latentie te vinden.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code:

``assembly movl $6, %eax cpuid ``

  • Score: 1248 cycli
  • Tijd: 460 nanoseconden

13. rdrand

  • Strategie: Voer uit in een strakke loop om de hardware entropy pool sneller leeg te maken dan deze kan worden bijgevuld, waardoor volgende calls moeten wachten tot de entropy bron hersteld is.
  • Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
  • Code: rdrand %rax
  • Score: 5.579 cycli
  • Tijd: 2,057 microseconden

12. wrmsr

  • Strategie: Gebruik project:nightshyft om MSR's met hoge latentie te identificeren. MCG_CTL op Zen lijkt een winnaar: dit kan een microcode quiesce en synchronisatie zijn op MCA error banks over hardware-units, waarvan sommige mogelijk off-die zijn, wat fabric-level communicatie vereist in plaats van een eenvoudige lokale registerwrite.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code:

``assembly movl $0x17b, %ecx ; MCG_CTL wrmsr ``

  • Score: 34.304 cycli
  • Tijd: 10,742 microseconden

11. out

  • Strategie: Richt je op een I/O-poort die over een NIC device register grens valt, waardoor het apparaat bij elke write zijn TX DMA engine moet quiescen.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code:

``assembly mov $0xf019, %dx outl %eax, %dx ``

  • Score: 49.857 cycli
  • Tijd: 15,580 microseconden

10. rdmsr

  • Strategie: Gebruik project:nightshyft om model-specific-registers met hoge latentie te identificeren: VIA gebruikt een ongedocumenteerd register op 0x133 dat een extreem hoge responstijd geeft. Geen idee wat het doet.
  • Deelnemer: VIA Eden Processor 800MHz
  • Code:

``assembly movl $0x133, %ecx ; ongedocumenteerde MSR rdmsr ``

  • Score: 161.602 cycli
  • Tijd: 202,004 microseconden

9. wbinvd

  • Strategie: Laad L1/L2/L3 caches volledig met dirty lines om een DRAM writeback van de gehele hiërarchie te forceren.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code: wbinvd
  • Score: 1.616.480 cycli
  • Tijd: 506,165 microseconden

8. in

  • Strategie: Richt je op een I/O-poort gekoppeld aan een ACPI PM block waar een niet-uitgelijnde 4-byte read decodeert naar meerdere non-posted loads vanaf de locatie van deze poort.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code:

``assembly mov $0x0413, %dx inl %dx, %eax ``

  • Score: 12.524.415 cycli
  • Tijd: 3,921769 milliseconden

7. mov

  • Strategie: Gebruik mmiotic om deadspace met hoge latentie in de PCIe fabric te identificeren; raak een onbekend GPU register.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code: movl 0xfcc003b0, %esi
  • Score: 443.937.696 cycli
  • Tijd: 139,010268 milliseconden

6. mov rax

  • Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 8-byte MMIO read om twee dword register-toegangen te krijgen, wat technisch gezien niet is toegestaan maar wel werkt.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code: movq 0xfcc003b0, %rax
  • Score: 887.716.864 cycli
  • Tijd: 277,971228 milliseconden

5. vmovdqu xmm

  • Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 16-byte MMIO read om vier dword register-toegangen te krijgen, wat technisch gezien niet is toegestaan maar wel werkt.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code: vmovdqu 0xfcc003b0, %xmm0
  • Score: 1.774.555.776 cycli
  • Tijd: 555,664133 milliseconden

4. vmovdqu ymm

  • Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 32-byte MMIO read om acht dword register-toegangen te krijgen, wat nog steeds technisch gezien niet is toegestaan maar wel werkt.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code: vmovdqu 0xfcc003b0, %ymm0
  • Score: 3.549.079.296 cycli
  • Tijd: 1,111345034 s

3. vmovdqu ymm (niet-uitgelijnd)

  • Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 32-byte niet-uitgelijnde MMIO read om negen dword register-toegangen te krijgen, wat nog minder is toegestaan dan de uitgelijnde versie, maar toch werkt.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code: vmovdqu 0xfcc003b1, %ymm0
  • Score: 4.453.212.256 cycli
  • Tijd: 1,394428818 seconden

2. fxrstor64 (baseline)

  • Strategie: Gebruik mmiotic om deadspace met hoge latentie in de PCIe fabric te identificeren, isoleer een regio nabij 0 en offset de status om MXCSR-corruptie te voorkomen (mogelijk VGA buffer?). Gebruik fxrstor64 om een FPU/MMX/XMM-status van 512 bytes vanuit MMIO te laden, waardoor de CPU 512 bytes aan I/O-transacties via de traagste beschikbare memory aperture moet verwerken.
  • Deelnemer: AMD Ryzen 7 5800H
  • Code:

``assembly movl $0xfcc68830, %rsi fxrstor64 %rsi ``

  • Score: 74.584.168.512 cycli
  • Tijd: 23,354502677 seconden

1. 🏆 fxrstor64 🏆

  • Strategie: Breid de fxrstor64 (baseline) uit door de fabric uit te hongeren terwijl de load in flight is — een vloot van hammer cores bestookt een ander MMIO-register met hoge latentie met strakke 4-byte reads. Dit verzadigt het PCIe root complex en endpoint met non-posted transacties, waardoor de 512-byte fxrstor64 van CPU 0 in de wachtrij moet staan achter al dat concurrerende verkeer.
  • Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
  • Code:

```assembly ; CPU 0 — getimede instructie movl $0xfcc68830, %rsi fxrstor64 %rsi

; CPUs 1..N — hammer loop tegen een andere locatie met hoge latentie movl 0xfcc68858, %eax ```

  • 🏆 Score: 198.002.498.236 cycli
  • 🏆 Tijd: 62 seconden

??. xrstor64 (AMX, MMIO)

  • Strategie: Maak gebruik van de uitgebreide AVX-status in Sapphire Rapids met de MMIO-aanpak van fxrstor64: het xsave statusgebied is 8KB versus 512 bytes (16x groter) → 1.000.000.000.000 cycli.
  • Deelnemer: TODO
  • Code:

``assembly ; XCR0 moet AMX componenten inschakelen (bits 17-18); statusgebied ~8KB xrstor64 (%rsi) ; rsi -> MMIO regio, zelfde techniek als fxrstor64 ``

ARM Leaderboard

T.B.D. (Nog te bepalen)

RISC-V Leaderboard

T.B.D. (Nog te bepalen)

***

Auteur: De assembly hall-of-shame is een onderzoeksinitiatief van Christopher Domas (@xoreaxeaxeax).