Changeset a4bd537 in mainline for boot/genarch/src/efi.c


Ignore:
Timestamp:
2019-04-06T13:39:58Z (5 years ago)
Author:
Petr Pavlu <setup@…>
Children:
f7842ef
Parents:
0d073b8
git-author:
Petr Pavlu <setup@…> (2019-03-31 14:09:57)
git-committer:
Petr Pavlu <setup@…> (2019-04-06 13:39:58)
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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • boot/genarch/src/efi.c

    r0d073b8 ra4bd537  
    4242        return NULL;
    4343}
     44
     45efi_status_t efi_get_memory_map(efi_system_table_t *st,
     46    sysarg_t *memory_map_size, efi_v1_memdesc_t **memory_map, sysarg_t *map_key,
     47    sysarg_t *descriptor_size, uint32_t *descriptor_version)
     48{
     49        efi_status_t status;
     50
     51        *memory_map_size = 8 * sizeof(**memory_map);
     52
     53        do {
     54                /* Allocate space for the memory map. */
     55                status = st->boot_services->allocate_pool(EFI_LOADER_DATA,
     56                    *memory_map_size, (void **) memory_map);
     57                if (status != EFI_SUCCESS)
     58                        return status;
     59
     60                /* Try to obtain the map. */
     61                status = st->boot_services->get_memory_map(memory_map_size,
     62                    *memory_map, map_key, descriptor_size, descriptor_version);
     63                if (status == EFI_SUCCESS)
     64                        return status;
     65
     66                /* An error occurred, release the allocated memory. */
     67                st->boot_services->free_pool(*memory_map);
     68        } while (status == EFI_BUFFER_TOO_SMALL);
     69
     70        return status;
     71}
Note: See TracChangeset for help on using the changeset viewer.