1 //==========================================================================
5 // Minimal generic syscall support.
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.
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.
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
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.
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.
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.
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####
44 // Contributors: gthomas
46 // Purpose: Minimal generic syscall support.
50 //####DESCRIPTIONEND####
52 //=========================================================================
61 * read -- read bytes from the serial port. Ignore fd, since
65 sys_read(int fd, char *buf, int nbytes)
69 for (i = 0; i < nbytes; i++) {
70 *(buf + i) = bsp_console_getc();
71 if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
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.
86 sys_write(int fd, char *buf, int nbytes)
89 char ch, lbuf[WBUFSIZE];
95 for (i = 0; tosend > 0 && i < (WBUFSIZE-2); tosend--) {
101 bsp_console_write(lbuf, i);
109 * open -- open a file descriptor. We don't have a filesystem, so
110 * we return an error.
113 sys_open (const char *buf, int flags, int mode)
120 * close -- We don't need to do anything, but pretend we did.
130 * lseek -- Since a serial port is non-seekable, we return an error.
133 sys_lseek(int fd, int offset, int whence)
144 * Generic syscall handler.
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.
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 */
161 err = sys_read((int)arg1, (char *)arg2, (int)arg3);
165 err = sys_write((int)arg1, (char *)arg2, (int)arg3);
169 err = sys_open((const char *)arg1, (int)arg2, (int)arg3);
173 err = sys_close((int)arg1);
177 err = sys_lseek((int)arg1, (int)arg2, (int)arg3);
181 *(bsp_shared_t **)arg1 = bsp_shared_data;
186 // Return the top and size of memory.
187 struct bsp_mem_info mem;
189 unsigned long u, totmem, topmem, numbanks;
191 i = totmem = topmem = numbanks = 0;
192 while (bsp_sysinfo(BSP_INFO_MEMORY, i++, &mem) == 0)
194 if (mem.kind == BSP_MEM_RAM)
197 totmem += mem.nbytes;
198 u = (unsigned long)mem.virt_start + mem.nbytes;
203 *(unsigned long *)arg1 = totmem;
204 *(unsigned long *)arg2 = topmem;