qemu/include/semihosting/guestfd.h
<<
>>
Prefs
   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
  14typedef 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 */
  26typedef 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 */
  42extern GuestFD console_in_gf;
  43extern 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 */
  51int 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 */
  60void 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 */
  69GuestFD *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 */
  78void 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 */
  89void staticfile_guestfd(int guestfd, const uint8_t *data, size_t len);
  90
  91#endif /* SEMIHOSTING_GUESTFD_H */
  92