Changeset 84176f3 in mainline for kernel


Ignore:
Timestamp:
2019-04-10T15:04:17Z (6 years ago)
Author:
Jakub Jermář <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8df0306
Parents:
b58728f
git-author:
Petr Pavlu <setup@…> (2019-03-31 14:09:57)
git-committer:
Jakub Jermář <jakub@…> (2019-04-10 15:04:17)
Message:

arm64: Add support for the architecture

This changeset adds basic support to run HelenOS on AArch64, targeting
the QEMU virt platform.

Boot:

  • Boot relies on the EDK II firmware, GRUB2 for EFI and the HelenOS bootloader (UEFI application). EDK II loads GRUB2 from a CD, GRUB2 loads the HelenOS bootloader (via UEFI) which loads OS components.
  • UEFI applications use the PE/COFF format and must be relocatable. The first problem is solved by manually having the PE/COFF headers and tables written in assembler. The relocatable requirement is addressed by compiling the code with -fpic and having the bootloader relocate itself at its startup.

Kernel:

  • Kernel code for AArch64 consists mostly of stubbing out various architecture-specific hooks: virtual memory management, interrupt and exception handling, context switching (including FPU lazy switching), support for virtual timer, atomic sequences and barriers, cache and TLB maintenance, thread and process initialization.
  • The patch adds a kernel driver for GICv2 (interrupt controller).
  • The PL011 kernel driver is extended to allow userspace to take ownership of the console.
  • The current code is not able to dynamically obtain information about available devices on the underlying machine. The port instead implements a machine-func interface similar to the one implemented by arm32. It defines a machine for the QEMU AArch64 virt platform. The configuration (device addresses and IRQ numbers) is then baked into the machine definition.

User space:

  • Uspace code for AArch64 similarly mostly implements architecture-specific hooks: context saving/restoring, syscall support, TLS support.

The patchset allows to boot the system but user interaction with the OS
is not yet possible.

Location:
kernel
Files:
53 added
16 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/abs32le/include/arch/mm/as.h

    rb58728f r84176f3  
    3737
    3838#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     39#define KERNEL_SEPARATE_PTL0_ARCH           0
    3940
    4041#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT32_C(0x80000000)
  • kernel/arch/amd64/include/arch/mm/as.h

    rb58728f r84176f3  
    4040
    4141#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     42#define KERNEL_SEPARATE_PTL0_ARCH           0
    4243
    4344#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT64_C(0xffff800000000000)
  • kernel/arch/arm32/include/arch/mm/as.h

    rb58728f r84176f3  
    3838
    3939#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     40#define KERNEL_SEPARATE_PTL0_ARCH           0
    4041
    4142#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT32_C(0x80000000)
  • kernel/arch/ia32/include/arch/mm/as.h

    rb58728f r84176f3  
    3737
    3838#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     39#define KERNEL_SEPARATE_PTL0_ARCH           0
    3940
    4041#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT32_C(0x80000000)
  • kernel/arch/ia64/include/arch/mm/as.h

    rb58728f r84176f3  
    3737
    3838#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     39#define KERNEL_SEPARATE_PTL0_ARCH           0
    3940
    4041#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT64_C(0xe000000000000000)
  • kernel/arch/mips32/include/arch/mm/as.h

    rb58728f r84176f3  
    3737
    3838#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     39#define KERNEL_SEPARATE_PTL0_ARCH           0
    3940
    4041#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT32_C(0x80000000)
  • kernel/arch/ppc32/include/arch/mm/as.h

    rb58728f r84176f3  
    3939
    4040#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     41#define KERNEL_SEPARATE_PTL0_ARCH           0
    4142
    4243#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT32_C(0x80000000)
  • kernel/arch/riscv64/include/arch/mm/as.h

    rb58728f r84176f3  
    4040
    4141#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  0
     42#define KERNEL_SEPARATE_PTL0_ARCH           0
    4243
    4344#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT64_C(0xffff800000000000)
  • kernel/arch/sparc64/include/arch/mm/sun4u/as.h

    rb58728f r84176f3  
    3939
    4040#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  1
     41#define KERNEL_SEPARATE_PTL0_ARCH           0
    4142
    4243#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT64_C(0x0000000000000000)
  • kernel/arch/sparc64/include/arch/mm/sun4v/as.h

    rb58728f r84176f3  
    4141
    4242#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH  1
     43#define KERNEL_SEPARATE_PTL0_ARCH           0
    4344
    4445#define KERNEL_ADDRESS_SPACE_START_ARCH  UINT64_C(0x0000000000000000)
  • kernel/doc/doxygroups.h

    rb58728f r84176f3  
    4747
    4848/**
     49 *     @cond arm64
     50 *     @defgroup kernel_arm64_proc arm64
     51 *     @ingroup proc
     52 *     @endcond
     53 */
     54
     55/**
    4956 *     @cond ia32
    5057 *     @defgroup kernel_ia32_proc ia32
     
    123130 *     @cond arm32
    124131 *     @defgroup kernel_arm32_mm arm32
     132 *     @ingroup mm
     133 *     @endcond
     134 */
     135
     136/**
     137 *     @cond arm64
     138 *     @defgroup kernel_arm64_mm arm64
    125139 *     @ingroup mm
    126140 *     @endcond
     
    209223
    210224/**
     225 *     @cond arm64
     226 *     @defgroup kernel_arm64_ddi arm64
     227 *     @ingroup ddi
     228 *     @endcond
     229 */
     230
     231/**
    211232 *     @cond ia32
    212233 *     @defgroup kernel_ia32_ddi ia32
     
    281302
    282303/**
     304 *     @cond arm64
     305 *     @defgroup kernel_arm64_debug arm64
     306 *     @ingroup debug
     307 *     @endcond
     308 */
     309
     310/**
    283311 *     @cond ia32
    284312 *     @defgroup kernel_amd64_debug ia32/amd64
     
    352380
    353381/**
     382 *     @cond arm64
     383 *     @defgroup kernel_arm64_interrupt arm64
     384 *     @ingroup interrupt
     385 *     @endcond
     386 */
     387
     388/**
    354389 *     @cond ia32
    355390 *     @defgroup kernel_ia32_interrupt ia32
     
    429464
    430465/**
     466 *     @cond arm64
     467 *     @defgroup kernel_arm64 arm64
     468 *     @ingroup others
     469 *     @endcond
     470 */
     471
     472/**
    431473 *     @cond ia32
    432474 *     @defgroup kernel_ia32 ia32
  • kernel/genarch/Makefile.inc

    rb58728f r84176f3  
    127127endif
    128128
     129ifeq ($(CONFIG_GICV2), y)
     130GENARCH_SOURCES += \
     131        genarch/src/drivers/gicv2/gicv2.c
     132endif
     133
    129134ifeq ($(CONFIG_VIA_CUDA),y)
    130135GENARCH_SOURCES += \
  • kernel/genarch/include/genarch/drivers/pl011/pl011.h

    rb58728f r84176f3  
    3838#define KERN_PL011_H_
    3939
     40#include <ddi/ddi.h>
    4041#include <ddi/irq.h>
    4142#include <console/chardev.h>
     
    150151        outdev_t outdev;
    151152        irq_t irq;
     153        parea_t parea;
    152154} pl011_uart_t;
    153155
  • kernel/genarch/src/drivers/pl011/pl011.c

    rb58728f r84176f3  
    6060        pl011_uart_t *uart = dev->data;
    6161
    62         if (!ascii_check(ch)) {
     62        /* If the userspace owns the console, do not output anything. */
     63        if (uart->parea.mapped && !console_override)
     64                return;
     65
     66        if (!ascii_check(ch))
    6367                pl011_uart_sendb(uart, U_SPECIAL);
    64         } else {
     68        else {
    6569                if (ch == '\n')
    6670                        pl011_uart_sendb(uart, (uint8_t) '\r');
     
    100104        assert(uart);
    101105        uart->regs = (void *)km_map(addr, sizeof(pl011_uart_regs_t),
    102             KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
     106            KM_NATURAL_ALIGNMENT, PAGE_WRITE | PAGE_NOT_CACHEABLE);
    103107        assert(uart->regs);
    104108
     
    131135        uart->irq.instance = uart;
    132136
     137        ddi_parea_init(&uart->parea);
     138        uart->parea.pbase = addr;
     139        uart->parea.frames = 1;
     140        uart->parea.unpriv = false;
     141        uart->parea.mapped = false;
     142        ddi_parea_register(&uart->parea);
     143
    133144        return true;
    134145}
  • kernel/genarch/src/mm/as_pt.c

    rb58728f r84176f3  
    7676            PA2KA(frame_alloc(PTL0_FRAMES, FRAME_LOWMEM, PTL0_SIZE - 1));
    7777
    78         if (flags & FLAG_AS_KERNEL)
    79                 memsetb(dst_ptl0, PTL0_SIZE, 0);
    80         else {
     78        memsetb(dst_ptl0, PTL0_SIZE, 0);
     79
     80        if (!KERNEL_SEPARATE_PTL0 && !(flags & FLAG_AS_KERNEL)) {
    8181                /*
    8282                 * Copy the kernel address space portion to new PTL0.
     
    9393                    &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)];
    9494
    95                 memsetb(dst_ptl0, PTL0_SIZE, 0);
    9695                memcpy((void *) dst, (void *) src,
    9796                    PTL0_SIZE - (src - (uintptr_t) src_ptl0));
  • kernel/generic/include/mm/as.h

    rb58728f r84176f3  
    5959#define KERNEL_ADDRESS_SPACE_SHADOWED  KERNEL_ADDRESS_SPACE_SHADOWED_ARCH
    6060
     61/**
     62 * Defined to be true if user address space and kernel address space do not
     63 * share the same page table.
     64 */
     65#define KERNEL_SEPARATE_PTL0 KERNEL_SEPARATE_PTL0_ARCH
     66
    6167#define KERNEL_ADDRESS_SPACE_START  KERNEL_ADDRESS_SPACE_START_ARCH
    6268#define KERNEL_ADDRESS_SPACE_END    KERNEL_ADDRESS_SPACE_END_ARCH
Note: See TracChangeset for help on using the changeset viewer.