Skip to content

De-x86-ify IncludeOS for upcoming ARM support #2352

@torgeiru

Description

@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:

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");

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions