Thassilo Schulze [Mon, 24 Jun 2024 12:57:32 +0000 (14:57 +0200)]
plat/xen: Update Xen to use console drivers in `drivers/`
* Imply the console drivers from the Xen platform
if `ukconsole` is enabled.
* The original Xen console header that was called
`common/console.h` in the platform now lives in
the `drivers/` folder where it's accessible as
`xen/console.h`.
* The Xen console drivers in the `drivers/` directory
will register in the early init tab. That's why the
setup on x86 and Arm has to change slightly (see diff)
Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
Thassilo Schulze [Mon, 17 Jun 2024 14:37:46 +0000 (16:37 +0200)]
plat/kvm: Delete console driver files for x86_64
* The implementation of the console drivers now lives
in `drivers/`. Additional functionality that was in
the platform before is in `ukconsole`.
* The delete console driver configuration options now
live in the `drivers/uktty/` subdirectories
* Delete MRD-related code for x86 video memory. This
MRD is inserted by the VGA driver on init now.
Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
drivers/ukconsole: Adapt PL011 driver to work with `ukconsole`
The PL011 driver can register devices in the early init table
and in the inittab. There can only be a single device that's
registers in the early init table and the base address for
that device can be configured using kconfig or using a kernel
parameter.
Any number of devices can be registered in the init table. The
DTB is searched for PL011 UARTs. If a device is found, a new
device structure is dynamically allocated and registered with
`ukconsole`.
Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
drivers/ukconsole: Adapt VGA driver for use with `ukconsole`
The VGA driver registers a device with `ukconsole` in
the early init table. The device that the driver registers
only has the `UK_CONSOLE_FLAG_STDOUT` flag set because the
VGA driver doesn't implement keyboard input.
Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
drivers/ukconsole: Adapt COM driver to work with `ukconsole`
The COM driver now exposes COM ports COM1 to COM4. The
driver registers a `struct uk_console` for a port to
make that port available to `ukconsole`. One of the
ports can be configured as the "early console". This
port is initialized and registered in the early init
table. All other ports besides the configured "early
console" are initialized and registered when the init
table runs.
Checkpatch-Ignore: EMBEDDED_FUNCTION_NAME Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
Thassilo Schulze [Tue, 25 Jun 2024 13:51:33 +0000 (15:51 +0200)]
plat/kvm: Move `serial_console.c` into `drivers/ukconsole/ns16550/`
`serial_console.c` implements a driver for the COM ports
on x86. The driver is now moved out of the platform and
will be registered with `ukconsole` in the future. The device
underlying the COM port interface is a 16550 / 8250 so the
`ns16550` subdirectory is the right place to put this driver.
Because the device is the same on Arm and on x86, the `com.c`
and `ns16550.c` driver should be merged into one driver in
the future.
Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
Thassilo Schulze [Thu, 20 Jun 2024 11:38:18 +0000 (13:38 +0200)]
lib/syscall_shim: Switch from `ukplat` to `ukconsole` for printing
This commit makes the syscall shim call into `ukconsole`
to print some message. Direct calls to `ukconsole` like
this one should normally be avoided in favor of calling
into `ukdebug`. But in this case, we don't want to print
the extra information that `ukdebug` always includes.
When there is a kernel print system in the future, the
new print calls in this commit will be updated.
This commit avoids creating a direct dependency between
the syscall shim and `ukconsole` because the call into
`ukconsole` is a workaround anyway and will be removed
in the future.
Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
lib/ukconsole: Add abstraction layer for console drivers
`ukconsole` is a new library that implements a generic
interface for console devices. It will be used to replace
the current kernel/debug print system that's based on the
`ukplat_c[out|in][k|d]` functions. `ukconsole` is
groundwork for properly integrating the gdb stub with
Unikraft and for adding a proper kernel print system
later on.
Signed-off-by: Thassilo Schulze <thassilo@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1464
Samuel Hym [Mon, 24 Jun 2024 13:04:15 +0000 (15:04 +0200)]
build: Log calls to the `multiboot` and `mkefi` scripts
Use `build_cmd` to log calls to `multiboot.py` as `MULTIBT` and to
`mkefi.py` as `MKEFI` instead of completely hiding them
This uses fake `.multiboot` and `.efi` extensions to avoid clashing with
the first rule generating the target (ie overwriting its `.cmd` file)
Note this is already done with the `.bin` extension when generating the
binary image
Signed-off-by: Samuel Hym <samuel@tarides.com> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1469
Andrei Stan [Fri, 6 Sep 2024 19:07:41 +0000 (22:07 +0300)]
plat/xen: Fix implicit conversion on return type
Clang throws an error when trying to implicitly convert
from `const void*` to `const char *`.
Signed-off-by: Andrei Stan <andreistan2003@gmail.com> Approved-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1482
When PL011_EARLY_CONSOLE is set, the base address of the MMIO
region is provided by the node pointed by the device'tree's
`/chosen/stdout-path`, or by the pl011.base cmdline parameter.
When NS16550_EARLY_CONSOLE is set, the base address of the MMIO
region is provided by the node pointed by the device'tree's
`/chosen/stdout-path`, or by the ns16550.base cmdline parameter.
The register-shift and register-width parameters are provided by
the device-tree via the `reg-shift` and `reg-io-width` properties.
Add fdt_chosen_stdout_path() helper to derive the boot console.
This returns the node pointed by `/chosen/stdout-path` as well
as any console options set.
Update plat/kvm for newly introduced libukboot early init.
arm64:
- Deprecate kvm/arm64/early_init.c and calls.
arm64 & x86_64:
- Remove ukplat_memregion_list_coalesce() from boot protocols.
Coalescing is now part of libukboot early init.
- Remove cmdline_init() from kvm/arm64 and kvm/x86_64. Command line
initialization is now performed of libukboot early init.
- Call uk_boot_early_init() from _ukplat_entry()
- Remove call to ukplat_entry_argp() and jump directly to
uk_boot_entry()
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Reviewed-by: Oleksii Moisieiev <oleksii_moisieiev@epam.com> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Stan <andreistan2003@gmail.com> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1472
plat: Move SIPI vector mrd allocation to lcpu_mp_init
Move the SIPI vector mdr allocation from the boot protocol
to lcpu_arch_mp_init(). Notice that lcpu_arch_mp_init() must
be called after mrd coalescing.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Reviewed-by: Oleksii Moisieiev <oleksii_moisieiev@epam.com> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Stan <andreistan2003@gmail.com> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1472
Introduce uk_boot_early_init(). This implements an early init
bootstage based on uk_boot_earlytab.
Register cmdline parsing at UK_PRIO_EARLIEST to provide cmdline args
to functions registered into the earlytab.
Deprecate ukplat_entry_argp(). Platforms must now call
uk_boot_early_init() to parse the command line arguments.
As mrd allocation must happen after coalesce, but cmdline parsing must
happen at UK_PRIO_EARLY (before coalesce), deprecate the requirement
for boot protocols to pass a cmdline mrd. Also deprecate the
requirement that platforms provide mutable copy of the cmdline mrd,
as copying is internally performed by the cmdline parsing of early
init into newly introduced buffer of configurable size
(CONFIG_LIBUKBOOT_CMDLINE_MAX_LEN).
Register mrd coalescing as the penultimate priority and reserve
UK_PRIO_LATEST for post-coalesce functions.
Register parsing of uklibparam at UK_PRIO_EARLIEST to provide the
rest of earlytab entries with early cmdline. Notice that for the
time being this has the side-effect of information printed by
libuklibparam to be lost, as earlycon is registered to a later
priority. This will be resolved once libukprint is introduced, as
that library will provide a console buffer.
Checkpatch-Ignore: AVOID_EXTERNS
Checkpatch-Ignore: MACRO_ARG_REUSE
Checkpatch-Ignore: STRNCPY Signed-off-by: Michalis Pappas <michalis@unikraft.io> Reviewed-by: Oleksii Moisieiev <oleksii_moisieiev@epam.com> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Stan <andreistan2003@gmail.com> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1472
uk_boot_earlytab is a simplified version of uk_inittab for libraries
that need to register functions at the early boot stage. Libraries
can register with the earlytab using the uk_boot_earlytab_register()
macro.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Reviewed-by: Oleksii Moisieiev <oleksii_moisieiev@epam.com> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Stan <andreistan2003@gmail.com> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1472
Michalis Pappas [Mon, 24 Jun 2024 11:42:05 +0000 (13:42 +0200)]
drivers/ukbus/platform: Rework uk_bus_pf_devmap()
Updating the attributes of an already mapped region can potentially
fail as ukplat_page_map() will also return EEXIST for a partially
mapped region too. Addressing the problem by handling a region
page-by-page normally works, yet it is too slow for devices with
large regions like PCI. Rework the implementation to remap the entire
region if ukplat_page_map() returns EEXIST.
Remove UK_CTORS registration to allow libukparam parsing to be
executed during early init. Parameters now are registered into
a global section similarly to inittab. This additionally fixes
a limitation of the previous registration mechanism where all
parameters had to be registered from a single file.
Checkpatch-Ignore: MACRO_ARG_REUSE Signed-off-by: Michalis Pappas <michalis@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1471
sebastian [Sun, 16 Jun 2024 11:26:18 +0000 (14:26 +0300)]
lib/vfscore: Fix renameat function in vfscore
In the renameat function, 'dest' variable is declared but not initialized,
leading to unexpected behaviour. Fix by making sure 'dest' is being set
in the else branch by replacing "src" with "dest" in the strlcpy function.
Signed-off-by: Sebastian Ion <sebastianion@outlook.com> Reviewed-by: Radu Nichita <radunichita99@gmail.com> Reviewed-by: Andrei Tatar <andrei@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io>
GitHub-Closes: #1460
Marco Schlumpp [Fri, 28 Jun 2024 12:52:28 +0000 (14:52 +0200)]
.github: Remove CODEOWNERS
The goal of the CODEOWNERS file is to automatically assign PRs to the
responsible team. However, this notifies the full team instead of individual
persons and we manually assign specific persons anyway via a bot. After the
team was added as a review once, the notifications will be still sent even
after the team removal. This causes an immensive amount of noise and many
people disable notifications/mails entirely making it necessary to rely
on out-of-band channels to notify people of actual review requests.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Alexander Jung <alex@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io>
GitHub-Closes: #1468
Simon Kuenzer [Fri, 14 Jun 2024 22:29:06 +0000 (00:29 +0200)]
support/qemu-guest: Enable RDRAND, RDSEED for x86 TCG
QEMU's TCG for x86 can emulate `rdrand` and `rdseed` instructions as
long as specified via `-cpu` parameter and QEMU 8.1.3 or newer is used.
Due to recent requirements introduced with `lib/ukrandom` (see PR #1008,
PR #1451), we request `rdseed` and `rdrand` when using TCG.
Sergiu Moga [Thu, 6 Jun 2024 11:33:35 +0000 (14:33 +0300)]
plat/common: Fix wrong `vbase` of legacy video memory area
Commit a001e41f607c ("plat/common/x86: Increase legacy high regions granularity")
used the wrong value for the vbase, using by mistake the length of the
region instead of its start. Fix this.
Michalis Pappas [Wed, 5 Jun 2024 15:42:58 +0000 (17:42 +0200)]
lib/ukrandom: Add option to seed the CSPRNG with a fixed value
Add an option to seed the CSPRNG with a fixed value. This options is
intended for development purposes, or running Unikraft in legacy
systems that don't provide a TRNG.
Enabling this option compromises the system's security. The build
system will mark Unikraft as tainted and libukrandom will print a
banner during init.
Michalis Pappas [Wed, 5 Jun 2024 16:04:29 +0000 (18:04 +0200)]
lib/ukrandom: Use RDRAND to seed ChaCha
It has been observed that in some x86_64 systems the loop that initializes
the ChaCha seed fails after a few iterations due to exhaustion of the
conditioned entropy. In [1] Intel suggests that performance-crtical
systems may use RDRAND instead. Switch to ukarch_random_u32() to
mitigate this risk. In the future there should be a mechanism to allow
configuring the mechanism that controls this behavior, for systems that
favor security to performance.
There is no leftover space, but a memory region of negative size is
inserted. so check for the size of the negative region before doing any
insertions.
Sergiu Moga [Wed, 5 Jun 2024 14:12:34 +0000 (17:12 +0300)]
plat/common/x86: Increase legacy high regions granularity
Split the previously named `HI_MEM` region into two separate
regions:
- a region for display buffers for video adapters (e.g. VGA Text Mode)
- mapped PCI expansion ROMs regions
This is the new legacy high region expected layout:
Expected memory map for the first 1MiB w.r.t. PC-AT systems compatibility
0x00000 – 0x9FFFF 640KB Main memory, DOS compatible. May contain the
following memory subregions that we will not need after
boot. If the EBDA is defined here, then 1KB starting
at that address shall be treated as a reserved region
0x00000 - 0x003FF Legacy BIOS IVT, segmented pointers to software
interrupt routines defined in the ROM BIOS
0x0040E - 0x0040F Optional EBDA segmented pointer (part of BDA's
structure that occupies 40:00 -> 40:101 range)
0x9FC00 - 0xA0000 Default 1KB of EBDA if not defined in previous
region
0xA0000 – 0xBFFFF 128KB Display buffer for video adapters and possible
SMM Shadow Memory
0xC0000 – 0xDFFFF 128KB ROM BIOS for add-on cards (PCI XROMBARs)
0xE0000 – 0xFFFFF 128KB System ROM BIOS
NOTE: Some systems only report 0xF0000 - 0xFFFFF for the System ROM BIOS
and that is fine.
Note that we are assigning UKPLAT_MEMRT_RESERVED to BIOS PCI ROM.
We usually have here the routines used by real-mode
bootloaders invoked through the BIOS IVT. Although this may not be
necessary anymore, we cannot assign UKPLAT_MEMRT_FREE either since
some BIOSes do set this as a RO segment in the corresponding chipset
registers, leaving this potentially unusable. Thus, just treat it
as a memory hole.
NOTE: For compatibility with newer Firecracker versions (1.7.0+), if VGA
does not exist, we mark its region as READ-ONLY.
NOTE: Assertions for in-page offsets for such regions has also been
obsoleted to deal with regions like those of EBDA, that are not
page-aligned.
Sergiu Moga [Wed, 5 Jun 2024 08:36:20 +0000 (11:36 +0300)]
plat/kvm/x86: Ensure free memory regions' lengths are page aligned
All free memory regions must meet the following criteria:
mrd->len == mrd->pg_count * PAGE_SIZE. The `pg_count` field is
equal to the value of `PAGE_COUNT` (i.e. `DIV_ROUND_UP` of `PAGE_SIZE`)
of `len + pg_off`, however in theory this (times `PAGE_SIZE`) should be
equal to the `PAGE_ALIGN_UP` of the latter as well.
To catch cases where this may not happen (if possible), do this
differently: `PAGE_COUNT` for `pg_count` and `PAGE_ALIGN_UP` for `len`.
The lxboot boot code did not correctly compute `len` because of this,
so fix it.
Sergiu Moga [Wed, 5 Jun 2024 08:32:51 +0000 (11:32 +0300)]
plat/common: Ensure overlapping free regions length is page aligned
When a memory region descriptor of type free memory overlaps with
another, the former gets adjusted in favor of the former. However,
a condition all free memory regions must meet is that:
mrd->len == mrd->pg_count * PAGE_SIZE.
Ensure this is maintained after an overlapping fixup following a
coalescing operation.
Michalis Pappas [Tue, 4 Jun 2024 10:40:09 +0000 (12:40 +0200)]
plat/kvm: Enable HAVE_RANDOM
Enable HAVE_RANDOM on QEMU and Firecracker. This flag implies that
the platform provides a hardware RNG that libukrandom can rely on
to securely seed the CSPRNG.
This commit addresses the public API by renaming the main randomness
function uk_swrand_fill_buffer() to uk_random_fill_buffer(), to abide
Unikraft's naming convention.
As a result, the private hwrng function fill_buffer() is renamed to
uk_random_hwrng_fill_buffer().
uk_random_fill_buffer() is the result of a PRNG and it never fails.
Make it void to reflect this.
Alex Apostolescu [Fri, 31 May 2024 04:37:02 +0000 (07:37 +0300)]
lib/ukrandom: Clean ChaCha20 implementation
This commit covers the esthetical issues of the chacha implementation.
It replaces size_t and ssize_t with __sz and __ssz, and it removes the
leading underscore from functions name as it does not abide to
Unikraft's current convention.
Alex Apostolescu [Thu, 30 May 2024 20:44:17 +0000 (23:44 +0300)]
lib/ukrandom: Register /dev/hwrng
This commit introduces a new device node, /dev/hwrng, that provides
pass-through access to hardware randomness.
Hardware randomness will be available for the kernel API once
ukarch_random is implemneted as a driver. For the time being, restrict
the use of hardware randomness to /dev/hwrng.
Alex Apostolescu [Thu, 30 May 2024 15:41:28 +0000 (18:41 +0300)]
lib/ukrandom: Deprecate MWC
Deprecate multiply-with-carry (MWC) PRNG because it is not
cryptographycally secure.
Remove the choice for an algorithm in Config.uk as ChaCha20 is the only
supported algorithm.
Alex Apostolescu [Thu, 30 May 2024 14:48:16 +0000 (17:48 +0300)]
lib/ukrandom: Rename ukswrand to ukrandom
This commit renames ukswrand library to ukrandom to better describe its
use case. This library will provide cryptographically secure random
numbers, either directly from the hardware, or from a PRNG seeded with
the true random seed.
swrand.h is the main header of the library and should match its name,
therefore it is renamed to random.h. swrand.c is also renamed to match
the header.
Sergiu Moga [Mon, 3 Jun 2024 10:57:23 +0000 (13:57 +0300)]
plat/common/x86: Sanitize the ECTX slot on syscall entry
Commit c716bcca4822 ("{lib,arch,plat}: Redo syscall ctx's and swapgs logic"),
following a rework of architecture specific contexts and syscall entries,
by mistake removed the ECTX sanitization at the beginning of system calls.
This can result in #GP on x86 if the XSAVE header happens to be dirty.
Thus, bring this sanitization back.
Michalis Pappas [Sat, 1 Jun 2024 14:50:53 +0000 (16:50 +0200)]
arch/arm64: Add checks for min clang version
Add conditionals for clang to fix the build when arch features are
enabled. Set min clang version to 14 on all features as that is the
first clang version that supports branch-protection on arm64, and
for the rest of the features the only version tested.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Reviewed-by: Radu Nichita <radunichita99@gmail.com> Reviewed-by: Maria Sfiraiala <maria.sfiraiala@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io>
GitHub-Closes: #1439
Michalis Pappas [Tue, 26 Dec 2023 16:01:14 +0000 (17:01 +0100)]
drivers/uktty/ns16550: Add early_init
Add early device init. When paging is enabled, this adds an mrd for
the ns16550 MMIO region to bootinfo so that the region is not unmapped
during paged memory init.
Michalis Pappas [Sun, 31 Mar 2024 15:42:14 +0000 (17:42 +0200)]
drivers/uktty/ns16550: Move driver initialization to uk_inittab
Move console initialization with the rest of devices at
UK_INIT_CLASS_SYS. Since the pf bus does not support priority
levels, and the console should start before the pf bus to
allow drivers to print their status, register directly with
init instead of the pf bus.
Michalis Pappas [Sun, 31 Mar 2024 15:31:01 +0000 (17:31 +0200)]
drivers/uktty/ns16550: Map device region at runtime
Map the ns16550 region at runtime. This is now required as paged memory
init unmaps any memory not registered by early devices, thus if early
UART is not enabled the device regions is not mapped.
Michalis Pappas [Sat, 30 Mar 2024 13:34:43 +0000 (14:34 +0100)]
drivers/uktty/pl011: Add early init
Add early device init. When paging is enabled, this adds an mrd for
the pl011 MMIO region to bootinfo so that the region is not unmapped
during paged memory init.
Michalis Pappas [Sat, 30 Mar 2024 13:06:09 +0000 (14:06 +0100)]
drivers/uktty/pl011: Move driver initialization to initttab
Move console initialization with the rest of devices at
UK_INIT_CLASS_SYS. Since the pf bus does not support priority
levels, and the console should start before the pf bus to
allow drivers to print their status, register directly with
init instead of the pf bus.
Michalis Pappas [Sun, 31 Mar 2024 12:54:36 +0000 (14:54 +0200)]
drivers/uktty/pl011: Map region on runtime
Map the pl011 region at runtime. This is now required as paged memory
init unmaps any memory not registered by early devices, thus if early
UART is not enabled the device regions is not mapped.
Michalis Pappas [Fri, 8 Mar 2024 05:22:12 +0000 (06:22 +0100)]
plat/kvm/arm: Add early init boot stage
Add boot stage for early initialization. This is invoked at the end
of early boot code, before passing control to the platform.
Early devices can use the APIs provided by the boot protocol to obtain
any information required, such as device regions and the kernel
command line.
Drivers that register with early_init() should append mrds of their
MMIO regions to bootinfo so that these regions are not unmapped
during paged memory init. These mrds must use the newly introduced
UKPLAT_MEMRT_DEVICE type.
Notice that early drivers should not call ukplat_bootinfo_coalesce(),
as mrd coalescing is performed once at the end of early_init().
Michalis Pappas [Wed, 15 May 2024 13:30:15 +0000 (15:30 +0200)]
plat/kvm/x86: Coalesce bootinfo at EFI post
With bootinfo coalesce having moved out of EFI common code,
and with kvm/x86 lacking an early init bootstage, do the coalescing
as the last part at EFI post before jumping to kernel.
Remove coalescing from EFI bootinfo setup to allow coalescing to
happen at a boot protocol agnostic way at early_init(), after the
initialization of early devices.
Michalis Pappas [Tue, 14 May 2024 16:01:45 +0000 (18:01 +0200)]
plat/common: Move coalesce out of bootinfo fdt setup
Remove coalescing out of bootinfo fdt setup to allow coalescing happen
at a boot protocol agnostic way at early_init(), after the initialization
of early devices.
Break down bootinfo_fdt_setup() into a pre and post coalesce functions
as the latter call ukplat_memory_alloc() which operates on ordered
regions.