blob: ef5492c2f5a389a0a1a6a9327355bc210c222cf5 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// DO NOT EDIT. Generated from FIDL library
// zbi (//sdk/fidl/zbi/kernel.fidl)
// by zither, a Fuchsia platform tool.
#ifndef LIB_ZBI_FORMAT_KERNEL_H_
#define LIB_ZBI_FORMAT_KERNEL_H_
#include <stdint.h>
#if defined(__cplusplus)
extern "C" {
#endif
// The kernel image. In a bootable ZBI this item must always be first,
// immediately after the ZBI_TYPE_CONTAINER header. The contiguous memory
// image of the kernel is formed from the ZBI_TYPE_CONTAINER header, the
// ZBI_TYPE_KERNEL_{ARCH} header, and the payload.
//
// The boot loader loads the whole image starting with the container header
// through to the end of the kernel item's payload into contiguous physical
// memory. It then constructs a partial ZBI elsewhere in memory, which has
// a ZBI_TYPE_CONTAINER header of its own followed by all the other items
// that were in the booted ZBI plus other items synthesized by the boot
// loader to describe the machine. This partial ZBI must be placed at an
// address (where the container header is found) that is aligned to the
// machine's page size. The precise protocol for transferring control to
// the kernel's entry point varies by machine.
//
// On all machines, the kernel requires some amount of scratch memory to be
// available immediately after the kernel image at boot. It needs this
// space for early setup work before it has a chance to read any memory-map
// information from the boot loader. The `reserve_memory_size` field tells
// the boot loader how much space after the kernel's load image it must
// leave available for the kernel's use. The boot loader must place its
// constructed ZBI or other reserved areas at least this many bytes after
// the kernel image.
//
// x86-64
//
// The kernel assumes it was loaded at a fixed physical address of
// 0x100000 (1MB). zbi_kernel_t.entry is the absolute physical address
// of the PC location where the kernel will start.
// TODO(https://fxbug.dev/42098994): Perhaps this will change??
// The processor is in 64-bit mode with direct virtual to physical
// mapping covering the physical memory where the kernel and
// bootloader-constructed ZBI were loaded.
// The %rsi register holds the physical address of the
// bootloader-constructed ZBI.
// All other registers are unspecified.
//
// ARM64
//
// zbi_kernel_t.entry is an offset from the beginning of the image
// (i.e., the ZBI_TYPE_CONTAINER header before the ZBI_TYPE_KERNEL_ARM64
// header) to the PC location in the image where the kernel will
// start. The processor is in physical address mode at EL1 or
// above. The kernel image and the bootloader-constructed ZBI each
// can be loaded anywhere in physical memory. The x0 register
// holds the physical address of the bootloader-constructed ZBI.
// All other registers are unspecified.
//
// RISCV64
//
// zbi_kernel_t.entry is an offset from the beginning of the image (i.e.,
// the ZBI_TYPE_CONTAINER header before the ZBI_TYPE_KERNEL_RISCV64 header)
// to the PC location in the image where the kernel will start. The
// processor is in S mode, satp is zero, sstatus.SIE is zero. The kernel
// image and the bootloader-constructed ZBI each can be loaded anywhere in
// physical memory, aligned to 4KiB. The a0 register holds the HART ID,
// and the a1 register holds the 4KiB-aligned physical address of the
// bootloader-constructed ZBI. All other registers are unspecified.
typedef struct {
// Entry-point address. The interpretation of this differs by machine.
uint64_t entry;
// Minimum amount (in bytes) of scratch memory that the kernel requires
// immediately after its load image.
uint64_t reserve_memory_size;
} zbi_kernel_t;
#if defined(__cplusplus)
}
#endif
#endif // LIB_ZBI_FORMAT_KERNEL_H_