| /* | 
 |  * Hosted file support for semihosting syscalls. | 
 |  * | 
 |  * Copyright (c) 2005, 2007 CodeSourcery. | 
 |  * Copyright (c) 2019 Linaro | 
 |  * Copyright © 2020 by Keith Packard <keithp@keithp.com> | 
 |  * | 
 |  * SPDX-License-Identifier: GPL-2.0-or-later | 
 |  */ | 
 |  | 
 | #ifndef SEMIHOSTING_GUESTFD_H | 
 | #define SEMIHOSTING_GUESTFD_H | 
 |  | 
 | typedef enum GuestFDType { | 
 |     GuestFDUnused = 0, | 
 |     GuestFDHost, | 
 |     GuestFDGDB, | 
 |     GuestFDStatic, | 
 |     GuestFDConsole, | 
 | } GuestFDType; | 
 |  | 
 | /* | 
 |  * Guest file descriptors are integer indexes into an array of | 
 |  * these structures (we will dynamically resize as necessary). | 
 |  */ | 
 | typedef struct GuestFD { | 
 |     GuestFDType type; | 
 |     union { | 
 |         int hostfd; | 
 |         struct { | 
 |             const uint8_t *data; | 
 |             size_t len; | 
 |             size_t off; | 
 |         } staticfile; | 
 |     }; | 
 | } GuestFD; | 
 |  | 
 | /* | 
 |  * For ARM semihosting, we have a separate structure for routing | 
 |  * data for the console which is outside the guest fd address space. | 
 |  */ | 
 | extern GuestFD console_in_gf; | 
 | extern GuestFD console_out_gf; | 
 |  | 
 | /** | 
 |  * alloc_guestfd: | 
 |  * | 
 |  * Allocate an unused GuestFD index.  The associated guestfd index | 
 |  * will still be GuestFDUnused until it is initialized. | 
 |  */ | 
 | int alloc_guestfd(void); | 
 |  | 
 | /** | 
 |  * dealloc_guestfd: | 
 |  * @guestfd: GuestFD index | 
 |  * | 
 |  * Deallocate a GuestFD index.  The associated GuestFD structure | 
 |  * will be recycled for a subsequent allocation. | 
 |  */ | 
 | void dealloc_guestfd(int guestfd); | 
 |  | 
 | /** | 
 |  * get_guestfd: | 
 |  * @guestfd: GuestFD index | 
 |  * | 
 |  * Return the GuestFD structure associated with an initialized @guestfd, | 
 |  * or NULL if it has not been allocated, or hasn't been initialized. | 
 |  */ | 
 | GuestFD *get_guestfd(int guestfd); | 
 |  | 
 | /** | 
 |  * associate_guestfd: | 
 |  * @guestfd: GuestFD index | 
 |  * @hostfd: host file descriptor | 
 |  * | 
 |  * Initialize the GuestFD for @guestfd to GuestFDHost using @hostfd. | 
 |  */ | 
 | void associate_guestfd(int guestfd, int hostfd); | 
 |  | 
 | /** | 
 |  * staticfile_guestfd: | 
 |  * @guestfd: GuestFD index | 
 |  * @data: data to be read | 
 |  * @len: length of @data | 
 |  * | 
 |  * Initialize the GuestFD for @guestfd to GuestFDStatic. | 
 |  * The @len bytes at @data will be returned to the guest on reads. | 
 |  */ | 
 | void staticfile_guestfd(int guestfd, const uint8_t *data, size_t len); | 
 |  | 
 | #endif /* SEMIHOSTING_GUESTFD_H */ |