OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [cygmon/] [v2_0/] [misc/] [bsp/] [common/] [syscall.c] - Blame information for rev 361

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 unneback
//==========================================================================
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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.