torgeiru
Lots of the code assumes x86 for example PCI driver code (port IO) and there are many `asm volatile`. I think we should switch from these to intrinsics and C++-standard. I must probably help with PCI driver code. Here is a comprehensive references of assembly instructions: ```log api/smp_utils: asm("mfence"); api/smp_utils: asm("pause; nop;"); api/debug: asm("mov $0,%eax ; 0: ; test %eax,%eax ; jz 0b"); } api/smp: asm("movl %%gs:(0x0), %0" : "=r" (cpuid)); api/smp: asm("movl %%fs:(0x0), %0" : "=r" (cpuid)); api/arch/x86_64.hpp: asm("rdtsc" : "=a"(lo), "=d"(hi)); api/arch/i686.hpp: asm("rdtsc" : "=A" (ret)); lib/LiveUpdate/src/hotswap.cpp:asm(".org 0x8000"); test/integration/mod/gsl/service.cpp: THEN("span saves us from complete embarrasment") { test/integration/stl/coroutines/service.cpp: asm("pause"); test/integration/kernel/fiber/fiber_smp.cpp: asm("pause"); test/integration/kernel/fiber/fiber_smp.cpp: asm("pause"); test/integration/kernel/fiber/fiber_smp.cpp: asm("pause"); test/integration/kernel/fiber/fiber_smp.cpp: asm("hlt"); test/integration/kernel/fiber/fiber_smp.cpp: asm("pause"); test/integration/kernel/fiber/fiber_smp.cpp: asm("pause"); test/integration/kernel/fiber/fiber_smp.cpp: asm("pause"); test/integration/kernel/exception/service.cpp: //asm ("movl $0, %eax"); test/integration/kernel/exception/service.cpp: //asm ("idivl %eax"); test/integration/kernel/exception/service.cpp: asm ("movq $0, %rax"); test/integration/kernel/exception/service.cpp: asm ("idivq %rax"); src/platform/x86_nano/platform.cpp: while (1) asm("cli; hlt;"); src/platform/x86_nano/platform.cpp: asm("hlt"); src/platform/x86_pc/init_libc.hpp:#define LL_ASSERT(X) if (!(X)) { kprint("Early assertion failed: " #X "\n"); asm("cli;hlt"); } src/platform/x86_pc/boot/bootloader.asm: %include "boot/disk_read_lba.asm" src/platform/x86_pc/smp.cpp: asm("movl %%gs:(0x0), %0" : "=r" (cpuid)); src/platform/x86_pc/smp.cpp: asm("movl %%fs:(0x0), %0" : "=r" (cpuid)); src/platform/x86_pc/acpi.cpp: asm("cli"); src/platform/x86_pc/acpi.cpp: while (true) asm ("cli; hlt"); src/platform/x86_pc/start.asm: db `Panic: OS returned to x86 start.asm. Halting\n`,0x0 src/platform/x86_pc/pit.cpp: asm("hlt"); src/platform/x86_pc/idt.cpp: asm ("sgdtq %0" : : "m" (* &gdt)); src/platform/x86_pc/idt.cpp: asm ("sidtq %0" : : "m" (* &idt)); src/platform/aarch64_vm/init_libc.hpp:#define LL_ASSERT(X) if (!(X)) { kprint("Early assertion failed: " #X "\n"); asm("hlt 0xf000"); } src/platform/aarch64_vm/platform.cpp:// while (1) asm("hlt #0xf000;"); src/platform/aarch64_vm/serial1.cpp: /* init UART (38400 8N1) */ //maybe stick in asm as a function instead src/platform/aarch64_vm/serial1.cpp: //unsure if this becomes sane or not. look at asm but should be exactly the same as the above comment src/platform/aarch64_vm/start_aarch64.asm://exception.asm src/platform/aarch64_vm/start.asm: db `Panic: OS returned to x86 start.asm. Halting\n`,0x0 src/platform/kvm/kvmclock.cpp: asm("mfence" ::: "memory"); src/platform/kvm/kvmclock.cpp: asm("mfence" ::: "memory"); src/platform/kvm/kvmclock.cpp: asm("mfence" ::: "memory"); src/platform/kvm/kvmclock.cpp: asm("mfence" ::: "memory"); src/platform/kvm/pv_eoi.cpp: asm("btr %2, %0; setc %1" : "+m"(PER_CPU(exitless_eoi).eoi_word), "=rm"(reg) : "r"(0)); src/platform/kvm/bsd_pvclock.hpp: __asm__ ( src/platform/kvm/bsd_pvclock.hpp: __asm__ ( src/chainload/service.cpp: asm("cli"); src/chainload/hotswap.cpp:asm(".org 0x2000"); src/drivers/vga_emergency.cpp: asm("sti"); src/drivers/e1000.cpp: asm("pause"); src/drivers/e1000.cpp: asm("pause"); src/drivers/ide.cpp: while (((ret = hw::inb(IDE_STATUS)) & IDE_BUSY) == IDE_BUSY) asm("pause"); api/smp_utils: asm volatile("mfence"); api/hw/pci.hpp: asm volatile("inb %1,%0" : "=a"(ret) : "Nd"(port)); api/hw/pci.hpp: asm volatile("inw %1,%0" : "=a"(ret) : "Nd"(port)); api/hw/pci.hpp: asm volatile("inl %1,%0" : "=a"(ret) : "Nd"(port)); api/hw/pci.hpp: asm volatile ("outb %0,%1" :: "a"(data), "Nd"(port)); api/hw/pci.hpp: asm volatile ("outw %0,%1" :: "a" (data), "Nd"(port)); api/hw/pci.hpp: asm volatile ("outl %0,%1" :: "a" (data), "Nd"(port)); api/hw/ioport.hpp: asm volatile("inb %1,%0" : "=a"(ret) : "Nd"(port)); api/hw/ioport.hpp: asm volatile("inw %1,%0" : "=a"(ret) : "Nd"(port)); api/hw/ioport.hpp: asm volatile("inl %1,%0" : "=a"(ret) : "Nd"(port)); api/hw/ioport.hpp: asm volatile ("outb %0,%1" :: "a"(data), "Nd"(port)); api/hw/ioport.hpp: asm volatile ("outw %0,%1" :: "a" (data), "Nd"(port)); api/hw/ioport.hpp: asm volatile ("outl %0,%1" :: "a" (data), "Nd"(port)); api/arch/x86_64.hpp: __asm volatile("lfence" ::: "memory"); api/arch/x86_64.hpp: __asm volatile("mfence" ::: "memory"); api/arch/aarch64.hpp: asm volatile("isb;mrs %0, pmccntr_el0" : "=r"(ret)); api/arch/x86/cpu.hpp: asm volatile ( api/arch/x86/cpu.hpp: asm volatile("rdmsr" : "=A" (v) : "c" (addr)); api/arch/x86/cpu.hpp: asm volatile("wrmsr" : : "a" (eax), "d"(edx), "c" (addr)); api/arch/x86/cpu.hpp: asm volatile("wrmsr" : : "a" (eax), "d"(edx), "c" (addr)); api/arch/x86/cpu.hpp: asm volatile("wrmsr" : : "A" (value), "c" (addr)); api/arch/x86/gdt.hpp: asm volatile("movw %%ax, %%fs" : : "a"(entry * 0x8)); api/arch/x86/gdt.hpp: asm volatile("movw %%ax, %%gs" : : "a"(entry * 0x8)); api/arch/i686.hpp: __asm volatile("lfence" ::: "memory"); api/arch/i686.hpp: __asm volatile("mfence" ::: "memory"); api/arch.hpp: asm volatile("" ::: "memory"); lib/LiveUpdate/src/update.cpp: asm volatile("cli"); lib/LiveUpdate/src/update.cpp: asm volatile("sti"); lib/LiveUpdate/src/hotswap.cpp: asm volatile("jmp *%2" : : "a" (SOFT_RESET_MAGIC), "b" (reset_data), "c" (start)); lib/LiveUpdate/src/hotswap.cpp: asm volatile( test/integration/kernel/fiber/service.cpp: asm volatile ("mov %%rsp, %0" :"=r"(stack)); test/integration/kernel/fiber/service.cpp: asm volatile ("mov %%esp, %0" :"=r"(stack)); test/integration/kernel/fiber/service.cpp: asm volatile ("mov %%rbp, %0" :"=r"(base)); test/integration/kernel/fiber/service.cpp: asm volatile ("mov %%ebp, %0" :"=r"(base)); test/integration/kernel/fiber/fiber_smp.cpp: asm volatile ("mov %%rsp, %0" :"=r"(stack)); test/integration/kernel/fiber/fiber_smp.cpp: asm volatile ("mov %%esp, %0" :"=r"(stack)); test/integration/util/tar/tar_example/l1_f2/virtio.hpp: asm volatile("mfence" ::: "memory"); test/integration/util/tar_gz/tar_example/l1_f2/virtio.hpp: asm volatile("mfence" ::: "memory"); src/platform/x86_pc/os.cpp: asm volatile("hlt"); src/platform/x86_pc/os.cpp: asm volatile( src/platform/x86_pc/platform.cpp: asm volatile("sti"); src/platform/x86_pc/rand.cpp: asm volatile("cpuid" ::: "memory", "eax", "ebx", "ecx", "edx"); src/platform/x86_pc/apic_revenant.cpp: asm volatile("sti"); src/platform/x86_pc/idt.cpp: asm volatile ("lidt %0" : : "m"(idt_reg)); src/platform/x86_solo5/os.cpp: asm volatile( src/platform/x86_solo5/os.cpp: asm volatile("hlt"); src/platform/x86_solo5/platform.cpp: asm volatile("cli; hlt"); src/platform/aarch64_vm/os.cpp: asm volatile("wfi" :::"memory"); src/platform/aarch64_vm/os.cpp: //asm volatile("hlt #0xf000"); src/platform/aarch64_vm/os.cpp: asm volatile( src/platform/aarch64_vm/serial1.cpp: /*asm volatile("ldr x4, =%0" :: "r"(UART_BASE)); // UART base src/platform/aarch64_vm/serial1.cpp: asm volatile("mov w5, #0x10"); src/platform/aarch64_vm/serial1.cpp: asm volatile("str w5, [x4, #0x24]"); src/platform/aarch64_vm/serial1.cpp: asm volatile("mov w5, #0xc300"); src/platform/aarch64_vm/serial1.cpp: asm volatile("orr w5, w5, #0x0001"); src/platform/aarch64_vm/serial1.cpp: asm volatile("str w5, [x4, #0x30]");*/ src/chainload/hotswap.cpp: asm volatile("jmp *%0" : : "r" (start), "a" (magic), "b" (bootinfo)); src/chainload/hotswap.cpp: asm volatile (".global __hotswap_end;\n__hotswap_end:"); src/kernel/cpuid.cpp: asm volatile ("cpuid" src/kernel/scoped_profiler.cpp: asm volatile ("lfence\n\t" src/kernel/scoped_profiler.cpp: asm volatile ("mfence\n\t" src/kernel/scoped_profiler.cpp: asm volatile ("lfence\n\t" src/kernel/scoped_profiler.cpp: asm volatile ("mfence\n\t" src/arch/aarch64/cpu.cpp: asm volatile("mrs %0, CurrentEL": "=r" (el)::); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFClr,%0" ::"i"(DAIF_FIQ_BIT): "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFClr,%0" ::"i"(DAIF_IRQ_BIT) : "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFClr,%0" ::"i"(DAIF_ABT_BIT) : "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFClr,%0" ::"i"(DAIF_DBG_BIT): "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFSet,%0" ::"i"(DAIF_FIQ_BIT): "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFSet,%0" ::"i"(DAIF_IRQ_BIT) : "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFSet,%0" ::"i"(DAIF_ABT_BIT) : "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFSet,%0" ::"i"(DAIF_DBG_BIT): "memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIFSet,%0" :: "i"(DAIF_FIQ_BIT|DAIF_IRQ_BIT|DAIF_ABT_BIT|DAIF_DBG_BIT) : "memory"); src/arch/aarch64/cpu.cpp: asm volatile("wfi" : : : "memory"); src/arch/aarch64/cpu.cpp: asm volatile("mrs %0 , DAIF" : "=r"(daif)::"memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIF, %0 " : :"r"(daif):"memory"); src/arch/aarch64/cpu.cpp: //asm volatile("msr daifset, %0\n\t" :: "r"(irq):"memory"); src/arch/aarch64/cpu.cpp: asm volatile("mrs %0 , DAIF" : "=r"(daif)::"memory"); src/arch/aarch64/cpu.cpp: asm volatile("msr DAIF, %0" : :"r"(daif):"memory"); src/arch/aarch64/timer.cpp: asm volatile ("msr cntfrq_el0, %0" :: "r"(freq)); src/arch/aarch64/timer.cpp: asm volatile ("mrs %0, cntfrq_el0" : "=r"(ret)); src/arch/aarch64/timer.cpp: asm volatile ("msr cntp_tval_el0, %0" :: "r"(count)); src/arch/aarch64/timer.cpp: asm volatile("mrs %0, cntvct_el0" : "=r" (cntvct_el0) : : "memory"); src/arch/aarch64/timer.cpp: asm volatile("mrs %0, cntv_cval_el0" : "=r" (cntvct_el0) : : "memory"); src/arch/aarch64/timer.cpp: asm volatile("msr cntv_cval_el0 , %0" :: "r" (compare) : "memory"); src/arch/aarch64/timer.cpp: asm volatile("msr cntv_ctl_el0 , %0" :: "r" (val) : "memory"); src/arch/aarch64/timer.cpp: asm volatile("mrs %0, cntv_ctl_el0" : "=r" (ctl) : : "memory"); src/arch/aarch64/timer.cpp: asm volatile ("mrs %0, cntp_tval_el0" : "=r"(ret)); src/arch/aarch64/timer.cpp: asm volatile("msr cntp_ctl_el0, %0" :: "r"(control): "memory"); src/arch/aarch64/timer.cpp: asm volatile ("mrs %0, cntp_ctl_el0" : "=r"(ret) :: "memory"); src/arch/x86_64/init_paging.cpp: asm volatile ("mov %%rax, %%cr3;" :: "a" (pdir)); src/arch/x86_64/paging.cpp: asm volatile("invlpg (%0)" ::"r" (pageaddr) : "memory"); ```