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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [vapi/] [vapi.c] - Blame information for rev 1782

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

Line No. Rev Author Line
1 293 markom
/* vapi.c -- Verification API Interface
2
   Copyright (C) 2001, Marko Mlinar, markom@opencores.org
3
 
4
This file is part of OpenRISC 1000 Architectural Simulator.
5
 
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
 
20 336 markom
#include "config.h"
21 293 markom
 
22
#include <stdio.h>
23
#include <ctype.h>
24
#include <string.h>
25
#include <stdlib.h>
26
#include <unistd.h>
27
#include <stdarg.h>
28
#include <signal.h>
29
#include <errno.h>
30
 
31
/* Added by CZ 24/05/01 */
32
#include <sys/stat.h>
33
#include <sys/types.h>
34
#include <sys/socket.h>
35
#include <netinet/in.h>
36
#include <sys/select.h>
37
#include <sys/poll.h>
38
#include <fcntl.h>
39
#include <netdb.h>
40
#include <netinet/tcp.h>
41
 
42 1358 nogj
#include "config.h"
43
 
44
#ifdef HAVE_INTTYPES_H
45
#include <inttypes.h>
46
#endif
47
 
48
#include "port.h"
49
#include "arch.h"
50 336 markom
#include "sim-config.h"
51 439 erez
#include "vapi.h"
52 1308 phoenix
#include "debug.h"
53 293 markom
 
54 304 markom
static unsigned int serverIP = 0;
55 293 markom
 
56 304 markom
static unsigned int server_fd = 0;
57
static unsigned int nhandlers = 0;
58
 
59 293 markom
static int tcp_level = 0;
60
 
61 304 markom
static struct vapi_handler {
62
  int fd;
63 477 erez
  unsigned long base_id, num_ids;
64 1366 nogj
  void (*read_func)(unsigned long, unsigned long, void *);
65
  void *priv_dat;
66 293 markom
  struct vapi_handler *next;
67 304 markom
  int temp;
68 442 erez
} *vapi_handler = NULL;
69 293 markom
 
70 304 markom
/* Structure for polling, it is cached, that it doesn't have to be rebuilt each time */
71
static struct pollfd *fds = NULL;
72
static int nfds = 0;
73
 
74
/* Rebuilds the fds structures; see fds.  */
75
void rebuild_fds () {
76
  struct vapi_handler *t;
77
  if (fds)
78
    free (fds);
79
  fds = (struct pollfd *) malloc (sizeof (struct pollfd) * (nhandlers + 1));
80
  if (!fds) {
81
    fprintf (stderr, "FATAL: Out of memory.\n");
82
    exit (1);
83
  }
84
 
85
  nfds = 0;
86
  fds[nfds].fd = server_fd;
87
  fds[nfds].events = POLLIN;
88
  fds[nfds++].revents = 0;
89
 
90
  for (t = vapi_handler; t; t = t->next) {
91
    if (t->fd) {
92
      t->temp = nfds;
93
      fds[nfds].fd = t->fd;
94
      fds[nfds].events = POLLIN;
95
      fds[nfds++].revents = 0;
96
    } else
97
      t->temp = -1;
98
  }
99
}
100
 
101 477 erez
/* Determines whether a certain handler handles an ID */
102
static inline int handler_fits_id( const struct vapi_handler *t, unsigned long id ) {
103
  return ((id >= t->base_id) && (id < t->base_id + t->num_ids));
104
}
105
 
106 304 markom
/* Finds a handler with given ID, return it, NULL if not found.  */
107
static struct vapi_handler *find_handler (unsigned long id) {
108
  struct vapi_handler *t = vapi_handler;
109 477 erez
  while (t && !handler_fits_id (t, id))
110 304 markom
    t = t->next;
111
  return t;
112
}
113
 
114
/* Adds a handler with given id and returns it.  */
115 477 erez
static struct vapi_handler *add_handler (unsigned long base_id, unsigned long num_ids) {
116 304 markom
  struct vapi_handler **t = &vapi_handler;
117
  struct vapi_handler *tt;
118
  while ((*t))
119
    t = &(*t)->next;
120
  tt = (struct vapi_handler *)malloc (sizeof (struct vapi_handler));
121
  tt->next = NULL;
122 477 erez
  tt->base_id = base_id;
123
  tt->num_ids = num_ids;
124 304 markom
  tt->read_func = NULL;
125 1366 nogj
  tt->priv_dat = NULL;
126 304 markom
  tt->fd = 0;
127
  (*t) = tt;
128
  free (fds);
129
  fds = NULL;
130
  nhandlers++;
131
  rebuild_fds ();
132
  return tt;
133
}
134
 
135 439 erez
void vapi_write_log_file(VAPI_COMMAND command, unsigned long devid, unsigned long data)
136 419 erez
{
137 439 erez
  if (!runtime.vapi.vapi_file)
138
    return;
139 477 erez
  if (!config.vapi.hide_device_id && devid <= VAPI_MAX_DEVID)
140 1308 phoenix
    fprintf (runtime.vapi.vapi_file, "%04lx", devid);
141
  fprintf (runtime.vapi.vapi_file, "%1x%08lx\n", command, data);
142 419 erez
}
143
 
144 304 markom
static int vapi_write_stream(int fd, void* buf, int len)
145
{
146
  int n;
147
  char* w_buf = (char*)buf;
148
  struct pollfd block;
149
 
150
  while(len) {
151
    if((n = write(fd, w_buf, len)) < 0) {
152
      switch(errno) {
153
      case EWOULDBLOCK: /* or EAGAIN */
154
        /* We've been called on a descriptor marked
155
           for nonblocking I/O. We better simulate
156
           blocking behavior. */
157
        block.fd = fd;
158
        block.events = POLLOUT;
159
        block.revents = 0;
160
        poll(&block,1,-1);
161
        continue;
162
      case EINTR:
163
        continue;
164
      case EPIPE:
165
        close(fd);
166
        fd = 0;
167
        return -1;
168
      default:
169
        return -1;
170
      }
171
    } else {
172
      len -= n;
173
      w_buf += n;
174
    }
175
  }
176
  return 0;
177
}
178
 
179
static int vapi_read_stream(int fd, void* buf, int len)
180
{
181
  int n;
182
  char* r_buf = (char*)buf;
183
  struct pollfd block;
184
 
185
  while(len) {
186
    if((n = read(fd,r_buf,len)) < 0) {
187
      switch(errno) {
188
      case EWOULDBLOCK: /* or EAGAIN */
189
        /* We've been called on a descriptor marked
190
           for nonblocking I/O. We better simulate
191
           blocking behavior. */
192
        block.fd = fd;
193
        block.events = POLLIN;
194
        block.revents = 0;
195
        poll(&block,1,-1);
196
        continue;
197
      case EINTR:
198
        continue;
199
      default:
200
        return -1;
201
      }
202
    } else if(n == 0) {
203
      close(fd);
204
      fd = 0;
205
      return -1;
206
    } else {
207
      len -= n;
208
      r_buf += n;
209
    }
210
  }
211
  return 0;
212
}
213
 
214 293 markom
/* Added by CZ 24/05/01 */
215
int get_server_socket(const char* name,const char* proto,int port)
216
{
217
  struct servent *service;
218
  struct protoent *protocol;
219
  struct sockaddr_in sa;
220
  struct hostent *hp;
221
  int sockfd;
222
  char myname[256];
223
  int flags;
224
  char sTemp[256];
225
 
226
  /* First, get the protocol number of TCP */
227
  if(!(protocol = getprotobyname(proto))) {
228
    sprintf(sTemp,"Unable to load protocol \"%s\"",proto);
229
    perror(sTemp);
230
    return 0;
231
  }
232
  tcp_level = protocol->p_proto; /* Save for later */
233
 
234
  /* If we weren't passed a non standard port, get the port
235
     from the services directory. */
236
  if(!port) {
237 1308 phoenix
    if((service = getservbyname(name,protocol->p_name)))
238 293 markom
      port = ntohs(service->s_port);
239
  }
240 336 markom
 
241 293 markom
  /* Create the socket using the TCP protocol */
242
  if((sockfd = socket(PF_INET,SOCK_STREAM,protocol->p_proto)) < 0) {
243
    perror("Unable to create socket");
244
    return 0;
245
  }
246 336 markom
 
247 293 markom
  flags = 1;
248
  if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const char*)&flags,sizeof(int)) < 0) {
249
    sprintf(sTemp,"Can not set SO_REUSEADDR option on socket %d",sockfd);
250
    perror(sTemp);
251
    close(sockfd);
252
    return 0;
253
  }
254
 
255
  /* The server should also be non blocking. Get the current flags. */
256
  if(fcntl(sockfd,F_GETFL,&flags) < 0) {
257
    sprintf(sTemp,"Unable to get flags for socket %d",sockfd);
258
    perror(sTemp);
259
    close(sockfd);
260
    return 0;
261
  }
262
 
263
  /* Set the nonblocking flag */
264
  if(fcntl(sockfd,F_SETFL, flags | O_NONBLOCK) < 0) {
265
    sprintf(sTemp,"Unable to set flags for socket %d to value 0x%08x",
266
            sockfd,flags | O_NONBLOCK);
267
    perror(sTemp);
268
    close(sockfd);
269
    return 0;
270
  }
271
 
272
  /* Find out what our address is */
273
  memset(&sa,0,sizeof(struct sockaddr_in));
274
  gethostname(myname,sizeof(myname));
275
  if(!(hp = gethostbyname(myname))) {
276
    perror("Unable to read hostname");
277
    close(sockfd);
278
    return 0;
279
  }
280
 
281
  /* Bind our socket to the appropriate address */
282
  sa.sin_family = hp->h_addrtype;
283
  sa.sin_port = htons(port);
284
  if(bind(sockfd,(struct sockaddr*)&sa,sizeof(struct sockaddr_in)) < 0) {
285
    sprintf(sTemp,"Unable to bind socket %d to port %d",sockfd,port);
286
    perror(sTemp);
287
    close(sockfd);
288
    return 0;
289
  }
290
  serverIP = sa.sin_addr.s_addr;
291
  flags = sizeof(struct sockaddr_in);
292
  if(getsockname(sockfd,(struct sockaddr*)&sa,&flags) < 0) {
293
    sprintf(sTemp,"Unable to get socket information for socket %d",sockfd);
294
    perror(sTemp);
295
    close(sockfd);
296
    return 0;
297
  }
298 551 markom
  runtime.vapi.server_port = ntohs(sa.sin_port);
299 293 markom
 
300
  /* Set the backlog to 1 connections */
301
  if(listen(sockfd,1) < 0) {
302
    sprintf(sTemp,"Unable to set backlog on socket %d to %d",sockfd,1);
303
    perror(sTemp);
304
    close(sockfd);
305
    return 0;
306
  }
307
 
308
  return sockfd;
309
}
310
 
311 442 erez
static void server_request()
312 293 markom
{
313
  struct sockaddr_in sa;
314
  struct sockaddr* addr = (struct sockaddr*)&sa;
315
  int n = sizeof(struct sockaddr_in);
316 336 markom
  int fd = accept(server_fd, addr, &n);
317 293 markom
  int on_off = 0; /* Turn off Nagel's algorithm on the socket */
318
  int flags;
319
  char sTemp[256];
320
 
321
  if(fd < 0) {
322
    /* This is valid, because a connection could have started,
323
       and then terminated due to a protocol error or user
324
       initiation before the accept could take place. */
325
    if(errno != EWOULDBLOCK && errno != EAGAIN) {
326
      perror("accept");
327
      close(server_fd);
328
      server_fd = 0;
329 551 markom
      runtime.vapi.enabled = 0;
330 293 markom
      serverIP = 0;
331 336 markom
    }
332 293 markom
    return;
333
  }
334
 
335
  if(fcntl(fd,F_GETFL,&flags) < 0) {
336
    sprintf(sTemp,"Unable to get flags for vapi socket %d",fd);
337
    perror(sTemp);
338
    close(fd);
339
    return;
340
  }
341
 
342
  if(fcntl(fd,F_SETFL, flags | O_NONBLOCK) < 0) {
343
    sprintf(sTemp,"Unable to set flags for vapi socket %d to value 0x%08x",
344
            fd,flags | O_NONBLOCK);
345
    perror(sTemp);
346
    close(fd);
347
    return;
348
  }
349
 
350
  if(setsockopt(fd,tcp_level,TCP_NODELAY,&on_off,sizeof(int)) < 0) {
351
    sprintf(sTemp,"Unable to disable Nagel's algorithm for socket %d.\nsetsockopt",fd);
352
    perror(sTemp);
353
    close(fd);
354
    return;
355
  }
356 304 markom
 
357
  /* Install new handler */
358
  {
359
    unsigned long id;
360
    struct vapi_handler *t;
361
    if (vapi_read_stream (fd, &id, sizeof (id))) {
362
      perror ("Cannot get id");
363
      close (fd);
364
      return;
365 293 markom
    }
366 304 markom
    t = find_handler (id);
367 355 markom
    if (t) {
368 304 markom
      if (t->fd) {
369 1308 phoenix
        fprintf (stderr, "WARNING: Test with id %lx already connected. Ignoring.\n", id);
370 304 markom
        close (fd);
371
        return;
372 355 markom
      } else {
373
        t->fd = fd;
374
        rebuild_fds ();
375
      }
376
    } else {
377 1308 phoenix
      fprintf (stderr, "WARNING: Test with id %lx not registered. Ignoring.\n", id);
378 355 markom
      close(fd); /* kill the connection */
379
      return;
380 293 markom
    }
381 304 markom
    if(config.sim.verbose)
382 1308 phoenix
      PRINTF ("\nConnection with test (id %lx) established.\n", id);
383 293 markom
  }
384
}
385
 
386
static int write_packet (unsigned long id, unsigned long data) {
387 304 markom
  struct vapi_handler *t = find_handler (id);
388
  if (!t || !t->fd)
389
    return 1;
390 293 markom
  id = htonl (id);
391 304 markom
  if (vapi_write_stream(t->fd, &id, sizeof (id)) < 0)
392 293 markom
    return 1;
393
  data = htonl (data);
394 304 markom
  if (vapi_write_stream(t->fd, &data, sizeof (data)) < 0)
395 293 markom
    return 1;
396
  return 0;
397 442 erez
}
398 293 markom
 
399 442 erez
static int read_packet (int fd, unsigned long *id, unsigned long *data)
400
{
401 477 erez
  if (fd <= 0)
402 293 markom
    return 1;
403 477 erez
  if (vapi_read_stream(fd, id, sizeof(unsigned long)) < 0)
404 293 markom
    return 1;
405 442 erez
  *id = ntohl (*id);
406 477 erez
  if (vapi_read_stream(fd, data, sizeof(unsigned long)) < 0)
407 304 markom
    return 1;
408 442 erez
  *data = ntohl (*data);
409 293 markom
  return 0;
410 304 markom
}
411 293 markom
 
412 442 erez
static void vapi_request (struct vapi_handler *t)
413
{
414
  unsigned long id, data;
415
 
416
  if (read_packet(t->fd, &id, &data)) {
417 477 erez
    if (t->fd > 0) {
418 293 markom
      perror("vapi read");
419 304 markom
      close(t->fd);
420
      t->fd = 0;
421 361 markom
      rebuild_fds ();
422 293 markom
    }
423
    return;
424
  }
425
 
426 442 erez
  vapi_write_log_file (VAPI_COMMAND_REQUEST, id, data);
427 1350 nogj
  debug (4, "[%08lx, %08lx]\n", id, data);
428 442 erez
 
429
  /* This packet may be for another handler */
430 477 erez
  if (!handler_fits_id (t, id))
431 442 erez
    t = find_handler (id);
432
  if (!t || !t->read_func)
433 1308 phoenix
    fprintf (stderr, "WARNING: Received packet for undefined id %08lx, data %08lx\n", id, data);
434 293 markom
  else
435 1366 nogj
    t->read_func(id, data, t->priv_dat);
436 293 markom
}
437
 
438
void vapi_check ()
439
{
440 304 markom
  struct vapi_handler *t;
441 293 markom
 
442 304 markom
  if (!server_fd || !fds) {
443
    fprintf (stderr, "FATAL: Unable to maintain VAPI server.\n");
444
    exit (1);
445 293 markom
  }
446
 
447 361 markom
  debug(5, ".");
448 355 markom
 
449 304 markom
  /* Handle everything in queue. */
450 293 markom
  while(1) {
451 304 markom
    switch(poll(fds, nfds, 0)) {
452 293 markom
    case -1:
453
      if(errno == EINTR)
454
        continue;
455
      perror("poll");
456 304 markom
      if (server_fd)
457
        close(server_fd);
458 551 markom
      runtime.vapi.enabled = 0;
459 304 markom
      serverIP = 0;
460
      return;
461 293 markom
    case 0: /* Nothing interesting going on */
462
      return;
463
    default:
464 304 markom
      /* Handle the vapi ports first. */
465
      for (t = vapi_handler; t; t = t->next)
466
        if (t->temp >= 0 && fds[t->temp].revents)
467
          vapi_request (t);
468 293 markom
 
469 304 markom
      if(fds[0].revents) {
470 293 markom
        if(fds[0].revents & POLLIN)
471
          server_request();
472
        else { /* Error Occurred */
473 304 markom
          fprintf(stderr,"Received flags 0x%08x on server. Shutting down.\n", fds[0].revents);
474
          if (server_fd)
475
            close(server_fd);
476 293 markom
          server_fd = 0;
477 551 markom
          runtime.vapi.enabled = 0;
478 293 markom
          serverIP = 0;
479
        }
480
      }
481
      break;
482
    } /* End of switch statement */
483
  } /* End of while statement */
484
}
485
 
486 304 markom
/* Inits the VAPI, according to sim-config */
487
int vapi_init ()
488 293 markom
{
489 304 markom
  nhandlers = 0;
490
  vapi_handler = NULL;
491 551 markom
  if (!runtime.vapi.enabled)
492 304 markom
    return 0; /* Nothing to do */
493
 
494 551 markom
  runtime.vapi.server_port = config.vapi.server_port;
495
  if (!runtime.vapi.server_port) {
496 304 markom
    fprintf (stderr, "WARNING: server_port = 0, shutting down VAPI\n");
497 551 markom
    runtime.vapi.enabled = 0;
498 304 markom
    return 1;
499
  }
500 1308 phoenix
  if ((server_fd = get_server_socket("or1ksim", "tcp", runtime.vapi.server_port)))
501 997 markom
    PRINTF("VAPI Server started on port %d\n", runtime.vapi.server_port);
502 304 markom
  else {
503 293 markom
    perror ("Connection");
504 304 markom
    return 1;
505
  }
506
 
507
  rebuild_fds ();
508 355 markom
 
509 361 markom
  if ((runtime.vapi.vapi_file = fopen (config.vapi.vapi_fn, "wt+")) == NULL)
510 355 markom
    fprintf (stderr, "WARNING: cannot open VAPI log file\n");
511
 
512 304 markom
  return 0;
513
}
514
 
515
/* Closes the VAPI */
516
void vapi_done ()
517
{
518
  int i;
519
  struct vapi_handler *t = vapi_handler;
520 293 markom
 
521 304 markom
  for (i = 0; i < nfds; i++)
522
    if (fds[i].fd)
523 306 markom
      close (fds[i].fd);
524 304 markom
  server_fd = 0;
525 551 markom
  runtime.vapi.enabled = 0;
526 304 markom
  serverIP = 0;
527
  free (fds);
528
  fds = 0;
529 361 markom
  if (runtime.vapi.vapi_file) {
530
    /* Mark end of simulation */
531 442 erez
    vapi_write_log_file (VAPI_COMMAND_END, 0, 0);
532 361 markom
    fclose (runtime.vapi.vapi_file);
533
  }
534 355 markom
 
535 304 markom
  while (vapi_handler) {
536
    t = vapi_handler;
537
    vapi_handler = vapi_handler->next;
538
    free (t);
539
  }
540 293 markom
}
541
 
542 477 erez
/* Installs a vapi handler for one VAPI id */
543 1366 nogj
void vapi_install_handler (unsigned long id, void (*read_func) (unsigned long, unsigned long, void *), void *dat)
544 304 markom
{
545 1366 nogj
  vapi_install_multi_handler (id, 1, read_func, dat);
546 477 erez
}
547
 
548
/* Installs a vapi handler for many VAPI id */
549 1366 nogj
void vapi_install_multi_handler (unsigned long base_id, unsigned long num_ids, void (*read_func) (unsigned long, unsigned long, void *), void *dat)
550 477 erez
{
551 293 markom
  struct vapi_handler *tt;
552 355 markom
 
553 1350 nogj
  debug(4, "vapi_install_handler %08lx, %lu, %08p\n", base_id, num_ids, read_func);
554 304 markom
  if (read_func == NULL) {
555
    struct vapi_handler **t = &vapi_handler;
556 477 erez
    while ((*t) && !handler_fits_id (*t, base_id))
557 293 markom
      t = &(*t)->next;
558
    if (!t) {
559 1308 phoenix
      fprintf (stderr, "Cannot uninstall VAPI read handler from id %lx\n",
560
               base_id);
561 293 markom
      exit (1);
562
    }
563
    tt = *t;
564
    (*t) = (*t)->next;
565
    free (tt);
566 304 markom
    nhandlers--;
567 293 markom
  } else {
568 477 erez
    tt = find_handler (base_id);
569 355 markom
    if (!tt) {
570 477 erez
      tt = add_handler (base_id, num_ids);
571 355 markom
      tt->read_func = read_func;
572 1366 nogj
      tt->priv_dat = dat;
573 355 markom
    } else {
574
      tt->read_func = read_func;
575 1366 nogj
      tt->priv_dat = dat;
576 355 markom
      rebuild_fds ();
577
    }
578 293 markom
  }
579
}
580
 
581 304 markom
/* Returns number of unconnected handles.  */
582 336 markom
int vapi_num_unconnected (int printout)
583 304 markom
{
584
  struct vapi_handler *t = vapi_handler;
585
  int numu = 0;
586 336 markom
  for (; t; t = t->next) {
587
    if (!t->fd) {
588
      numu++;
589 477 erez
      if (printout) {
590
        if ( t->num_ids == 1 )
591 1308 phoenix
          PRINTF (" 0x%lx", t->base_id);
592 477 erez
        else
593 1308 phoenix
          PRINTF (" 0x%lx..0x%lx", t->base_id, t->base_id + t->num_ids - 1);
594 477 erez
      }
595 336 markom
    }
596
  }
597 304 markom
  return numu;
598
}
599
 
600 305 markom
/* Sends a packet to specified test */
601
int vapi_send (unsigned long id, unsigned long data)
602
{
603 1350 nogj
  debug (4, "vapi_send [%08lx %08lx]\n", id, data);
604 442 erez
  vapi_write_log_file (VAPI_COMMAND_SEND, id, data);
605 305 markom
  write_packet (id, data);
606
}
607
 
608
/*
609 304 markom
int main ()
610
{
611 551 markom
  runtime.vapi.enabled = 1;
612 304 markom
  config.vapi.server_port = 9999;
613 293 markom
  vapi_init ();
614
  while (1) {
615
    vapi_check();
616 304 markom
    usleep(1);
617 293 markom
  }
618
  vapi_done ();
619 335 markom
}*/
620 1358 nogj
 
621
/*---------------------------------------------------[ VAPI configuration ]---*/
622
void vapi_enabled(union param_val val, void *dat)
623
{
624
  config.vapi.enabled = val.int_val;
625
}
626
 
627
void vapi_server_port(union param_val val, void *dat)
628
{
629
  config.vapi.server_port = val.int_val;
630
}
631
 
632
void vapi_log_enabled(union param_val val, void *dat)
633
{
634
  config.vapi.log_enabled = val.int_val;
635
}
636
 
637
void vapi_hide_device_id(union param_val val, void *dat)
638
{
639
  config.vapi.hide_device_id = val.int_val;
640
}
641
 
642
void vapi_log_fn(union param_val val, void *dat)
643
{
644
  strcpy(config.vapi.vapi_fn, val.str_val);
645
}
646
 
647
void reg_vapi_sec(void)
648
{
649
  struct config_section *sec = reg_config_sec("VAPI", NULL, NULL);
650
 
651
  reg_config_param(sec, "enabled", paramt_int, vapi_enabled);
652
  reg_config_param(sec, "server_port", paramt_int, vapi_server_port);
653
  reg_config_param(sec, "log_enabled", paramt_int, vapi_log_enabled);
654
  reg_config_param(sec, "hide_device_id", paramt_int, vapi_hide_device_id);
655
  reg_config_param(sec, "vapi_log_fn", paramt_str, vapi_log_fn);
656
}

powered by: WebSVN 2.1.0

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