Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / clients / net-snk / kernel / systemcall.c
1 /******************************************************************************
2  * Copyright (c) 2004, 2008 IBM Corporation
3  * All rights reserved.
4  * This program and the accompanying materials
5  * are made available under the terms of the BSD License
6  * which accompanies this distribution, and is available at
7  * http://www.opensource.org/licenses/bsd-license.php
8  *
9  * Contributors:
10  *     IBM Corporation - initial implementation
11  *****************************************************************************/
12
13 #include <stdint.h>
14 #include <stdarg.h>
15 #include <string.h>
16 #include <fileio.h>
17 #include <kernel.h>
18 #include <of.h>
19 #include <sys/socket.h>
20
21 extern int vsprintf(char *, const char *, va_list);
22 extern void _exit(int status);
23
24 void exit(int status);
25
26 int open(const char* name, int flags)
27 {
28         int fd;
29
30         /* search free file descriptor */
31         for (fd=0; fd<FILEIO_MAX; ++fd) {
32                 if(fd_array[fd].type == FILEIO_TYPE_EMPTY) {
33                         break;
34                 }
35         }
36         if (fd == FILEIO_MAX) {
37                 printf("Can not open \"%s\" because file descriptor list is full\n", name);
38                 /* there is no free file descriptor available */
39                 return -2;
40         }
41
42         fd_array[fd].ih = of_open(name);
43         if (fd_array[fd].ih == 0)
44                 return -1;
45
46         fd_array[fd].type = FILEIO_TYPE_FILE;
47
48         return fd;
49 }
50
51 int pre_open_ih(int fd, ihandle_t ih)
52 {
53         if (fd_array[fd].type != FILEIO_TYPE_EMPTY)
54                 return -2;
55         fd_array[fd].ih = ih;
56         fd_array[fd].type = FILEIO_TYPE_FILE;
57
58         return fd;
59 }
60
61 int socket(int domain, int type, int proto, char *mac_addr)
62 {
63         uint8_t tmpbuf[8];
64         int fd;
65         phandle_t ph;
66
67         /* search free file descriptor */
68         for (fd=0; fd<FILEIO_MAX; ++fd) {
69                 if(fd_array[fd].type == FILEIO_TYPE_EMPTY) {
70                         break;
71                 }
72         }
73         if (fd == FILEIO_MAX) {
74                 printf("Can not open socket, file descriptor list is full\n");
75                 /* there is no free file descriptor available */
76                 return -2;
77         }
78
79         fd_array[fd].ih = of_interpret_1("my-parent", tmpbuf);
80         if (fd_array[fd].ih == 0) {
81                 printf("Can not open socket, no parent instance\n");
82                 return -1;
83         }
84         ph = of_instance_to_package(fd_array[fd].ih);
85         if (ph == -1) {
86                 printf("Can not open socket, no parent package\n");
87                 return -1;
88         }
89         if (of_get_mac(ph, mac_addr) < 0) {
90                 printf("Can not open socket, no MAC address\n");
91                 return -1;
92         }
93         fd_array[fd].type = FILEIO_TYPE_SOCKET;
94
95         return fd;
96 }
97
98 int close(int fd)
99 {
100         if (fd < 0 || fd >= FILEIO_MAX ||
101             fd_array[fd].type == FILEIO_TYPE_EMPTY)
102                 return -1;
103         if (fd_array[fd].type == FILEIO_TYPE_FILE)
104                 of_close(fd_array[fd].ih);
105         fd_array[fd].type = FILEIO_TYPE_EMPTY;
106         return 0;
107 }
108
109 ssize_t read(int fd, void *buf, size_t len)
110 {
111         if (fd < 0 || fd >= FILEIO_MAX ||
112             fd_array[fd].type == FILEIO_TYPE_EMPTY)
113                 return -1;
114
115         return of_read(fd_array[fd].ih, buf, len);
116 }
117
118 ssize_t write (int fd, const void *buf, size_t len)
119 {
120         char dest_buf[512];
121         char *dest_buf_ptr;
122         const char *dbuf = buf;
123         int i;
124
125         if (fd == 1 || fd == 2) {
126                 dest_buf_ptr = &dest_buf[0];
127                 for (i = 0; i < len && i < 256; i++)
128                         {
129                                 *dest_buf_ptr++ = *dbuf++;
130                                 if (dbuf[-1] == '\n')
131                                         *dest_buf_ptr++ = '\r';
132                         }
133                 len = dest_buf_ptr - &dest_buf[0];
134                 buf = &dest_buf[0];
135         }
136
137         if(fd < 0 || fd >= FILEIO_MAX ||
138            fd_array[fd].type == FILEIO_TYPE_EMPTY)
139                 return -1;
140
141         return of_write(fd_array[fd].ih, (void *)buf, len);
142 }
143
144 ssize_t lseek (int fd, long offset, int whence)
145 {
146         return 0; // this syscall is unused !!!
147 #if 0
148     if (whence != 0)
149         return -1;
150
151     of_seek (fd_array[fd], (unsigned int) (offset>>32), (unsigned int) (offset & 0xffffffffULL));
152
153     return offset;
154 #endif
155 }
156
157 int recv(int fd, void *packet, int packet_len, int flags)
158 {
159         return read(fd, packet, packet_len);
160 }
161
162 int send(int fd, const void *packet, int packet_len, int flags)
163 {
164         return write(fd, packet, packet_len);
165 }
166
167 int sendto(int fd, const void *packet, int packet_len, int flags,
168            const void *sock_addr, int sock_addr_len)
169 {
170         return send(fd, packet, packet_len, flags);
171 }
172
173 void exit(int status)
174 {
175         _exit(status);
176 }