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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions