1 /* 2 * Hosted file support for semihosting syscalls. 3 * 4 * Copyright (c) 2005, 2007 CodeSourcery. 5 * Copyright (c) 2019 Linaro 6 * Copyright © 2020 by Keith Packard <keithp@keithp.com> 7 * 8 * SPDX-License-Identifier: GPL-2.0-or-later 9 */ 10 11 #ifndef SEMIHOSTING_GUESTFD_H 12 #define SEMIHOSTING_GUESTFD_H 13 14 typedef enum GuestFDType { 15 GuestFDUnused = 0, 16 GuestFDHost, 17 GuestFDGDB, 18 GuestFDStatic, 19 GuestFDConsole, 20 } GuestFDType; 21 22 /* 23 * Guest file descriptors are integer indexes into an array of 24 * these structures (we will dynamically resize as necessary). 25 */ 26 typedef struct GuestFD { 27 GuestFDType type; 28 union { 29 int hostfd; 30 struct { 31 const uint8_t *data; 32 size_t len; 33 size_t off; 34 } staticfile; 35 }; 36 } GuestFD; 37 38 /* 39 * For ARM semihosting, we have a separate structure for routing 40 * data for the console which is outside the guest fd address space. 41 */ 42 extern GuestFD console_in_gf; 43 extern GuestFD console_out_gf; 44 45 /** 46 * alloc_guestfd: 47 * 48 * Allocate an unused GuestFD index. The associated guestfd index 49 * will still be GuestFDUnused until it is initialized. 50 */ 51 int alloc_guestfd(void); 52 53 /** 54 * dealloc_guestfd: 55 * @guestfd: GuestFD index 56 * 57 * Deallocate a GuestFD index. The associated GuestFD structure 58 * will be recycled for a subsequent allocation. 59 */ 60 void dealloc_guestfd(int guestfd); 61 62 /** 63 * get_guestfd: 64 * @guestfd: GuestFD index 65 * 66 * Return the GuestFD structure associated with an initialized @guestfd, 67 * or NULL if it has not been allocated, or hasn't been initialized. 68 */ 69 GuestFD *get_guestfd(int guestfd); 70 71 /** 72 * associate_guestfd: 73 * @guestfd: GuestFD index 74 * @hostfd: host file descriptor 75 * 76 * Initialize the GuestFD for @guestfd to GuestFDHost using @hostfd. 77 */ 78 void associate_guestfd(int guestfd, int hostfd); 79 80 /** 81 * staticfile_guestfd: 82 * @guestfd: GuestFD index 83 * @data: data to be read 84 * @len: length of @data 85 * 86 * Initialize the GuestFD for @guestfd to GuestFDStatic. 87 * The @len bytes at @data will be returned to the guest on reads. 88 */ 89 void staticfile_guestfd(int guestfd, const uint8_t *data, size_t len); 90 91 #endif /* SEMIHOSTING_GUESTFD_H */ 92