]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/cygmon/v2_0/misc/bsp/common/syscall.c
Initial revision
[karo-tx-redboot.git] / packages / cygmon / v2_0 / misc / bsp / common / syscall.c
1 //==========================================================================
2 //
3 //      syscall.c
4 //
5 //      Minimal generic syscall support.
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //==========================================================================
41 //#####DESCRIPTIONBEGIN####
42 //
43 // Author(s):    
44 // Contributors: gthomas
45 // Date:         1999-10-20
46 // Purpose:      Minimal generic syscall support.
47 // Description:  
48 //               
49 //
50 //####DESCRIPTIONEND####
51 //
52 //=========================================================================
53
54 #include <errno.h>
55 #include <bsp/cpu.h>
56 #include <bsp/bsp.h>
57 #include "bsp_if.h"
58 #include "syscall.h"
59
60 /*
61  * read  -- read bytes from the serial port. Ignore fd, since
62  *          we only have stdin.
63  */
64 static int
65 sys_read(int fd, char *buf, int nbytes)
66 {
67     int i = 0;
68
69     for (i = 0; i < nbytes; i++) {
70         *(buf + i) = bsp_console_getc();
71         if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
72             (*(buf + i + 1)) = 0;
73             break;
74         }
75     }
76     return (i);
77 }
78
79
80 /*
81  * write -- write bytes to the serial port. Ignore fd, since
82  *          stdout and stderr are the same. Since we have no filesystem,
83  *          open will only return an error.
84  */
85 static int
86 sys_write(int fd, char *buf, int nbytes)
87 {
88 #define WBUFSIZE  256
89     char ch, lbuf[WBUFSIZE];
90     int  i, tosend;
91
92     tosend = nbytes;
93
94     while (tosend > 0) {
95         for (i = 0; tosend > 0 && i < (WBUFSIZE-2); tosend--) {
96             ch = *buf++;
97             if (ch == '\n')
98                 lbuf[i++] = '\r';
99             lbuf[i++] = ch;
100         }
101         bsp_console_write(lbuf, i);
102     }
103
104     return (nbytes);
105 }
106
107
108 /*
109  * open -- open a file descriptor. We don't have a filesystem, so
110  *         we return an error.
111  */
112 static int
113 sys_open (const char *buf, int flags, int mode)
114 {
115     return (-EIO);
116 }
117
118
119 /*
120  * close -- We don't need to do anything, but pretend we did.
121  */
122 static int
123 sys_close(int fd)
124 {
125     return (0);
126 }
127
128
129 /*
130  * lseek --  Since a serial port is non-seekable, we return an error.
131  */
132 static int
133 sys_lseek(int fd,  int offset, int whence)
134 {
135 #ifdef ESPIPE
136     return (-ESPIPE);
137 #else
138     return (-EIO);
139 #endif
140 }
141
142
143 /*
144  *  Generic syscall handler.
145  *
146  *  Returns 0 if syscall number is not handled by this
147  *  module, 1 otherwise. This allows applications to
148  *  extend the syscall handler by using exception chaining.
149  */
150 int
151 _bsp_do_syscall(int func,               /* syscall function number */
152                 long arg1, long arg2,   /* up to four args.        */
153                 long arg3, long arg4,
154                 int *retval)            /* syscall return value    */
155 {
156     int err = 0;
157
158     switch (func) {
159
160       case SYS_read:
161         err = sys_read((int)arg1, (char *)arg2, (int)arg3);
162         break;
163
164       case SYS_write:
165         err = sys_write((int)arg1, (char *)arg2, (int)arg3);
166         break;
167
168       case SYS_open:
169         err = sys_open((const char *)arg1, (int)arg2, (int)arg3);
170         break;
171
172       case SYS_close:
173         err = sys_close((int)arg1);
174         break;
175
176       case SYS_lseek:
177         err = sys_lseek((int)arg1, (int)arg2, (int)arg3);
178         break;
179
180       case BSP_GET_SHARED:
181         *(bsp_shared_t **)arg1 = bsp_shared_data;
182         break;
183
184       case SYS_meminfo:
185         {
186           // Return the top and size of memory.
187           struct bsp_mem_info      mem;
188           int                      i;
189           unsigned long            u, totmem, topmem, numbanks;
190
191           i = totmem = topmem = numbanks = 0;
192           while (bsp_sysinfo(BSP_INFO_MEMORY, i++, &mem) == 0)
193             {
194               if (mem.kind == BSP_MEM_RAM)
195                 {
196                   numbanks++;
197                   totmem += mem.nbytes;
198                   u = (unsigned long)mem.virt_start + mem.nbytes;
199                   if (u > topmem)
200                     topmem = u;
201                 }
202             }
203           *(unsigned long *)arg1 = totmem;
204           *(unsigned long *)arg2 = topmem;
205           *retval = numbanks;
206         }
207         return 1;
208         break;
209
210       default:
211         return 0;
212     }    
213
214     *retval = err;
215     return 1;
216 }
217
218