Changeset 1019 in vbox for trunk/src/VBox/Devices/Serial
- Timestamp:
- Feb 22, 2007 9:29:57 AM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 18876
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Serial/serial.c
r61 r1019 65 65 #include "../vl_vbox.h" 66 66 67 #define VBOX_SERIAL_PCI 68 69 #ifdef VBOX_SERIAL_PCI 70 #include <VBox/pci.h> 71 #endif /* VBOX_SERIAL_PCI */ 72 73 #define SERIAL_SAVED_STATE_VERSION 2 74 67 75 #endif /* VBOX */ 68 76 69 77 #ifndef VBOX 70 78 #include "vl.h" 71 #endif 79 #endif /* !VBOX */ 72 80 73 81 //#define DEBUG_SERIAL … … 131 139 it can be reset while reading iir */ 132 140 int thr_ipending; 141 #ifndef VBOX 133 142 SetIRQFunc *set_irq; 134 143 void *irq_opaque; 144 #endif /* !VBOX */ 135 145 int irq; 136 146 #ifdef VBOX 147 #ifdef VBOX_SERIAL_PCI 148 PCIDEVICE dev; 149 #endif /* VBOX_SERIAL_PCI */ 137 150 /* Be careful with pointers in the structure; load just gets the whole structure from the saved state */ 138 151 PPDMDEVINS pDevIns; 139 #else 152 #if 0 153 PDMICHAR pDevChar; 154 #endif 155 #else /* !VBOX */ 140 156 CharDriverState *chr; 141 #endif 157 #endif /* !VBOX */ 142 158 int last_break_enable; 143 159 target_ulong base; 160 #ifndef VBOX 144 161 int it_shift; 162 #endif /* !VBOX */ 145 163 }; 164 165 #ifdef VBOX 166 #ifdef VBOX_SERIAL_PCI 167 #define PCIDEV_2_SERIALSTATE(pPciDev) ( (SerialState *)((uintptr_t)(pPciDev) - RT_OFFSETOF(SerialState, dev)) ) 168 #endif /* VBOX_SERIAL_PCI */ 169 #endif /* VBOX */ 146 170 147 171 static void serial_update_irq(SerialState *s) … … 157 181 #ifdef VBOX 158 182 s->pDevIns->pDevHlp->pfnISASetIrq (s->pDevIns, s->irq, 1); 159 #else 183 #else /* !VBOX */ 160 184 s->set_irq(s->irq_opaque, s->irq, 1); 161 #endif 185 #endif /* !VBOX */ 162 186 } else { 163 187 #ifdef VBOX 164 188 s->pDevIns->pDevHlp->pfnISASetIrq (s->pDevIns, s->irq, 0); 165 #else 189 #else /* !VBOX */ 166 190 s->set_irq(s->irq_opaque, s->irq, 0); 167 #endif 191 #endif /* !VBOX */ 168 192 } 169 193 } … … 196 220 #ifndef VBOX 197 221 qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); 198 #endif 222 #endif /* !VBOX */ 199 223 #if 0 200 224 printf("speed=%d parity=%c data=%d stop=%d\n", … … 223 247 serial_update_irq(s); 224 248 ch = val; 225 #ifndef VBOX 249 #ifdef VBOX 250 #if 0 251 if (s->pDrvChar) 252 { 253 int rc = s->pDrvChar->pfnWrite(s->pDrvChar, &ch, 1); 254 AssertRC(rc); 255 } 256 #endif 257 #else /* !VBOX */ 226 258 qemu_chr_write(s->chr, &ch, 1); 227 #endif 259 #endif /* !VBOX */ 228 260 s->thr_ipending = 1; 229 261 s->lsr |= UART_LSR_THRE; … … 257 289 qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_BREAK, 258 290 &break_enable); 259 #endif 291 #endif /* !VBOX */ 260 292 } 261 293 } … … 335 367 } 336 368 337 #ifndef VBOX 369 #ifdef VBOX 370 /* Provide non-blocking functions to receive data from the host system. */ 371 372 #else /* !VBOX */ 338 373 static int serial_can_receive(SerialState *s) 339 374 { … … 525 560 return s; 526 561 } 527 528 #else 529 562 #endif 563 564 #ifdef VBOX 530 565 static DECLCALLBACK(int) serial_io_write (PPDMDEVINS pDevIns, 531 566 void *pvUser, … … 535 570 { 536 571 if (cb == 1) { 572 Log(("%s: port %#06x val %#04x\n", __FUNCTION__, Port, u32)); 537 573 serial_ioport_write (pvUser, Port, u32); 538 574 } … … 550 586 { 551 587 if (cb == 1) { 588 Log(("%s: port %#06x\n", __FUNCTION__, Port)); 552 589 *pu32 = serial_ioport_read (pvUser, Port); 590 Log(("%s: port %#06x val %#04x\n", __FUNCTION__, Port, *pu32)); 553 591 return VINF_SUCCESS; 554 592 } … … 558 596 } 559 597 560 static DECLCALLBACK(int) SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle) 598 static DECLCALLBACK(int) serialSaveExec(PPDMDEVINS pDevIns, 599 PSSMHANDLE pSSMHandle) 561 600 { 562 601 SerialState *s = PDMINS2DATA (pDevIns, SerialState *); 563 SSMR3PutMem(pSSMHandle, s, sizeof(*s)); 602 SSMR3PutU16(pSSMHandle, s->divider); 603 SSMR3PutU8(pSSMHandle, s->rbr); 604 SSMR3PutU8(pSSMHandle, s->ier); 605 SSMR3PutU8(pSSMHandle, s->lcr); 606 SSMR3PutU8(pSSMHandle, s->mcr); 607 SSMR3PutU8(pSSMHandle, s->lsr); 608 SSMR3PutU8(pSSMHandle, s->msr); 609 SSMR3PutU8(pSSMHandle, s->scr); 610 SSMR3PutU32(pSSMHandle, s->thr_ipending); 611 SSMR3PutU32(pSSMHandle, s->irq); 612 SSMR3PutU32(pSSMHandle, s->last_break_enable); 613 SSMR3PutU32(pSSMHandle, s->base); 564 614 return SSMR3PutU32(pSSMHandle, ~0); /* sanity/terminator */ 565 615 } 566 616 567 static DECLCALLBACK(int) LoadExec(PPDMDEVINS pDevIns,568 PSSMHANDLE pSSMHandle,569 uint32_t u32Version)617 static DECLCALLBACK(int) serialLoadExec(PPDMDEVINS pDevIns, 618 PSSMHANDLE pSSMHandle, 619 uint32_t u32Version) 570 620 { 571 621 int rc; … … 573 623 SerialState *s = PDMINS2DATA (pDevIns, SerialState *); 574 624 575 if (u32Version != 2) {625 if (u32Version != SERIAL_SAVED_STATE_VERSION) { 576 626 AssertMsgFailed(("u32Version=%d\n", u32Version)); 577 627 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 578 628 } 579 629 580 rc = SSMR3GetMem(pSSMHandle, s, sizeof(*s)); 581 if (VBOX_FAILURE(rc)) 582 return rc; 630 SSMR3GetU16(pSSMHandle, &s->divider); 631 SSMR3GetU8(pSSMHandle, &s->rbr); 632 SSMR3GetU8(pSSMHandle, &s->ier); 633 SSMR3GetU8(pSSMHandle, &s->lcr); 634 SSMR3GetU8(pSSMHandle, &s->mcr); 635 SSMR3GetU8(pSSMHandle, &s->lsr); 636 SSMR3GetU8(pSSMHandle, &s->msr); 637 SSMR3GetU8(pSSMHandle, &s->scr); 638 SSMR3GetU32(pSSMHandle, &s->thr_ipending); 639 SSMR3GetU32(pSSMHandle, &s->irq); 640 SSMR3GetU32(pSSMHandle, &s->last_break_enable); 641 SSMR3GetU32(pSSMHandle, &s->base); 583 642 584 643 rc = SSMR3GetU32(pSSMHandle, &u32); … … 590 649 return VERR_SSM_DATA_UNIT_FORMAT_CHANGED; 591 650 } 592 /* Be careful with pointers in the structure; load just gets the whole structure from the saved state */ 651 /* Be careful with pointers in the structure; they are not preserved 652 * in the saved state. */ 593 653 s->pDevIns = pDevIns; 594 654 return VINF_SUCCESS; 595 655 } 596 656 657 #ifdef VBOX_SERIAL_PCI 658 659 static DECLCALLBACK(int) serialIOPortRegionMap(PPCIDEVICE pPciDev, /* unsigned */ int iRegion, RTGCPHYS GCPhysAddress, uint32_t cb, PCIADDRESSSPACE enmType) 660 { 661 SerialState *pData = PCIDEV_2_SERIALSTATE(pPciDev); 662 int rc = VINF_SUCCESS; 663 664 Assert(enmType == PCI_ADDRESS_SPACE_IO); 665 Assert(iRegion == 0); 666 Assert(cb == 8); 667 AssertMsg(RT_ALIGN(GCPhysAddress, 8) == GCPhysAddress, ("Expected 8 byte alignment. GCPhysAddress=%#x\n", GCPhysAddress)); 668 669 pData->base = (RTIOPORT)GCPhysAddress; 670 671 /* 672 * Register our port IO handlers. 673 */ 674 rc = pPciDev->pDevIns->pDevHlp->pfnIOPortRegister(pPciDev->pDevIns, (RTIOPORT)GCPhysAddress, 8, (void *)pData, 675 serial_io_write, serial_io_read, NULL, NULL, "SERIAL"); 676 AssertRC(rc); 677 return rc; 678 } 679 680 #endif /* VBOX_SERIAL_PCI */ 597 681 598 682 /** … … 647 731 s->lsr = UART_LSR_TEMT | UART_LSR_THRE; 648 732 s->iir = UART_IIR_NO_INT; 649 733 s->msr = UART_MSR_DCD | UART_MSR_DSR | UART_MSR_CTS; 734 #ifdef VBOX_SERIAL_PCI 735 s->base = -1; 736 s->dev.config[0x00] = 0xee; /* Vendor: ??? */ 737 s->dev.config[0x01] = 0x80; 738 s->dev.config[0x02] = 0x01; /* Device: ??? */ 739 s->dev.config[0x03] = 0x01; 740 s->dev.config[0x04] = PCI_COMMAND_IOACCESS; 741 s->dev.config[0x09] = 0x01; /* Programming interface: 16450 */ 742 s->dev.config[0x0a] = 0x00; /* Subclass: Serial controller */ 743 s->dev.config[0x0b] = 0x07; /* Class: Communication controller */ 744 s->dev.config[0x0e] = 0x00; /* Header type: standard */ 745 s->dev.config[0x3c] = irq_lvl; /* preconfigure IRQ number (0 = autoconfig)*/ 746 s->dev.config[0x3d] = 1; /* interrupt pin 0 */ 747 rc = pDevIns->pDevHlp->pfnPCIRegister(pDevIns, &s->dev); 748 if (VBOX_FAILURE(rc)) 749 return rc; 750 /* 751 * Register the PCI I/O ports. 752 */ 753 rc = pDevIns->pDevHlp->pfnPCIIORegionRegister(pDevIns, 0, 8, PCI_ADDRESS_SPACE_IO, serialIOPortRegionMap); 754 if (VBOX_FAILURE(rc)) 755 return rc; 756 #else /* !VBOX_SERIAL_PCI */ 757 s->base = io_base; 650 758 rc = pDevIns->pDevHlp->pfnIOPortRegister ( 651 759 pDevIns, … … 661 769 return rc; 662 770 } 771 #endif /* !VBOX_SERIAL_PCI */ 663 772 664 773 rc = pDevIns->pDevHlp->pfnSSMRegister ( … … 666 775 pDevIns->pDevReg->szDeviceName, /* pszName */ 667 776 iInstance, /* u32Instance */ 668 2 /* u32Version */,777 SERIAL_SAVED_STATE_VERSION, /* u32Version */ 669 778 sizeof (*s), /* cbGuess */ 670 779 NULL, /* pfnSavePrep */ 671 SaveExec,/* pfnSaveExec */780 serialSaveExec, /* pfnSaveExec */ 672 781 NULL, /* pfnSaveDone */ 673 782 NULL, /* pfnLoadPrep */ 674 LoadExec,/* pfnLoadExec */783 serialLoadExec, /* pfnLoadExec */ 675 784 NULL /* pfnLoadDone */ 676 785 ); … … 727 836 NULL 728 837 }; 729 #endif 838 #endif /* VBOX */
Note:
See TracChangeset
for help on using the changeset viewer.