xref: /netbsd-src/external/gpl3/gdb/dist/sim/cris/dv-rv.c (revision 05d8e8fe083a4bc28647839371f28bad98396c12)
1 /* The remote-virtual-component simulator framework
2    for GDB, the GNU Debugger.
3 
4    Copyright 2006-2024 Free Software Foundation, Inc.
5 
6    This file is part of GDB.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20 
21 /* This must come before any other includes.  */
22 #include "defs.h"
23 
24 #include "sim-main.h"
25 #include "hw-main.h"
26 
27 #include "hw-tree.h"
28 
29 #include <ctype.h>
30 #include <errno.h>
31 #include <string.h>
32 #include <unistd.h>
33 #include <stdlib.h>
34 #ifdef HAVE_SYS_TYPES_H
35 #include <sys/types.h>
36 #endif
37 
38 #include <sys/time.h>
39 
40 #include <sys/select.h>
41 
42 /* Not guarded in dv-sockser.c, so why here.  */
43 #include <netinet/in.h>
44 #include <arpa/inet.h>
45 #include <netdb.h>
46 #include <sys/socket.h>
47 
48 
49 /* DEVICE
50 
51 
52    rv - Remote Virtual component
53 
54 
55    DESCRIPTION
56 
57 
58    Socket connection to a remote simulator component, for example one
59    for testing a verilog construction.  Protocol defined below.
60 
61    There is a set of 32-bit I/O ports, with a mapping from local to
62    remote addresses.  There is a set of interrupts expressed as a
63    bit-mask, with a mapping from remote to local.  There is a set of
64    memory ranges (actual memory defined elsewhere), also with a
65    mapping from remote to local addresses, that is expected to be
66    accessible to the remote simulator in 32-byte chunks (simulating
67    DMA).  There is a mapping from remote cycles (or an appropriate
68    elsewhere defined time-slice) to local cycles.
69 
70    PROPERTIES
71 
72    reg = <address> <size>
73    The address (within the parent bus) that this device is to
74    be located.
75 
76    remote-reg = <remote-address>
77    The address of reg on the remote side.  Defaults to 0.
78 
79    mem = <address> <size>
80    Specify an address-range (within the parent bus) that the remote
81    device can access.  The memory is assumed to be already defined.
82    If there's no memory defined but the remote side asks for a memory
83    access, the simulation is aborted.
84 
85    remote-mem = <remote-address>
86    The address of mem on the remote side.  Defaults to 0.
87 
88    mbox = <address>
89    Address of the mailbox interface.  Writes to this address with the
90    local address of a mailbox command, a complete packet with length
91    and command; (4 or 6)) invokes the mailbox interface.  Reads are
92    invalid.  Replies are written to the same address.  Address space
93    from <address> up-to-and-including <address>+3 is allocated.
94 
95    max-poll-ticks = <local-count>
96    Sets the maximum interval between polling the external component,
97    expressed in internal cycles.  Defaults to 10000.
98 
99    watchdog-interval = <seconds>
100    Sets the wallclock seconds between watchdog packets sent to the
101    remote side (may be larger if there's no rv activity in that time).
102    Defaults to 30.  If set to 0, no watchdog packets are sent.
103 
104    intnum = <local-int-0> <local-int-1> ... <local-int-31>
105    Defines a map from remote bit numbers to local values to be emitted
106    on the "int" port, with the external bit number as the ordinal - 1
107    of the local translation.  E.g. 43 121 would mean map external
108    (1<<0) to internal 43 and external (1<<1) to internal 121.  The
109    default is unity; no translation.  If more than one bit is set in
110    the remote interrupt word, the intmultiple property can be used to
111    control the translation.
112 
113    intmultiple = <intvalue>
114    When more than one bit is set in the remote interrupt word, you may
115    want to map this situation to a separate interrupt value.  If this
116    property is non-zero, it is used as that value.  If it is zero, the
117    local value for the "int" port is the bitwise-or of the translated
118    local values.
119 
120    host = <hostid>
121    The hostname or address where the simulator to be used listens.
122    Defaults to "127.0.0.1"
123 
124    port = <portnumber>
125    The hostname or address where the simulator to be used listens.
126    Defaults to 10000.
127 
128    dummy = <value>
129     or
130    dummy = <filename>
131    Don't connect to a remote side; use initial dummy contents from
132    <filename> (which has to be at least as big as the <size> argument
133    of reg above) or filled with byte-value <value>.  Mailboxes are not
134    supported (can be defined but can not be used) and remote-memory
135    accesses don't apply.  The main purpose for this property is to
136    simplify use of configuration and simulated hardware that is
137    e.g. only trivially initialized but not actually used.
138 
139 
140    PORTS
141 
142    int (output)
143    Driven as a result of a remote interrupt request.  The value is a
144    32-bit bitset of active interrupts.
145 
146 
147    BUGS
148 
149    All and none.
150 
151 
152    PROTOCOL
153 
154    This is version 1.0 of this protocol, defining packet format and
155    actions in a supposedly upward-compatible manner where client and
156    servers of different versions are expected to interoperate; the
157    format and the definitions below are hopefully generic enough to
158    allow this.
159 
160    Each connection has a server and a client (this code); the roles
161    are known beforehand.  The client usually corresponds to a CPU and
162    memory system and the server corresponds to a memory-mapped
163    register hardware interface and/or a DMA controller.  They
164    communicate using packets with specific commands, of which some
165    require replies from the other side; most are intiated by the
166    client with one exception.  A reply uses the same format as the
167    command.
168 
169    Packets are at least three bytes long, where the first two bytes
170    form a header, a 16-bit little-endian number that is the total
171    length of the packet including the header.  There is also a
172    one-byte command.  The payload is optional, depending on the
173    command.
174 
175    [[16-bit-low-byte-of-length] [16-bit-high-byte-of-length]
176     [command/reply] [payload byte 0] [payload byte 1]
177     ... [payload byte (length-of-packet - 3)]]
178 
179    Commands:
180 
181    A client or server that reads an undocumented command may exit with
182    a hard error.  Payload not defined or disallowed below is ignored.
183 
184    It is expected that future client versions find out the version of
185    the server side by polling with base commands, assuming earlier
186    versions if a certain reply isn't seen, with newly defined payload
187    parts where earlier versions left it undefined.  New commands and
188    formats are sent only to the other side after the client and server
189    has found out each others version.  Not all servers support all
190    commands; the type of server and supported set of commands is
191    expected to be known beforehand.
192 
193    RV_READ_CMD = 0
194    Initiated by the client, requires a reply from the server.  The
195    payload from the client is at least 4 bytes, forming a 4-byte
196    little-endian address, the rest being undefined.  The reply from
197    the server is at least 8 bytes, forming the same address data as in
198    the request and the second 4-byte data being the little-endian
199    contents.
200 
201    RV_WRITE_CMD = 1
202    Initiated by the client, requires a reply from the server.  Payload
203    from the client is at least 8 bytes, forming a 4-byte little-endian
204    word being the address, the rest being the little-endian contents
205    to write.  The reply from the server is 8 bytes unless elsewhere
206    agreed otherwise, forming the same address and data as in the
207    request.  The data sent back may have been altered to correspond to
208    defined parts but can safely be discarded.
209 
210    RV_IRQ_CMD = 2
211    Initiated by the server, no reply.  The payload is 4 bytes, forming
212    a little-endian word with bits numbers corresponding to currently
213    active interrupt sources; value (1<<N) indicating interrupt source
214    N being active.
215 
216    RV_MEM_RD_CMD = 3
217    Initiated by the server, requires a reply.  A client must know
218    beforehand when (in command sequence or constant) the server can
219    send this command and if so must then not send any commands of its
220    own (including watchdog commands); the server is allowed to assume
221    that incoming data is only replies to this command.  The format is
222    8 bytes of data; 4 bytes of little-endian address followed by a
223    32-bit little endian word with the number of bytes to read.  The
224    reply is the same address and number of bytes, followed by the data
225    that had been read.
226 
227    RV_MEM_WR_CMD = 4
228    Initiated by the server, no reply.  The format is the same as a
229    reply to RV_MEM_RD_CMD; a 32-bit little-endian address, followed by
230    the 32-bit little-endian number of bytes to write (redundant
231    information but must be consistent with the packet header).
232 
233    RV_MBOX_HANDLE_CMD = 5
234    Initiated by the client, requires a reply.  The payload is 4
235    undefined bytes followed by an binary blob, the size of the
236    blob given by the packet header.  The reply is a 32-bit little
237    endian number at the same index as the undefined bytes.  Actual
238    semantics are application-specific.
239 
240    RV_MBOX_PUT_CMD = 6
241    Initiated by the client, requires a reply, with the reply using the
242    RV_MBOX_HANDLE_CMD reply format (i.e. *both* that command and
243    32-bit little-endian number).  The payload is a 32-bit little
244    endian number followed by an undefined payload, at most 20 bytes
245    long.  The reply is a 32-bit little endian number.  Actual
246    semantics are application-specific.
247 
248    RV_WATCHDOG_CMD = 7
249    Initiated by the client, no reply.  A version 1.0 client sends no
250    payload; a version 1.0 server should ignore any such payload.  A
251    version 1.0 server must not send a reply.
252 
253 
254    Possible future enhancements:
255 
256    Synchronization; server and client reports the number of elapsed
257    cycles (unit to-be-defined) at each request or notification.
258    Pretty much the top-of-the-todo-list item.
259 
260    Large addresses; 1.0 being restricted to 32-bit addresses.
261 
262    Variable-size data; currently restricted to 32-bit register
263    accesses.
264 
265    Specified data endianness (not the packet header) perhaps as part
266    of an initial format request; currently little-endian only.
267 
268 
269    Usage notes:
270    When used with servers sending RV_MEM_RD_CMD but being
271    narrow-minded about indata, set watchdog-interval to 0.  Use
272    multiple rv instances when there are e.g. separate register and
273    memory servers.  Alway log, setting "/rv/trace? true", at the
274    development phase.  Borrow from the test-suite.
275    */
276 
277 #define RV_FAMILY_NAME "rv"
278 
279 enum rv_command {
280   RV_READ_CMD = 0,
281   RV_WRITE_CMD = 1,
282   RV_IRQ_CMD = 2,
283   RV_MEM_RD_CMD = 3,
284   RV_MEM_WR_CMD = 4,
285   RV_MBOX_HANDLE_CMD = 5,
286   RV_MBOX_PUT_CMD = 6,
287   RV_WATCHDOG_CMD = 7
288 };
289 
290 
291 typedef struct _hw_rv_device
292 {
293   /* Mapping of remote interrupt bit-numbers to local ones.  */
294   uint32_t remote_to_local_int[32];
295 
296   /* When multiple bits are set, a non-zero value here indicates that
297      this value should be used instead.  */
298   uint32_t intmultiple;
299 
300   /* Local address of registers.  */
301   uint32_t reg_address;
302 
303   /* Size of register bank in bytes.  */
304   uint32_t reg_size;
305 
306   /* Remote address of registers.  */
307   uint32_t remote_reg_address;
308 
309   /* Local address of DMA:able memory.  */
310   uint32_t mem_address;
311 
312   /* Size of DMA:able memory in bytes.  */
313   uint32_t mem_size;
314 
315   /* Bitmask for valid DMA request size.  */
316   uint32_t mem_burst_mask;
317 
318   /* Remote address of DMA:able memory.  */
319   uint32_t remote_mem_address;
320 
321   /* (Local) address of mbox; where to put a pointer to the mbox to be
322      sent.  */
323   uint32_t mbox_address;
324 
325   /* Probably not 127.0.0.1:10000.  */
326   const char *host;
327   int port;
328 
329   /* If non-NULL, points to memory to use instead of connection.  */
330   uint8_t *dummy;
331 
332   /* File descriptor for the socket.  Set to -1 when error.  Only one
333      of dummy and this is active.  */
334   int fd;
335 
336   /* Stashed errno, as we don't emit an error right away.  */
337   int saved_errno;
338 
339   /* This, plus latency because the CPU might not be checking until a
340      CTI insn (usually a branch or a jump) is the interval in cycles
341      between the rv is polled for e.g. DMA requests.  */
342   uint32_t max_tick_poll_interval;
343 
344   /* Running counter for exponential backoff up to
345      max_tick_poll_interval to avoid polling the connection
346      unnecessarily often.  Set to 1 when rv activity (read/write
347      register, DMA request) is detected.  */
348   uint32_t next_period;
349 
350   /* This is the interval in wall-clock seconds between watchdog
351      packets are sent to the remote side.  Zero means no watchdog
352      packets. */
353   uint32_t watchdog_interval;
354 
355   /* Last time we sent a watchdog packet.  */
356   struct timeval last_wdog_time;
357 
358   /* Mostly used as a kludge for knowing which rv:s have poll events
359      active.  */
360   struct hw_event *poll_callback;
361 } hw_rv_device;
362 
363 
364 /* We might add ports in the future, so keep this an enumeration.  */
365 enum
366   {
367     INT_PORT
368   };
369 
370 /* Our ports.  */
371 static const struct hw_port_descriptor hw_rv_ports[] = {
372   { "int", INT_PORT, 0, output_port },
373   { NULL }
374 };
375 
376 /* Send LEN bytes of data from BUF to the socket.  Abort on
377    errors.  */
378 
379 static void
380 hw_rv_write (struct hw *me,
381 	     void *buf,
382 	     unsigned int len)
383 {
384   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
385   uint8_t *bufp = buf;
386 
387   /* If we don't have a valid fd here, it's because we got an error
388      initially, and we suppressed that error.  */
389   if (rv->fd == -1)
390     hw_abort (me, "couldn't open a connection to %s:%d because: %s",
391 	      rv->host, rv->port, strerror (rv->saved_errno));
392 
393   while (len > 0)
394     {
395       ssize_t ret = write (rv->fd, bufp, len);
396       if (ret < 0)
397 	/* FIXME: More graceful exit.  */
398 	hw_abort (me, "write to %s:%d failed: %s\n", rv->host, rv->port,
399 		  strerror (errno));
400 
401       len -= ret;
402       bufp += ret;
403     }
404 }
405 
406 /* Read LEN bytes of data into BUF from the socket.  Set the file
407    descriptor to -1 if there's an error.  */
408 
409 static void
410 hw_rv_read (struct hw *me,
411 	    void *buf,
412 	    unsigned int len)
413 {
414   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
415   uint8_t *bufp = buf;
416 
417   while (len > 0)
418     {
419       ssize_t ret = read (rv->fd, bufp, len);
420 
421       /* We get all zero if the remote end quits, but no error
422 	 indication; even select says there's data active.  */
423       if (ret <= 0)
424 	{
425 	  if (close (rv->fd) != 0)
426 	    /* FIXME: More graceful exit.  */
427 	    hw_abort (me, "read from %s:%d failed: %d\n", rv->host, rv->port, errno);
428 	  rv->fd = -1;
429 	  return;
430 	}
431 
432       len -= ret;
433       bufp += ret;
434     }
435 }
436 
437 /* Construct and send a packet of data of type CMD and len
438    LEN_NOHEADER (not counting the header...).  */
439 
440 static void
441 hw_rv_send (struct hw *me,
442 	    unsigned int cmd,
443 	    void *msg,
444 	    unsigned int len_noheader)
445 {
446   uint8_t buf[32+3];
447   uint8_t *bufp;
448   unsigned int len = len_noheader + 3;
449 
450   buf[0] = len & 255;
451   buf[1] = (len >> 8) & 255;
452   buf[2] = cmd;
453 
454   if (len > sizeof (buf))
455     {
456       hw_rv_write (me, buf, 3);
457       len = len_noheader;
458       bufp = msg;
459     }
460   else
461     {
462       memcpy (buf + 3, msg, len_noheader);
463       bufp = buf;
464     }
465 
466   hw_rv_write (me, bufp, len);
467 }
468 
469 /* Handle incoming DMA requests as per the RV_MEM_RD_CMD packet.
470    Abort on errors.  */
471 
472 static void
473 hw_rv_read_mem (struct hw *me, unsigned int len)
474 {
475   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
476   /* If you change this size, please adjust the mem2 testcase.  */
477   uint8_t buf[32+8];
478   uint8_t *bufp = buf;
479   uint32_t leaddr;
480   uint32_t addr;
481   uint32_t lelen;
482   uint32_t i;
483 
484   if (len != 8)
485     hw_abort (me, "expected DMA read request len 8+3, got %d+3", len);
486 
487   hw_rv_read (me, &leaddr, 4);
488   hw_rv_read (me, &lelen, 4);
489   len = LE2H_4 (lelen);
490   addr = LE2H_4 (leaddr);
491 
492   if (addr < rv->remote_mem_address
493       || addr >= rv->remote_mem_address + rv->mem_size)
494     hw_abort (me, "DMA read at remote 0x%x; outside [0x%x..0x%x-1]",
495 	      (unsigned) addr, (unsigned) rv->remote_mem_address,
496 	      (unsigned) (rv->remote_mem_address + rv->mem_size));
497   addr = addr - rv->remote_mem_address + rv->mem_address;
498 
499   if (len == 0)
500     hw_abort (me, "DMA read request for 0 bytes isn't supported");
501 
502   if (len & ~rv->mem_burst_mask)
503     hw_abort (me, "DMA trying to read %d bytes; not matching mask of 0x%x",
504 	      len, rv->mem_burst_mask);
505   if (len + 8 > sizeof (buf))
506     bufp = hw_malloc (me, len + 8);
507 
508   HW_TRACE ((me, "DMA R 0x%x..0x%x", addr, addr + len -1));
509   hw_dma_read_buffer (me, bufp + 8, 0, addr, len);
510   if (hw_trace_p (me))
511     for (i = 0; i < len; i += 4)
512       HW_TRACE ((me, "0x%x: %02x %02x %02x %02x",
513 		 addr + i,
514 		 bufp[i+8], bufp[i+9], bufp[i+10], bufp[i+11]));
515 
516   memcpy (bufp, &leaddr, 4);
517   memcpy (bufp + 4, &lelen, 4);
518   hw_rv_send (me, RV_MEM_RD_CMD, bufp, len + 8);
519   if (bufp != buf)
520     hw_free (me, bufp);
521 }
522 
523 /* Handle incoming DMA requests as per the RV_MEM_WR_CMD packet.
524    Abort on errors.  */
525 
526 static void
527 hw_rv_write_mem (struct hw *me, unsigned int plen)
528 {
529   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
530   /* If you change this size, please adjust the mem2 testcase.  */
531   uint8_t buf[32+8];
532   uint8_t *bufp = buf;
533   uint32_t leaddr;
534   uint32_t addr;
535   uint32_t lelen;
536   uint32_t len;
537   uint32_t i;
538 
539   hw_rv_read (me, &leaddr, 4);
540   hw_rv_read (me, &lelen, 4);
541   len = LE2H_4 (lelen);
542   addr = LE2H_4 (leaddr);
543 
544   if (len != plen - 8)
545     hw_abort (me,
546 	      "inconsistency in DMA write request packet: "
547 	      "envelope %d+3, inner %d bytes", plen, len);
548 
549   if (addr < rv->remote_mem_address
550       || addr >= rv->remote_mem_address + rv->mem_size)
551     hw_abort (me, "DMA write at remote 0x%x; outside [0x%x..0x%x-1]",
552 	      (unsigned) addr, (unsigned) rv->remote_mem_address,
553 	      (unsigned) (rv->remote_mem_address + rv->mem_size));
554 
555   addr = addr - rv->remote_mem_address + rv->mem_address;
556   if (len == 0)
557     hw_abort (me, "DMA write request for 0 bytes isn't supported");
558 
559   if (len & ~rv->mem_burst_mask)
560     hw_abort (me, "DMA trying to write %d bytes; not matching mask of 0x%x",
561 	      len, rv->mem_burst_mask);
562   if (len + 8 > sizeof (buf))
563     bufp = hw_malloc (me, len + 8);
564 
565   hw_rv_read (me, bufp + 8, len);
566   HW_TRACE ((me, "DMA W 0x%x..0x%x", addr, addr + len - 1));
567   hw_dma_write_buffer (me, bufp + 8, 0, addr, len, 0);
568   if (hw_trace_p (me))
569     for (i = 0; i < len; i += 4)
570       HW_TRACE ((me, "0x%x: %02x %02x %02x %02x",
571 		 addr + i,
572 		 bufp[i+8], bufp[i+9], bufp[i+10], bufp[i+11]));
573   if (bufp != buf)
574     hw_free (me, bufp);
575 }
576 
577 static void
578 hw_rv_irq (struct hw *me, unsigned int len)
579 {
580   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
581   uint32_t intbitsle;
582   uint32_t intbits_ext;
583   uint32_t intval = 0;
584   int i;
585 
586   if (len != 4)
587     hw_abort (me, "IRQ with %d data not supported", len);
588 
589   hw_rv_read (me, &intbitsle, 4);
590   intbits_ext = LE2H_4 (intbitsle);
591   for (i = 0; i < 32; i++)
592     if ((intbits_ext & (1 << i)) != 0)
593       intval |= rv->remote_to_local_int[i];
594   if ((intbits_ext & ~(intbits_ext - 1)) != intbits_ext
595       && rv->intmultiple != 0)
596     intval = rv->intmultiple;
597 
598   HW_TRACE ((me, "IRQ 0x%x", intval));
599   hw_port_event (me, INT_PORT, intval);
600 }
601 
602 /* Handle incoming interrupt notifications as per the RV_IRQ_CMD
603    packet.  Abort on errors.  */
604 
605 static void
606 hw_rv_handle_incoming (struct hw *me,
607 		       int expected_type,
608 		       uint8_t *buf,
609 		       unsigned int *return_len)
610 {
611   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
612   uint8_t cbuf[32];
613   unsigned int len;
614   unsigned int cmd;
615 
616   while (1)
617     {
618       hw_rv_read (me, cbuf, 3);
619 
620       if (rv->fd == -1)
621 	return;
622 
623       len = cbuf[0] + cbuf[1] * 256 - 3;
624       cmd = cbuf[2];
625 
626       /* These come in "asynchronously"; not as a reply.  */
627       switch (cmd)
628 	{
629 	case RV_IRQ_CMD:
630 	  hw_rv_irq (me, len);
631 	  break;
632 
633 	case RV_MEM_RD_CMD:
634 	  hw_rv_read_mem (me, len);
635 	  break;
636 
637 	case RV_MEM_WR_CMD:
638 	  hw_rv_write_mem (me, len);
639 	  break;
640 	}
641 
642       /* Something is incoming from the other side, so tighten up all
643 	 slack at the next wait.  */
644       rv->next_period = 1;
645 
646       switch (cmd)
647 	{
648 	case RV_MEM_RD_CMD:
649 	case RV_MEM_WR_CMD:
650 	case RV_IRQ_CMD:
651 	  /* Don't try to handle more than one of these if we were'nt
652 	     expecting a reply.  */
653 	  if (expected_type == -1)
654 	    return;
655 	  continue;
656 	}
657 
658       /* Require a match between this supposed-reply and the command
659 	 for the rest.  */
660       if (cmd != expected_type)
661 	hw_abort (me, "unexpected reply, expected command %d, got %d",
662 		  expected_type, cmd);
663 
664       switch (cmd)
665 	{
666 	case RV_MBOX_PUT_CMD:
667 	case RV_MBOX_HANDLE_CMD:
668 	case RV_WRITE_CMD:
669 	case RV_READ_CMD:
670 	  hw_rv_read (me, buf, len <= *return_len ? len : *return_len);
671 	  *return_len = len;
672 	  break;
673 	}
674       break;
675     }
676 }
677 
678 /* Send a watchdog packet.  Make a note of wallclock time.  */
679 
680 static void
681 hw_rv_send_wdog (struct hw *me)
682 {
683   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
684   HW_TRACE ((me, "WD"));
685   gettimeofday (&rv->last_wdog_time, NULL);
686   hw_rv_send (me, RV_WATCHDOG_CMD, "", 0);
687 }
688 
689 /* Poll the remote side: see if there's any incoming traffic; handle a
690    packet if so.  Send a watchdog packet if it's time to do so.
691    Beware that the Linux select call indicates traffic for a socket
692    that the remote side has closed (which may be because it was
693    finished; don't hork until we need to write something just because
694    we're polling).  */
695 
696 static void
697 hw_rv_poll_once (struct hw *me)
698 {
699   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
700   fd_set rfds;
701   fd_set efds;
702   struct timeval now;
703   int ret;
704   struct timeval tv;
705 
706   if (rv->fd == -1)
707     /* Connection has died or was never initiated.  */
708     return;
709 
710   FD_ZERO (&rfds);
711   FD_SET (rv->fd, &rfds);
712   FD_ZERO (&efds);
713   FD_SET (rv->fd, &efds);
714   tv.tv_sec = 0;
715   tv.tv_usec = 0;
716 
717   ret = select (rv->fd + 1, &rfds, NULL, &efds, &tv);
718   gettimeofday (&now, NULL);
719 
720   if (ret < 0)
721     hw_abort (me, "select failed: %d\n", errno);
722 
723   if (rv->watchdog_interval != 0
724       && now.tv_sec - rv->last_wdog_time.tv_sec >= rv->watchdog_interval)
725     hw_rv_send_wdog (me);
726 
727   if (FD_ISSET (rv->fd, &rfds))
728     hw_rv_handle_incoming (me, -1, NULL, NULL);
729 }
730 
731 /* Initialize mapping of remote-to-local interrupt data.  */
732 
733 static void
734 hw_rv_map_ints (struct hw *me)
735 {
736   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
737   int i;
738 
739   for (i = 0; i < 32; i++)
740     rv->remote_to_local_int[i] = 1 << i;
741 
742   if (hw_find_property (me, "intnum") != NULL)
743     for (i = 0; i < 32; i++)
744       {
745 	signed_cell val = -1;
746 	if (hw_find_integer_array_property (me, "intnum", i, &val) > 0)
747 	  {
748 	    if (val > 0)
749 	      rv->remote_to_local_int[i] = val;
750 	    else
751 	      hw_abort (me, "property \"intnum@%d\" must be > 0; is %d",
752 			i, (int) val);
753 	  }
754       }
755 }
756 
757 /* Handle the after-N-ticks "poll event", calling the poll-the-fd
758    method.  Update the period.  */
759 
760 static void
761 do_poll_event (struct hw *me, void *data)
762 {
763   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
764   uint32_t new_period;
765 
766   if (rv->dummy != NULL)
767     return;
768 
769   hw_rv_poll_once (me);
770   if (rv->fd >= 0)
771     rv->poll_callback
772       = hw_event_queue_schedule (me, rv->next_period, do_poll_event, NULL);
773 
774   new_period = rv->next_period * 2;
775   if (new_period <= rv->max_tick_poll_interval)
776     rv->next_period = new_period;
777 }
778 
779 /* HW tree traverse function for hw_rv_add_init.  */
780 
781 static void
782 hw_rv_add_poller (struct hw *me, void *data)
783 {
784   hw_rv_device *rv;
785 
786   if (hw_family (me) == NULL
787       || strcmp (hw_family (me), RV_FAMILY_NAME) != 0)
788     return;
789 
790   rv = (hw_rv_device *) hw_data (me);
791   if (rv->poll_callback != NULL)
792     return;
793 
794   rv->poll_callback
795     = hw_event_queue_schedule (me, 1, do_poll_event, NULL);
796 }
797 
798 /* Simulator module init function for hw_rv_add_init.  */
799 
800 /* FIXME: For the call so hw_tree_traverse, we need to know that the
801    first member of struct sim_hw is the struct hw *root, but there's
802    no accessor method and struct sim_hw is defined in sim-hw.c only.
803    Hence this hack, until an accessor is added, or there's a traverse
804    function that takes a SIM_DESC argument.  */
805 struct sim_hw { struct hw *tree; };
806 
807 static SIM_RC
808 hw_rv_add_rv_pollers (SIM_DESC sd)
809 {
810   hw_tree_traverse (STATE_HW (sd)->tree, hw_rv_add_poller, NULL, NULL);
811   return SIM_RC_OK;
812 }
813 
814 /* We need to add events for polling, but we can't add one from the
815    finish-function, and there are no other call points, at least for
816    instances without "reg" (when there are just DMA requests from the
817    remote end; no locally initiated activity).  Therefore we add a
818    simulator module init function, but those don't have private
819    payload arguments; just a SD argument.  We cope by parsing the HW
820    root and making sure *all* "rv":s have poll callbacks installed.
821    Luckily, this is just an initialization step, and not many
822    simultaneous instances of rv are expected: we get a N**2 complexity
823    for visits to each rv node by this method.  */
824 
825 static void
826 hw_rv_add_init (struct hw *me)
827 {
828   sim_module_add_init_fn (hw_system (me), hw_rv_add_rv_pollers);
829 }
830 
831 /* Open up a connection to the other side.  Abort on errors.  */
832 
833 static void
834 hw_rv_init_socket (struct hw *me)
835 {
836   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
837   int sock;
838   struct sockaddr_in server;
839 
840   rv->fd = -1;
841 
842   if (rv->dummy != NULL)
843     return;
844 
845   memset (&server, 0, sizeof (server));
846   server.sin_family = AF_INET;
847   server.sin_addr.s_addr = inet_addr (rv->host);
848 
849   /* Solaris 2.7 lacks this macro.  */
850 #ifndef INADDR_NONE
851 #define INADDR_NONE -1
852 #endif
853 
854   if (server.sin_addr.s_addr == INADDR_NONE)
855     {
856       struct hostent *h;
857       h = gethostbyname (rv->host);
858       if (h != NULL)
859 	{
860 	  memcpy (&server.sin_addr, h->h_addr, h->h_length);
861 	  server.sin_family = h->h_addrtype;
862 	}
863       else
864 	hw_abort (me, "can't resolve host %s", rv->host);
865     }
866 
867   server.sin_port = htons (rv->port);
868   sock = socket (AF_INET, SOCK_STREAM, 0);
869 
870   if (sock == -1)
871     hw_abort (me, "can't get a socket for %s:%d connection",
872 	      rv->host, rv->port);
873 
874   if (connect (sock, (struct sockaddr *) &server, sizeof server) >= 0)
875     {
876       rv->fd = sock;
877 
878       /* FIXME: init packet here.  Maybe start packet too.  */
879       if (rv->watchdog_interval != 0)
880 	hw_rv_send_wdog (me);
881     }
882   else
883     /* Stash the errno for later display, if some connection activity
884        is requested.  Don't emit an error here; we might have been
885        called just for test purposes.  */
886     rv->saved_errno = errno;
887 }
888 
889 /* Local rv register reads end up here.  */
890 
891 static unsigned int
892 hw_rv_reg_read (struct hw *me,
893 		void *dest,
894 		int space,
895 		unsigned_word addr,
896 		unsigned int nr_bytes)
897 {
898   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
899   uint8_t addr_data[8] = "";
900   uint32_t a_l = H2LE_4 (addr - rv->reg_address + rv->remote_reg_address);
901   unsigned int len = 8;
902 
903   if (nr_bytes != 4)
904     hw_abort (me, "must be four byte read");
905 
906   if (addr == rv->mbox_address)
907     hw_abort (me, "invalid read of mbox address 0x%x",
908 	      (unsigned) rv->mbox_address);
909 
910   memcpy (addr_data, &a_l, 4);
911   HW_TRACE ((me, "REG R 0x%x", addr));
912   if (rv->dummy != NULL)
913     {
914       len = 8;
915       memcpy (addr_data + 4, rv->dummy + addr - rv->reg_address, 4);
916     }
917   else
918     {
919       hw_rv_send (me, RV_READ_CMD, addr_data, len);
920       hw_rv_handle_incoming (me, RV_READ_CMD, addr_data, &len);
921     }
922 
923   if (len != 8)
924     hw_abort (me, "read %d != 8 bytes returned", len);
925   HW_TRACE ((me, ":= 0x%02x%02x%02x%02x",
926 	     addr_data[7], addr_data[6], addr_data[5], addr_data[4]));
927   memcpy (dest, addr_data + 4, 4);
928   return nr_bytes;
929 }
930 
931 /* Local rv mbox requests (handle or put) end up here.  */
932 
933 static void
934 hw_rv_mbox (struct hw *me, unsigned_word address)
935 {
936   uint8_t buf[256+3];
937   unsigned int cmd;
938   unsigned int rlen;
939   uint32_t i;
940   unsigned int len
941     = hw_dma_read_buffer (me, buf, 0, address, 3);
942 
943   if (len != 3)
944     hw_abort (me, "mbox read %d != 3 bytes returned", len);
945 
946   cmd = buf[2];
947   if (cmd != RV_MBOX_HANDLE_CMD && cmd != RV_MBOX_PUT_CMD)
948     hw_abort (me, "unsupported mbox command %d", cmd);
949 
950   len = buf[0] + buf[1]*256;
951 
952   if (len > sizeof (buf))
953     hw_abort (me, "mbox cmd %d send size %d unsupported", cmd, len);
954 
955   rlen = hw_dma_read_buffer (me, buf + 3, 0, address + 3, len - 3);
956   if (rlen != len - 3)
957     hw_abort (me, "mbox read %d != %d bytes returned", rlen, len - 3);
958 
959   HW_TRACE ((me, "MBOX %s 0x%x..0x%x",
960 	     cmd == RV_MBOX_HANDLE_CMD ? "H" : "P",
961 	     address, address + len - 1));
962   for (i = 0; i < rlen; i += 8)
963     HW_TRACE ((me, "0x%x: %02x %02x %02x %02x %02x %02x %02x %02x",
964 	       address + 3 + i,
965 	       buf[3+i], buf[4+i], buf[5+i], buf[6+i], buf[7+i], buf[8+i],
966 	       buf[9+i], buf[10+i]));
967 
968   len -= 3;
969   hw_rv_send (me, cmd, buf + 3, len);
970 
971   /* Note: both ..._PUT and ..._HANDLE get the ..._HANDLE reply.  */
972   hw_rv_handle_incoming (me, RV_MBOX_HANDLE_CMD, buf + 3, &len);
973   if (len > sizeof (buf))
974     hw_abort (me, "mbox cmd %d receive size %d unsupported", cmd, len);
975   HW_TRACE ((me, "-> 0x%x..0x%x", address, address + len + 3 - 1));
976   for (i = 0; i < len; i += 8)
977     HW_TRACE ((me, "0x%x: %02x %02x %02x %02x %02x %02x %02x %02x",
978 	       address + 3 + i,
979 	       buf[3+i], buf[4+i], buf[5+i], buf[6+i], buf[7+i], buf[8+i],
980 	       buf[9+i], buf[10+i]));
981 
982   len += 3;
983   buf[0] = len & 255;
984   buf[1] = len / 256;
985   rlen = hw_dma_write_buffer (me, buf, 0, address, len, 0);
986   if (rlen != len)
987     hw_abort (me, "mbox write %d != %d bytes", rlen, len);
988 }
989 
990 /* Local rv register writes end up here.  */
991 
992 static unsigned int
993 hw_rv_reg_write (struct hw *me,
994 		 const void *source,
995 		 int space,
996 		 unsigned_word addr,
997 		 unsigned int nr_bytes)
998 {
999   hw_rv_device *rv = (hw_rv_device *) hw_data (me);
1000 
1001   uint8_t addr_data[8] = "";
1002   uint32_t a_l = H2LE_4 (addr - rv->reg_address + rv->remote_reg_address);
1003   unsigned int len = 8;
1004 
1005   if (nr_bytes != 4)
1006     hw_abort (me, "must be four byte write");
1007 
1008   memcpy (addr_data, &a_l, 4);
1009   memcpy (addr_data + 4, source, 4);
1010 
1011   if (addr == rv->mbox_address)
1012     {
1013       uint32_t mbox_addr_le;
1014       if (rv->dummy != NULL)
1015 	hw_abort (me, "mbox not supported for a dummy instance");
1016       memcpy (&mbox_addr_le, source, 4);
1017       hw_rv_mbox (me, LE2H_4 (mbox_addr_le));
1018       return nr_bytes;
1019     }
1020 
1021   HW_TRACE ((me, "REG W 0x%x := 0x%02x%02x%02x%02x", addr,
1022 	     addr_data[7], addr_data[6], addr_data[5], addr_data[4]));
1023   if (rv->dummy != NULL)
1024     {
1025       len = 8;
1026       memcpy (rv->dummy + addr - rv->reg_address, addr_data + 4, 4);
1027     }
1028   else
1029     {
1030       hw_rv_send (me, RV_WRITE_CMD, addr_data, len);
1031       hw_rv_handle_incoming (me, RV_WRITE_CMD, addr_data, &len);
1032     }
1033 
1034   if (len != 8)
1035     hw_abort (me, "read %d != 8 bytes returned", len);
1036 
1037   /* We had an access: tighten up all slack.  */
1038   rv->next_period = 1;
1039 
1040   return nr_bytes;
1041 }
1042 
1043 /* Instance initializer function.  */
1044 
1045 static void
1046 hw_rv_finish (struct hw *me)
1047 {
1048   hw_rv_device *rv = HW_ZALLOC (me, hw_rv_device);
1049   const struct hw_property *mem_prop;
1050   const struct hw_property *dummy_prop;
1051   const struct hw_property *mbox_prop;
1052 
1053   set_hw_data (me, rv);
1054 
1055 #undef RV_GET_IPROP
1056 #undef RV_GET_PROP
1057 #define RV_GET_PROP(T, N, M, D)				\
1058   do							\
1059     {							\
1060       if (hw_find_property (me, N) != NULL)		\
1061 	rv->M = hw_find_ ## T ## _property (me, N);	\
1062       else						\
1063 	rv->M = (D);					\
1064     }							\
1065   while (0)
1066 #define RV_GET_IPROP(N, M, D) RV_GET_PROP (integer, N, M, D)
1067 
1068   RV_GET_PROP (string, "host", host, "127.0.0.1");
1069   RV_GET_IPROP ("port", port, 10000);
1070   RV_GET_IPROP ("remote-reg", remote_reg_address, 0);
1071   RV_GET_IPROP ("max-poll-ticks", max_tick_poll_interval, 10000);
1072   RV_GET_IPROP ("watchdog-interval", watchdog_interval, 30);
1073   RV_GET_IPROP ("remote-mem", remote_mem_address, 0);
1074   RV_GET_IPROP ("mem-burst-mask", mem_burst_mask, 0xffff);
1075   RV_GET_IPROP ("intmultiple", intmultiple, 0);
1076 
1077   set_hw_io_read_buffer (me, hw_rv_reg_read);
1078   set_hw_io_write_buffer (me, hw_rv_reg_write);
1079   set_hw_ports (me, hw_rv_ports);
1080   rv->next_period = 1;
1081 
1082   /* FIXME: We only support zero or one reg and zero or one mem area.  */
1083   if (hw_find_property (me, "reg") != NULL)
1084     {
1085       reg_property_spec reg;
1086       if (hw_find_reg_array_property (me, "reg", 0, &reg))
1087 	{
1088 	  unsigned_word attach_address;
1089 	  int attach_space;
1090 	  unsigned int attach_size;
1091 
1092 	  hw_unit_address_to_attach_address (hw_parent (me),
1093 					     &reg.address,
1094 					     &attach_space,
1095 					     &attach_address,
1096 					     me);
1097 	  rv->reg_address = attach_address;
1098 	  hw_unit_size_to_attach_size (hw_parent (me),
1099 				       &reg.size,
1100 				       &attach_size, me);
1101 	  rv->reg_size = attach_size;
1102 	  if ((attach_address & 3) != 0)
1103 	    hw_abort (me, "register block must be 4 byte aligned");
1104 	  hw_attach_address (hw_parent (me),
1105 			     0,
1106 			     attach_space, attach_address, attach_size,
1107 			     me);
1108 	}
1109       else
1110 	hw_abort (me, "property \"reg\" has the wrong type");
1111     }
1112 
1113   dummy_prop = hw_find_property (me, "dummy");
1114   if (dummy_prop != NULL)
1115     {
1116       if (rv->reg_size == 0)
1117 	hw_abort (me, "dummy argument requires a \"reg\" property");
1118 
1119       if (hw_property_type (dummy_prop) == integer_property)
1120 	{
1121 	  uint32_t dummyfill = hw_find_integer_property (me, "dummy");
1122 	  uint8_t *dummymem = hw_malloc (me, rv->reg_size);
1123 	  memset (dummymem, dummyfill, rv->reg_size);
1124 	  rv->dummy = dummymem;
1125 	}
1126       else
1127 	{
1128 	  const char *dummyarg = hw_find_string_property (me, "dummy");
1129 	  uint8_t *dummymem = hw_malloc (me, rv->reg_size);
1130 	  FILE *f = fopen (dummyarg, "rb");
1131 
1132 	  if (f == NULL)
1133 	    hw_abort (me, "opening dummy-file \"%s\": %s",
1134 		      dummyarg, strerror (errno));
1135 	  if (fread (dummymem, 1, rv->reg_size, f) != rv->reg_size)
1136 	    hw_abort (me, "reading dummy-file \"%s\": %s",
1137 		      dummyarg, strerror (errno));
1138 	  fclose (f);
1139 	  rv->dummy = dummymem;
1140 	}
1141     }
1142 
1143   mbox_prop = hw_find_property (me, "mbox");
1144   if (mbox_prop != NULL)
1145     {
1146       if (hw_property_type (mbox_prop) == integer_property)
1147 	{
1148 	  signed_cell attach_address_sc
1149 	    = hw_find_integer_property (me, "mbox");
1150 
1151 	  rv->mbox_address = (uint32_t) attach_address_sc;
1152 	  hw_attach_address (hw_parent (me),
1153 			     0,
1154 			     0, (uint32_t) attach_address_sc, 4, me);
1155 	}
1156       else
1157 	hw_abort (me, "property \"mbox\" has the wrong type");
1158     }
1159 
1160   mem_prop = hw_find_property (me, "mem");
1161   if (mem_prop != NULL)
1162     {
1163       signed_cell attach_address_sc;
1164       signed_cell attach_size_sc;
1165 
1166       /* Only specific names are reg_array_properties, the rest are
1167 	 array_properties.  */
1168       if (hw_property_type (mem_prop) == array_property
1169 	  && hw_property_sizeof_array (mem_prop) == 2 * sizeof (attach_address_sc)
1170 	  && hw_find_integer_array_property (me, "mem", 0, &attach_address_sc)
1171 	  && hw_find_integer_array_property (me, "mem", 1, &attach_size_sc))
1172 	{
1173 	  /* Unfortunate choice of types forces us to dance around a bit.  */
1174 	  rv->mem_address = (uint32_t) attach_address_sc;
1175 	  rv->mem_size = (uint32_t) attach_size_sc;
1176 	  if ((attach_address_sc & 3) != 0)
1177 	    hw_abort (me, "memory block must be 4 byte aligned");
1178 	}
1179       else
1180 	hw_abort (me, "property \"mem\" has the wrong type");
1181     }
1182 
1183   hw_rv_map_ints (me);
1184 
1185   hw_rv_init_socket (me);
1186 
1187   /* We need an extra initialization pass, after all others currently
1188      scheduled (mostly, after the simulation events machinery has been
1189      initialized so the events we want don't get thrown out).  */
1190   hw_rv_add_init (me);
1191 }
1192 
1193 /* Our root structure; see dv-* build machinery for usage.  */
1194 
1195 const struct hw_descriptor dv_rv_descriptor[] = {
1196   { RV_FAMILY_NAME, hw_rv_finish },
1197   { NULL }
1198 };
1199