/*
 * hosted io support.
 *
 * Copyright (c) 2006 CodeSourcery Inc
 *
 * The authors hereby grant permission to use, copy, modify, distribute,
 * and license this software and its documentation for any purpose, provided
 * that existing copyright notices are retained in all copies and that this
 * notice is included verbatim in any distributions. No written agreement,
 * license, or royalty fee is required for any of the authorized uses.
 * Modifications to this software may be copyrighted by their authors
 * and need not follow the licensing terms described here, provided that
 * the new terms are clearly indicated on the first page of each file where
 * they apply.
 */

#include <stdint.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>

#define HOSTED_EXIT  0
#define HOSTED_INIT_SIM 1
#define HOSTED_OPEN 2
#define HOSTED_CLOSE 3
#define HOSTED_READ 4
#define HOSTED_WRITE 5
#define HOSTED_LSEEK 6
#define HOSTED_RENAME 7
#define HOSTED_UNLINK 8
#define HOSTED_STAT 9
#define HOSTED_FSTAT 10
#define HOSTED_GETTIMEOFDAY 11
#define HOSTED_ISATTY 12
#define HOSTED_SYSTEM 13

/* This function is provided by the board's BSP, because the precise
   mechanism of informing gdb is board specific.  */
extern int __io_hosted (int func, void *args);

/* Protocol specific representation of datatypes, as specified in D.9.11
 * of the GDB manual.
 * Note that since the m68k is big-endian, we can use native
 * representations of integer datatypes in structured datatypes. */

typedef uint32_t gdb_mode_t;
typedef uint32_t gdb_time_t;

struct gdb_stat {
  uint32_t    st_dev;     /* device */
  uint32_t    st_ino;     /* inode */
  gdb_mode_t  st_mode;    /* protection */
  uint32_t    st_nlink;   /* number of hard links */
  uint32_t    st_uid;     /* user ID of owner */
  uint32_t    st_gid;     /* group ID of owner */
  uint32_t    st_rdev;    /* device type (if inode device) */
  uint64_t    st_size;    /* total size, in bytes */
  uint64_t    st_blksize; /* blocksize for filesystem I/O */
  uint64_t    st_blocks;  /* number of blocks allocated */
  gdb_time_t  st_atime;   /* time of last access */
  gdb_time_t  st_mtime;   /* time of last modification */
  gdb_time_t  st_ctime;   /* time of last change */
};

struct gdb_timeval {
  gdb_time_t tv_sec;  /* second */
  uint64_t tv_usec;   /* microsecond */
};


/* Parameters are passed between the library and the debugging stub
 * in a fixed-size buffer.
 */

typedef uint32_t gdb_parambuf_t[4];

/* open flags */

#define GDB_O_RDONLY   0x0
#define GDB_O_WRONLY   0x1
#define GDB_O_RDWR     0x2
#define GDB_O_APPEND   0x8
#define GDB_O_CREAT  0x200
#define GDB_O_TRUNC  0x400
#define GDB_O_EXCL   0x800

/* mode_t values */

#define GDB_S_IFREG 0100000
#define GDB_S_IFDIR  040000
#define GDB_S_IRUSR    0400
#define GDB_S_IWUSR    0200
#define GDB_S_IXUSR    0100
#define GDB_S_IRGRP     040
#define GDB_S_IWGRP     020
#define GDB_S_IXGRP     010
#define GDB_S_IROTH      04
#define GDB_S_IWOTH      02
#define GDB_S_IXOTH      01

/* errno values */

#define GDB_EPERM         1
#define GDB_ENOENT        2
#define GDB_EINTR         4
#define GDB_EBADF         9
#define GDB_EACCES       13
#define GDB_EFAULT       14
#define GDB_EBUSY        16
#define GDB_EEXIST       17
#define GDB_ENODEV       19
#define GDB_ENOTDIR      20
#define GDB_EISDIR       21
#define GDB_EINVAL       22
#define GDB_ENFILE       23
#define GDB_EMFILE       24
#define GDB_EFBIG        27
#define GDB_ENOSPC       28
#define GDB_ESPIPE       29
#define GDB_EROFS        30
#define GDB_ENAMETOOLONG 91
#define GDB_EUNKNOWN     9999

/* lseek flags */

#define GDB_SEEK_SET 0
#define GDB_SEEK_CUR 1
#define GDB_SEEK_END 2


/* conversion functions */

extern gdb_mode_t __hosted_to_gdb_mode_t (mode_t m);
extern int32_t __hosted_to_gdb_open_flags (int f);
extern int32_t __hosted_to_gdb_lseek_flags (int f);

extern void __hosted_from_gdb_stat (const struct gdb_stat *gs,
				    struct stat *s);
extern void __hosted_from_gdb_timeval (const struct gdb_timeval *gt,
				       struct timeval *t);
extern int __hosted_from_gdb_errno (int32_t err);
