root/usr/src/cmd/bhyve/amd64/e820.h
/*-
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2021 Beckhoff Automation GmbH & Co. KG
 * Author: Corvin Köhne <c.koehne@beckhoff.com>
 */

#pragma once

#include <vmmapi.h>

#include "qemu_fwcfg.h"

enum e820_memory_type {
        E820_TYPE_MEMORY = 1,
        E820_TYPE_RESERVED = 2,
        E820_TYPE_ACPI = 3,
        E820_TYPE_NVS = 4
};

enum e820_allocation_strategy {
        /* allocate any address */
        E820_ALLOCATE_ANY,
        /* allocate lowest address larger than address */
        E820_ALLOCATE_LOWEST,
        /* allocate highest address lower than address */
        E820_ALLOCATE_HIGHEST,
        /* allocate a specific address */
        E820_ALLOCATE_SPECIFIC
};

struct e820_entry {
        uint64_t base;
        uint64_t length;
        uint32_t type;
} __packed;

#define E820_ALIGNMENT_NONE 1

uint64_t e820_alloc(const uint64_t address, const uint64_t length,
    const uint64_t alignment, const enum e820_memory_type type,
    const enum e820_allocation_strategy strategy);
void e820_dump_table(void);
int e820_init(struct vmctx *const ctx);
int e820_finalize(void);