1/*
2 * Copyright 2019, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9/***
10 * @module guest_image.h
11 * The guest image interface provides general utilites to load guest vm images (e.g. kernel, initrd, modules).
12 * This interface probably stops being relevant/useful after we start running a VM instance.
13 */
14
15#include <sel4vm/guest_vm.h>
16#include <sel4vmmplatsupport/arch/guest_image_arch.h>
17
18typedef struct guest_kernel_image_arch guest_kernel_image_arch_t;
19
20/***
21 * @struct guest_image
22 * General datastructure for managing a guest image
23 * @param {uintptr_t} load_paddr    Base address (in guest physical) where the image was loaded
24 * @param {size_t} alignment        Alignment we used when loading the image
25 * @param {size_t} size             Size of guest image
26 */
27typedef struct guest_image {
28    uintptr_t load_paddr;
29    size_t alignment;
30    size_t size;
31} guest_image_t;
32
33/***
34 * @struct guest_kernel_image
35 * Stores information about the guest kernel image we are loading.
36 * @param {guest_image_t} kernel_image                      Datastructure referring to guest kernel image
37 * @param {guest_kernel_image_arch_t} kernel_image_arch     Architecture specific information for loaded guest image
38 */
39typedef struct guest_kernel_image {
40    guest_image_t kernel_image;
41    guest_kernel_image_arch_t kernel_image_arch;
42} guest_kernel_image_t;
43
44/***
45 * @function vm_load_guest_kernel(vm, kernel_name, load_address, alignment, guest_kernel_image)
46 * Load guest kernel image
47 * @param {vm_t *} vm                                           Handle to the VM
48 * @param {const char *} kernel_name                            Name of the kernel image
49 * @param {uintptr_t} load_address                              Address to load guest kernel image at
50 * @param {size_t} alignment                                    Alignment for loading kernel image
51 * @param {guest_kernel_image_t *} guest_kernel_image           Handle to information regarding the resulted loading of the guest kernel image
52 * @return                                                      0 on success, otherwise -1 on error
53 */
54int vm_load_guest_kernel(vm_t *vm, const char *kernel_name, uintptr_t load_address, size_t alignment,
55                         guest_kernel_image_t *guest_kernel_image);
56
57/***
58 * @function vm_load_guest_module(vm, module_name, load_address, alignment, guest_image)
59 * Load guest kernel module e.g. initrd
60 * @param {vm_t *} vm                           Handle to the VM
61 * @param {const char *} module_name            Name of the module image
62 * @param {uintptr_t} load_address              Address to load guest kernel image at
63 * @param {size_t} alignment                    Alignment for loading module image
64 * @param {guest_image_t *} guest_image         Handle to information regarding the resulted loading of the guest module image
65 * @return                                      0 on success, otherwise -1 on error
66 */
67int vm_load_guest_module(vm_t *vm, const char *module_name, uintptr_t load_address, size_t alignment,
68                         guest_image_t *guest_image);
69