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, ®)) 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 ®.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 ®.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