uboot/include/os.h
<<
>>
Prefs
   1/*
   2 * Operating System Interface
   3 *
   4 * This provides access to useful OS routines for the sandbox architecture.
   5 * They are kept in a separate file so we can include system headers.
   6 *
   7 * Copyright (c) 2011 The Chromium OS Authors.
   8 * SPDX-License-Identifier:     GPL-2.0+
   9 */
  10
  11#ifndef __OS_H__
  12#define __OS_H__
  13
  14#include <linux/types.h>
  15
  16struct rtc_time;
  17struct sandbox_state;
  18
  19/**
  20 * Access to the OS read() system call
  21 *
  22 * \param fd    File descriptor as returned by os_open()
  23 * \param buf   Buffer to place data
  24 * \param count Number of bytes to read
  25 * \return number of bytes read, or -1 on error
  26 */
  27ssize_t os_read(int fd, void *buf, size_t count);
  28
  29/**
  30 * Access to the OS read() system call with non-blocking access
  31 *
  32 * \param fd    File descriptor as returned by os_open()
  33 * \param buf   Buffer to place data
  34 * \param count Number of bytes to read
  35 * \return number of bytes read, or -1 on error
  36 */
  37ssize_t os_read_no_block(int fd, void *buf, size_t count);
  38
  39/**
  40 * Access to the OS write() system call
  41 *
  42 * \param fd    File descriptor as returned by os_open()
  43 * \param buf   Buffer containing data to write
  44 * \param count Number of bytes to write
  45 * \return number of bytes written, or -1 on error
  46 */
  47ssize_t os_write(int fd, const void *buf, size_t count);
  48
  49/**
  50 * Access to the OS lseek() system call
  51 *
  52 * \param fd    File descriptor as returned by os_open()
  53 * \param offset        File offset (based on whence)
  54 * \param whence        Position offset is relative to (see below)
  55 * \return new file offset
  56 */
  57off_t os_lseek(int fd, off_t offset, int whence);
  58
  59/* Defines for "whence" in os_lseek() */
  60#define OS_SEEK_SET     0
  61#define OS_SEEK_CUR     1
  62#define OS_SEEK_END     2
  63
  64/**
  65 * Access to the OS open() system call
  66 *
  67 * \param pathname      Pathname of file to open
  68 * \param flags         Flags, like OS_O_RDONLY, OS_O_RDWR
  69 * \return file descriptor, or -1 on error
  70 */
  71int os_open(const char *pathname, int flags);
  72
  73#define OS_O_RDONLY     0
  74#define OS_O_WRONLY     1
  75#define OS_O_RDWR       2
  76#define OS_O_MASK       3       /* Mask for read/write flags */
  77#define OS_O_CREAT      0100
  78
  79/**
  80 * Access to the OS close() system call
  81 *
  82 * \param fd    File descriptor to close
  83 * \return 0 on success, -1 on error
  84 */
  85int os_close(int fd);
  86
  87/**
  88 * Access to the OS unlink() system call
  89 *
  90 * \param pathname Path of file to delete
  91 * \return 0 for success, other for error
  92 */
  93int os_unlink(const char *pathname);
  94
  95/**
  96 * Access to the OS exit() system call
  97 *
  98 * This exits with the supplied return code, which should be 0 to indicate
  99 * success.
 100 *
 101 * @param exit_code     exit code for U-Boot
 102 */
 103void os_exit(int exit_code) __attribute__((noreturn));
 104
 105/**
 106 * Put tty into raw mode to mimic serial console better
 107 *
 108 * @param fd            File descriptor of stdin (normally 0)
 109 * @param allow_sigs    Allow Ctrl-C, Ctrl-Z to generate signals rather than
 110 *                      be handled by U-Boot
 111 */
 112void os_tty_raw(int fd, bool allow_sigs);
 113
 114/**
 115 * Restore the tty to its original mode
 116 *
 117 * Call this to restore the original terminal mode, after it has been changed
 118 * by os_tty_raw(). This is an internal function.
 119 */
 120void os_fd_restore(void);
 121
 122/**
 123 * Acquires some memory from the underlying os.
 124 *
 125 * \param length        Number of bytes to be allocated
 126 * \return Pointer to length bytes or NULL on error
 127 */
 128void *os_malloc(size_t length);
 129
 130/**
 131 * Free memory previous allocated with os_malloc()/os_realloc()
 132 *
 133 * This returns the memory to the OS.
 134 *
 135 * \param ptr           Pointer to memory block to free
 136 */
 137void os_free(void *ptr);
 138
 139/**
 140 * Reallocate previously-allocated memory to increase/decrease space
 141 *
 142 * This works in a similar way to the C library realloc() function. If
 143 * length is 0, then ptr is freed. Otherwise the space used by ptr is
 144 * expanded or reduced depending on whether length is larger or smaller
 145 * than before.
 146 *
 147 * If ptr is NULL, then this is similar to calling os_malloc().
 148 *
 149 * This function may need to move the memory block to make room for any
 150 * extra space, in which case the new pointer is returned.
 151 *
 152 * \param ptr           Pointer to memory block to reallocate
 153 * \param length        New length for memory block
 154 * \return pointer to new memory block, or NULL on failure or if length
 155 *      is 0.
 156 */
 157void *os_realloc(void *ptr, size_t length);
 158
 159/**
 160 * Access to the usleep function of the os
 161 *
 162 * \param usec Time to sleep in micro seconds
 163 */
 164void os_usleep(unsigned long usec);
 165
 166/**
 167 * Gets a monotonic increasing number of nano seconds from the OS
 168 *
 169 * \return A monotonic increasing time scaled in nano seconds
 170 */
 171uint64_t os_get_nsec(void);
 172
 173/**
 174 * Parse arguments and update sandbox state.
 175 *
 176 * @param state         Sandbox state to update
 177 * @param argc          Argument count
 178 * @param argv          Argument vector
 179 * @return 0 if ok, and program should continue;
 180 *      1 if ok, but program should stop;
 181 *      -1 on error: program should terminate.
 182 */
 183int os_parse_args(struct sandbox_state *state, int argc, char *argv[]);
 184
 185/*
 186 * Types of directory entry that we support. See also os_dirent_typename in
 187 * the C file.
 188 */
 189enum os_dirent_t {
 190        OS_FILET_REG,           /* Regular file */
 191        OS_FILET_LNK,           /* Symbolic link */
 192        OS_FILET_DIR,           /* Directory */
 193        OS_FILET_UNKNOWN,       /* Something else */
 194
 195        OS_FILET_COUNT,
 196};
 197
 198/** A directory entry node, containing information about a single dirent */
 199struct os_dirent_node {
 200        struct os_dirent_node *next;    /* Pointer to next node, or NULL */
 201        ulong size;                     /* Size of file in bytes */
 202        enum os_dirent_t type;          /* Type of entry */
 203        char name[0];                   /* Name of entry */
 204};
 205
 206/**
 207 * Get a directionry listing
 208 *
 209 * This allocates and returns a linked list containing the directory listing.
 210 *
 211 * @param dirname       Directory to examine
 212 * @param headp         Returns pointer to head of linked list, or NULL if none
 213 * @return 0 if ok, -ve on error
 214 */
 215int os_dirent_ls(const char *dirname, struct os_dirent_node **headp);
 216
 217/**
 218 * Get the name of a directory entry type
 219 *
 220 * @param type          Type to cehck
 221 * @return string containing the name of that type, or "???" if none/invalid
 222 */
 223const char *os_dirent_get_typename(enum os_dirent_t type);
 224
 225/**
 226 * Get the size of a file
 227 *
 228 * @param fname         Filename to check
 229 * @param size          size of file is returned if no error
 230 * @return 0 on success or -1 if an error ocurred
 231 */
 232int os_get_filesize(const char *fname, loff_t *size);
 233
 234/**
 235 * Write a character to the controlling OS terminal
 236 *
 237 * This bypasses the U-Boot console support and writes directly to the OS
 238 * stdout file descriptor.
 239 *
 240 * @param ch    Character to write
 241 */
 242void os_putc(int ch);
 243
 244/**
 245 * Write a string to the controlling OS terminal
 246 *
 247 * This bypasses the U-Boot console support and writes directly to the OS
 248 * stdout file descriptor.
 249 *
 250 * @param str   String to write (note that \n is not appended)
 251 */
 252void os_puts(const char *str);
 253
 254/**
 255 * Write the sandbox RAM buffer to a existing file
 256 *
 257 * @param fname         Filename to write memory to (simple binary format)
 258 * @return 0 if OK, -ve on error
 259 */
 260int os_write_ram_buf(const char *fname);
 261
 262/**
 263 * Read the sandbox RAM buffer from an existing file
 264 *
 265 * @param fname         Filename containing memory (simple binary format)
 266 * @return 0 if OK, -ve on error
 267 */
 268int os_read_ram_buf(const char *fname);
 269
 270/**
 271 * Jump to a new executable image
 272 *
 273 * This uses exec() to run a new executable image, after putting it in a
 274 * temporary file. The same arguments and environment are passed to this
 275 * new image, with the addition of:
 276 *
 277 *      -j <filename>   Specifies the filename the image was written to. The
 278 *                      calling image may want to delete this at some point.
 279 *      -m <filename>   Specifies the file containing the sandbox memory
 280 *                      (ram_buf) from this image, so that the new image can
 281 *                      have access to this. It also means that the original
 282 *                      memory filename passed to U-Boot will be left intact.
 283 *
 284 * @param dest          Buffer containing executable image
 285 * @param size          Size of buffer
 286 */
 287int os_jump_to_image(const void *dest, int size);
 288
 289/**
 290 * Read the current system time
 291 *
 292 * This reads the current Local Time and places it into the provided
 293 * structure.
 294 *
 295 * @param rt            Place to put system time
 296 */
 297void os_localtime(struct rtc_time *rt);
 298
 299#endif
 300