GDB (API)
/home/stan/gdb/src/include/gdb/callback.h
Go to the documentation of this file.
00001 /* Remote target system call callback support.
00002    Copyright 1997-2013 Free Software Foundation, Inc.
00003    Contributed by Cygnus Solutions.
00004 
00005    This file is part of GDB.
00006 
00007    This program is free software; you can redistribute it and/or modify
00008    it under the terms of the GNU General Public License as published by
00009    the Free Software Foundation; either version 3 of the License, or
00010    (at your option) any later version.
00011 
00012    This program is distributed in the hope that it will be useful,
00013    but WITHOUT ANY WARRANTY; without even the implied warranty of
00014    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015    GNU General Public License for more details.
00016 
00017    You should have received a copy of the GNU General Public License
00018    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
00019 
00020 /* This interface isn't intended to be specific to any particular kind
00021    of remote (hardware, simulator, whatever).  As such, support for it
00022    (e.g. sim/common/callback.c) should *not* live in the simulator source
00023    tree, nor should it live in the gdb source tree.  */
00024 
00025 /* There are various ways to handle system calls:
00026 
00027    1) Have a simulator intercept the appropriate trap instruction and
00028    directly perform the system call on behalf of the target program.
00029    This is the typical way of handling system calls for embedded targets.
00030    [Handling system calls for embedded targets isn't that much of an
00031    oxymoron as running compiler testsuites make use of the capability.]
00032 
00033    This method of system call handling is done when STATE_ENVIRONMENT
00034    is ENVIRONMENT_USER.
00035 
00036    2) Have a simulator emulate the hardware as much as possible.
00037    If the program running on the real hardware communicates with some sort
00038    of target manager, one would want to be able to run this program on the
00039    simulator as well.
00040 
00041    This method of system call handling is done when STATE_ENVIRONMENT
00042    is ENVIRONMENT_OPERATING.
00043 */
00044 
00045 #ifndef CALLBACK_H
00046 #define CALLBACK_H
00047 
00048 /* ??? The reason why we check for va_start here should be documented.  */
00049 
00050 #ifndef va_start
00051 #include <ansidecl.h>
00052 #include <stdarg.h>
00053 #endif
00054 /* Needed for enum bfd_endian.  */
00055 #include "bfd.h"
00056 
00057 /* Mapping of host/target values.  */
00058 /* ??? For debugging purposes, one might want to add a string of the
00059    name of the symbol.  */
00060 
00061 typedef struct {
00062   int host_val;
00063   int target_val;
00064 } CB_TARGET_DEFS_MAP;
00065 
00066 #define MAX_CALLBACK_FDS 10
00067 
00068 /* Forward decl for stat/fstat.  */
00069 struct stat;
00070 
00071 typedef struct host_callback_struct host_callback;
00072 
00073 struct host_callback_struct 
00074 {
00075   int (*close) (host_callback *,int);
00076   int (*get_errno) (host_callback *);
00077   int (*isatty) (host_callback *, int);
00078   int (*lseek) (host_callback *, int, long , int);
00079   int (*open) (host_callback *, const char*, int mode);
00080   int (*read) (host_callback *,int,  char *, int);
00081   int (*read_stdin) ( host_callback *, char *, int);
00082   int (*rename) (host_callback *, const char *, const char *);
00083   int (*system) (host_callback *, const char *);
00084   long (*time) (host_callback *, long *);
00085   int (*unlink) (host_callback *, const char *);
00086   int (*write) (host_callback *,int, const char *, int);
00087   int (*write_stdout) (host_callback *, const char *, int);
00088   void (*flush_stdout) (host_callback *);
00089   int (*write_stderr) (host_callback *, const char *, int);
00090   void (*flush_stderr) (host_callback *);
00091   int (*stat) (host_callback *, const char *, struct stat *);
00092   int (*fstat) (host_callback *, int, struct stat *);
00093   int (*lstat) (host_callback *, const char *, struct stat *);
00094   int (*ftruncate) (host_callback *, int, long);
00095   int (*truncate) (host_callback *, const char *, long);
00096   int (*pipe) (host_callback *, int *);
00097 
00098   /* Called by the framework when a read call has emptied a pipe buffer.  */
00099   void (*pipe_empty) (host_callback *, int read_fd, int write_fd);
00100 
00101   /* Called by the framework when a write call makes a pipe buffer
00102      non-empty.  */
00103   void (*pipe_nonempty) (host_callback *, int read_fd, int write_fd);
00104 
00105   /* When present, call to the client to give it the oportunity to
00106      poll any io devices for a request to quit (indicated by a nonzero
00107      return value). */
00108   int (*poll_quit) (host_callback *);
00109 
00110   /* Used when the target has gone away, so we can close open
00111      handles and free memory etc etc.  */
00112   int (*shutdown) (host_callback *);
00113   int (*init)     (host_callback *);
00114 
00115   /* depreciated, use vprintf_filtered - Talk to the user on a console.  */
00116   void (*printf_filtered) (host_callback *, const char *, ...);
00117 
00118   /* Talk to the user on a console.  */
00119   void (*vprintf_filtered) (host_callback *, const char *, va_list);
00120 
00121   /* Same as vprintf_filtered but to stderr.  */
00122   void (*evprintf_filtered) (host_callback *, const char *, va_list);
00123 
00124   /* Print an error message and "exit".
00125      In the case of gdb "exiting" means doing a longjmp back to the main
00126      command loop.  */
00127   void (*error) (host_callback *, const char *, ...)
00128 #ifdef __GNUC__
00129     __attribute__ ((__noreturn__))
00130 #endif
00131     ;
00132 
00133   int last_errno;               /* host format */
00134 
00135   int fdmap[MAX_CALLBACK_FDS];
00136   /* fd_buddy is used to contruct circular lists of target fds that point to
00137      the same host fd.  A uniquely mapped fd points to itself; for a closed
00138      one, fd_buddy has the value -1.  The host file descriptors for stdin /
00139      stdout / stderr are never closed by the simulators, so they are put
00140      in a special fd_buddy circular list which also has MAX_CALLBACK_FDS
00141      as a member.  */
00142   /* ??? We don't have a callback entry for dup, although it is trival to
00143      implement now.  */
00144   short fd_buddy[MAX_CALLBACK_FDS+1];
00145 
00146   /* 0 = none, >0 = reader (index of writer),
00147      <0 = writer (negative index of reader).
00148      If abs (ispipe[N]) == N, then N is an end of a pipe whose other
00149      end is closed.  */
00150   short ispipe[MAX_CALLBACK_FDS];
00151 
00152   /* A writer stores the buffer at its index.  Consecutive writes
00153      realloc the buffer and add to the size.  The reader indicates the
00154      read part in its .size, until it has consumed it all, at which
00155      point it deallocates the buffer and zeroes out both sizes.  */
00156   struct pipe_write_buffer
00157   {
00158     int size;
00159     char *buffer;
00160   } pipe_buffer[MAX_CALLBACK_FDS];
00161 
00162   /* System call numbers.  */
00163   CB_TARGET_DEFS_MAP *syscall_map;
00164   /* Errno values.  */
00165   CB_TARGET_DEFS_MAP *errno_map;
00166   /* Flags to the open system call.  */
00167   CB_TARGET_DEFS_MAP *open_map;
00168   /* Signal numbers.  */
00169   CB_TARGET_DEFS_MAP *signal_map;
00170   /* Layout of `stat' struct.
00171      The format is a series of "name,length" pairs separated by colons.
00172      Empty space is indicated with a `name' of "space".
00173      All padding must be explicitly mentioned.
00174      Lengths are in bytes.  If this needs to be extended to bits,
00175      use "name.bits".
00176      Example: "st_dev,4:st_ino,4:st_mode,4:..."  */
00177   const char *stat_map;
00178 
00179   enum bfd_endian target_endian;
00180 
00181   /* Size of an "int" on the target (for syscalls whose ABI uses "int").
00182      This must include padding, and only padding-at-higher-address is
00183      supported.  For example, a 64-bit target with 32-bit int:s which
00184      are padded to 64 bits when in an array, should supposedly set this
00185      to 8.  The default is 4 which matches ILP32 targets and 64-bit
00186      targets with 32-bit ints and no padding.  */
00187   int target_sizeof_int;
00188 
00189   /* Marker for those wanting to do sanity checks.
00190      This should remain the last member of this struct to help catch
00191      miscompilation errors. */
00192 #define HOST_CALLBACK_MAGIC 4705 /* teds constant */
00193   int magic;
00194 };
00195 
00196 extern host_callback default_callback;
00197 
00198 /* Canonical versions of system call numbers.
00199    It's not intended to willy-nilly throw every system call ever heard
00200    of in here.  Only include those that have an important use.
00201    ??? One can certainly start a discussion over the ones that are currently
00202    here, but that will always be true.  */
00203 
00204 /* These are used by the ANSI C support of libc.  */
00205 #define CB_SYS_exit     1
00206 #define CB_SYS_open     2
00207 #define CB_SYS_close    3
00208 #define CB_SYS_read     4
00209 #define CB_SYS_write    5
00210 #define CB_SYS_lseek    6
00211 #define CB_SYS_unlink   7
00212 #define CB_SYS_getpid   8
00213 #define CB_SYS_kill     9
00214 #define CB_SYS_fstat    10
00215 /*#define CB_SYS_sbrk   11 - not currently a system call, but reserved.  */
00216 
00217 /* ARGV support.  */
00218 #define CB_SYS_argvlen  12
00219 #define CB_SYS_argv     13
00220 
00221 /* These are extras added for one reason or another.  */
00222 #define CB_SYS_chdir    14
00223 #define CB_SYS_stat     15
00224 #define CB_SYS_chmod    16
00225 #define CB_SYS_utime    17
00226 #define CB_SYS_time     18
00227 
00228 /* More standard syscalls.  */
00229 #define CB_SYS_lstat    19
00230 #define CB_SYS_rename   20
00231 #define CB_SYS_truncate 21
00232 #define CB_SYS_ftruncate 22
00233 #define CB_SYS_pipe     23
00234 
00235 /* New ARGV support.  */
00236 #define CB_SYS_argc     24
00237 #define CB_SYS_argnlen  25
00238 #define CB_SYS_argn     26
00239 
00240 /* Struct use to pass and return information necessary to perform a
00241    system call.  */
00242 /* FIXME: Need to consider target word size.  */
00243 
00244 typedef struct cb_syscall {
00245   /* The target's value of what system call to perform.  */
00246   int func;
00247   /* The arguments to the syscall.  */
00248   long arg1, arg2, arg3, arg4;
00249 
00250   /* The result.  */
00251   long result;
00252   /* Some system calls have two results.  */
00253   long result2;
00254   /* The target's errno value, or 0 if success.
00255      This is converted to the target's value with host_to_target_errno.  */
00256   int errcode;
00257 
00258   /* Working space to be used by memory read/write callbacks.  */
00259   PTR p1;
00260   PTR p2;
00261   long x1,x2;
00262 
00263   /* Callbacks for reading/writing memory (e.g. for read/write syscalls).
00264      ??? long or unsigned long might be better to use for the `count'
00265      argument here.  We mimic sim_{read,write} for now.  Be careful to
00266      test any changes with -Wall -Werror, mixed signed comparisons
00267      will get you.  */
00268   int (*read_mem) (host_callback * /*cb*/, struct cb_syscall * /*sc*/,
00269                    unsigned long /*taddr*/, char * /*buf*/,
00270                    int /*bytes*/);
00271   int (*write_mem) (host_callback * /*cb*/, struct cb_syscall * /*sc*/,
00272                     unsigned long /*taddr*/, const char * /*buf*/,
00273                     int /*bytes*/);
00274 
00275   /* For sanity checking, should be last entry.  */
00276   int magic;
00277 } CB_SYSCALL;
00278 
00279 /* Magic number sanity checker.  */
00280 #define CB_SYSCALL_MAGIC 0x12344321
00281 
00282 /* Macro to initialize CB_SYSCALL.  Called first, before filling in
00283    any fields.  */
00284 #define CB_SYSCALL_INIT(sc) \
00285 do { \
00286   memset ((sc), 0, sizeof (*(sc))); \
00287   (sc)->magic = CB_SYSCALL_MAGIC; \
00288 } while (0)
00289 
00290 /* Return codes for various interface routines.  */
00291 
00292 typedef enum {
00293   CB_RC_OK = 0,
00294   /* generic error */
00295   CB_RC_ERR,
00296   /* either file not found or no read access */
00297   CB_RC_ACCESS,
00298   CB_RC_NO_MEM
00299 } CB_RC;
00300 
00301 /* Read in target values for system call numbers, errno values, signals.  */
00302 CB_RC cb_read_target_syscall_maps (host_callback *, const char *);
00303 
00304 /* Translate target to host syscall function numbers.  */
00305 int cb_target_to_host_syscall (host_callback *, int);
00306 
00307 /* Translate host to target errno value.  */
00308 int cb_host_to_target_errno (host_callback *, int);
00309 
00310 /* Translate target to host open flags.  */
00311 int cb_target_to_host_open (host_callback *, int);
00312 
00313 /* Translate target signal number to host.  */
00314 int cb_target_to_host_signal (host_callback *, int);
00315 
00316 /* Translate host signal number to target.  */
00317 int cb_host_to_gdb_signal (host_callback *, int);
00318 
00319 /* Translate host stat struct to target.
00320    If stat struct ptr is NULL, just compute target stat struct size.
00321    Result is size of target stat struct or 0 if error.  */
00322 int cb_host_to_target_stat (host_callback *, const struct stat *, PTR);
00323 
00324 /* Translate a value to target endian.  */
00325 void cb_store_target_endian (host_callback *, char *, int, long);
00326 
00327 /* Tests for special fds.  */
00328 int cb_is_stdin (host_callback *, int);
00329 int cb_is_stdout (host_callback *, int);
00330 int cb_is_stderr (host_callback *, int);
00331 
00332 /* Read a string out of the target.  */
00333 int cb_get_string (host_callback *, CB_SYSCALL *, char *, int, unsigned long);
00334 
00335 /* Perform a system call.  */
00336 CB_RC cb_syscall (host_callback *, CB_SYSCALL *);
00337 
00338 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines