|  | /* | 
|  | * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) | 
|  | * | 
|  | * SPDX-License-Identifier: BSD-2-Clause | 
|  | */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include <stdbool.h> | 
|  | #include <sel4/types.h> | 
|  | #include <allocman/properties.h> | 
|  | #include <allocman/cspace/cspace.h> | 
|  | #include <vka/vka.h> | 
|  | #include <vka/object.h> | 
|  |  | 
|  | /* | 
|  | * Marks an untyped as being usable for creating arbitrary kernel objects. Objects | 
|  | * created from such untypeds have no restrictions and can be used for anything | 
|  | */ | 
|  | #define ALLOCMAN_UT_KERNEL 0 | 
|  | /* | 
|  | * Marks an untyped as being a device region. Device regions will never be used | 
|  | * for an allocation unless explicitly requested by physical address | 
|  | */ | 
|  | #define ALLOCMAN_UT_DEV 1 | 
|  | /* | 
|  | * Marks an untyped as being from a device region, but also usable RAM. Objects can | 
|  | * be created from these untypeds if the 'canBeDev' parameter in 'alloc' is set | 
|  | * to true. An object created from one of these untypeds may have restrictions | 
|  | * in what it can be used for and may not be zeroed, as it cannot be written by | 
|  | * the kernel. | 
|  | */ | 
|  | #define ALLOCMAN_UT_DEV_MEM 2 | 
|  |  | 
|  | /* Use the value of 1 internally to indicate the absence of a physical address. | 
|  | * This is chosen because the zero frame might actually be valid physical memory, | 
|  | * and 1 is not a valid alignment of any seL4 object, so it should never be | 
|  | * a valid physical address you can request */ | 
|  | #define ALLOCMAN_NO_PADDR 1 | 
|  |  | 
|  | /* Convert from size of an untyped object in bytes, to the size as acceptable to a call to | 
|  | * untyped retype */ | 
|  | static inline size_t get_sel4_object_size(seL4_Word type, size_t size_bits) { | 
|  | if (type == seL4_CapTableObject) { | 
|  | return size_bits - seL4_SlotBits; | 
|  | } else { | 
|  | return vka_get_object_size(type, size_bits); | 
|  | } | 
|  | } | 
|  |  | 
|  | struct allocman; | 
|  |  | 
|  | typedef struct utspace_interface { | 
|  | /* size_bits is always the size in memory of allocated object. This differs to the untypedretype | 
|  | semantics of size_bits when cnodes are involved */ | 
|  | seL4_Word (*alloc)(struct allocman *alloc, void *utspace, size_t size_bits, seL4_Word object_type, const cspacepath_t *slot, uintptr_t paddr, bool canBeDevice, int *error); | 
|  | void (*free)(struct allocman *alloc, void *utspace, seL4_Word cookie, size_t size_bits); | 
|  | int (*add_uts)(struct allocman *alloc, void *utspace, size_t num, const cspacepath_t *uts, size_t *size_bits, uintptr_t *paddr, int utType); | 
|  | uintptr_t (*paddr)(void *utspace, seL4_Word cookie, size_t size_bits); | 
|  | struct allocman_properties properties; | 
|  | void *utspace; | 
|  | }utspace_interface_t; | 
|  |  |