qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Fabrice Bellard <fabrice@bellard.org>
To: esrever_otua@pythonhacker.is-a-geek.net, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Serial port hacking -- Fix verified for Windows Guest (kindof ;)
Date: Mon, 23 Aug 2004 21:00:38 +0200	[thread overview]
Message-ID: <412A3ED6.2010503@bellard.org> (raw)
In-Reply-To: <1092971260.2811.145.camel@unixadmindazfc2.chh.co.nz>

OK for the idea of several serial ports, but for consistency I prefer to 
add several '-serial' options. I'll make an implementation soon.

Fabrice.

Darryl Dixon wrote:
>   Hi All,
> 
>     I concur with Nile and Hampa (thanks Hampa!) that Hampa's patch 
> works successfully for a Windows guest, however I will add the rider 
> that whatever the guest OS is expecting in the form of Hardware Flow 
> Control from the UART still does not work, but No Flow Control and 
> Software Flow Control (Xon/Xoff) DO both work now with this patch.  
> Hurray! :)   Unfortunately this means that the guest OS still can't 
> quite drive the Host's modem ;)  Ahh well :)
> 
>     I have rewritten my *original* patch to make it fit more nicely with 
> the other command line options that qemu provides and attach it below.  
> It adds the ability to add up to a possible 4 guest com ports at the 
> normal memory addresses and fairly standard IRQs (I have integrated the 
> changes with the ppc stuff for the first, builtin, com port, but because 
> I am unfamiliar with ppc hardware I didn't want to add the other three 
> extra ports until someone had verified that they'll be OK; if someone 
> can confirm that the three extra ports as defined for the pc will be OK 
> in the ppc machine I'll add them there, too.).  This patch cleans up the 
> command line options for serial devices also:
> -serial1 'dev'   <------ serial1 is always connected regardless, so this 
> option is only to redirect it if you want it to go somewhere other than 
> the vc
> -serial2 'dev' -serial3 'dev' -serial4 'dev'   <--- these options will 
> turn on the designated guest com port and connect it to char device 'dev'
> 
> 
> Enjoy,
> D
> 
> 
> 
> 
> 
> On Fri, 2004-08-20 at 05:15, Nile Geisinger wrote:
> 
>> /Thanks Hampa!
>>
>>I tested the patch with Darryl's patch, a Linux host and Linux guest, and the 
>>test programs that were posted earlier (with some slight modifications to 
>>poll for file events to prevent data loss). All tests passed perfectly.
>>
>>great work,
>>
>>Nile
>>
>>
>>
>>
>>_______________________________________________
>>Qemu-devel mailing list
>>Qemu-devel@nongnu.org/ 
>>/ http://lists.nongnu.org/mailman/listinfo/qemu-devel  <http://lists.nongnu.org/mailman/listinfo/qemu-devel>/
>>
> -- 
> Darryl Dixon < esrever_otua@pythonhacker.is-a-geek.net 
> <mailto:esrever_otua@pythonhacker.is-a-geek.net>>
> 
> 
> 
> ------------------------------------------------------------------------
> 
> diff -ru qemu-snapshot-2004-08-16_23/hw/pc.c qemu-snapshot-2004-08-16_23-testserial/hw/pc.c
> --- qemu-snapshot-2004-08-16_23/hw/pc.c	2004-07-15 05:28:12.000000000 +1200
> +++ qemu-snapshot-2004-08-16_23-testserial/hw/pc.c	2004-08-20 14:19:50.830140666 +1200
> @@ -471,7 +471,21 @@
>      pic_init();
>      pit = pit_init(0x40, 0);
>  
> -    serial_init(0x3f8, 4, serial_hd);
> +    /* register each com port:
> +     * the memory address are Well Defined but
> +     * the IRQs are a matter of preference and
> +     * general consensus
> +     */
> +    serial_init(0x3f8, 4, serial1_hd); /* serial1 is always on */
> +    if (init_serial2_device) {
> +        serial_init(0x2f8, 3, serial2_hd);
> +    }
> +    if (init_serial3_device) {
> +        serial_init(0x3e8, 5, serial3_hd);
> +    }
> +    if (init_serial4_device) {
> +        serial_init(0x2e8, 9, serial4_hd);
> +    }
>  
>      if (pci_enabled) {
>          for(i = 0; i < nb_nics; i++) {
> diff -ru qemu-snapshot-2004-08-16_23/hw/ppc_chrp.c qemu-snapshot-2004-08-16_23-testserial/hw/ppc_chrp.c
> --- qemu-snapshot-2004-08-16_23/hw/ppc_chrp.c	2004-07-15 05:28:13.000000000 +1200
> +++ qemu-snapshot-2004-08-16_23-testserial/hw/ppc_chrp.c	2004-08-20 14:50:41.827364816 +1200
> @@ -200,7 +200,7 @@
>      pic_init();
>  
>      /* XXX: use Mac Serial port */
> -    serial_init(0x3f8, 4, serial_hd);
> +    serial_init(0x3f8, 4, serial1_hd);
>  
>      for(i = 0; i < nb_nics; i++) {
>          pci_ne2000_init(pci_bus, &nd_table[i]);
> diff -ru qemu-snapshot-2004-08-16_23/hw/ppc_prep.c qemu-snapshot-2004-08-16_23-testserial/hw/ppc_prep.c
> --- qemu-snapshot-2004-08-16_23/hw/ppc_prep.c	2004-07-15 05:28:13.000000000 +1200
> +++ qemu-snapshot-2004-08-16_23-testserial/hw/ppc_prep.c	2004-08-20 14:49:47.155402748 +1200
> @@ -492,7 +492,7 @@
>      pic_init();
>      //    pit = pit_init(0x40, 0);
>  
> -    serial_init(0x3f8, 4, serial_hd);
> +    serial_init(0x3f8, 4, serial1_hd);
>      nb_nics1 = nb_nics;
>      if (nb_nics1 > NE2000_NB_MAX)
>          nb_nics1 = NE2000_NB_MAX;
> Only in qemu-snapshot-2004-08-16_23-testserial: qemu.1
> Only in qemu-snapshot-2004-08-16_23-testserial: qemu-doc.html
> Only in qemu-snapshot-2004-08-16_23-testserial: qemu-tech.html
> diff -ru qemu-snapshot-2004-08-16_23/vl.c qemu-snapshot-2004-08-16_23-testserial/vl.c
> --- qemu-snapshot-2004-08-16_23/vl.c	2004-08-04 10:09:30.000000000 +1200
> +++ qemu-snapshot-2004-08-16_23-testserial/vl.c	2004-08-20 14:56:17.390009809 +1200
> @@ -1222,8 +1222,17 @@
>          return qemu_chr_open_stdio();
>      } else 
>  #endif
> -    {
> +    if (!strcmp(filename, "NULL")) {
> +        /* Shouldn't ever end up in here */
>          return NULL;
> +    } else {
> +        int fdesc;
> +        fdesc = open(filename, O_RDWR);
> +        if (fdesc >= 0) {
> +            return qemu_chr_open_fd(fdesc, fdesc);
> +        } else {
> +            return NULL;
> +        }
>      }
>  }
>  
> @@ -2352,7 +2361,10 @@
>             "\n"
>             "Debug/Expert options:\n"
>             "-monitor dev    redirect the monitor to char device 'dev'\n"
> -           "-serial dev     redirect the serial port to char device 'dev'\n"
> +           "-serial1 dev     redirect the guest com1 port to char device 'dev'\n"
> +           "-serial2 dev     initialise and redirect the guest com2 port to char device 'dev'\n"
> +           "-serial3 dev     initialise and redirect the guest com3 port to char device 'dev'\n"
> +           "-serial4 dev     initialise and redirect the guest com4 port to char device 'dev'\n"
>             "-S              freeze CPU at startup (use 'c' to start execution)\n"
>             "-s              wait gdb connection to port %d\n"
>             "-p port         change gdb connection port\n"
> @@ -2437,7 +2449,10 @@
>      QEMU_OPTION_g,
>      QEMU_OPTION_std_vga,
>      QEMU_OPTION_monitor,
> -    QEMU_OPTION_serial,
> +    QEMU_OPTION_serial1,
> +    QEMU_OPTION_serial2,
> +    QEMU_OPTION_serial3,
> +    QEMU_OPTION_serial4,
>  };
>  
>  typedef struct QEMUOption {
> @@ -2490,7 +2505,10 @@
>      { "isa", 0, QEMU_OPTION_isa },
>      { "std-vga", 0, QEMU_OPTION_std_vga },
>      { "monitor", 1, QEMU_OPTION_monitor },
> -    { "serial", 1, QEMU_OPTION_serial },
> +    { "serial1", HAS_ARG, QEMU_OPTION_serial1 },
> +    { "serial2", HAS_ARG, QEMU_OPTION_serial2 },
> +    { "serial3", HAS_ARG, QEMU_OPTION_serial3 },
> +    { "serial4", HAS_ARG, QEMU_OPTION_serial4 },
>      
>      /* temporary options */
>      { "pci", 0, QEMU_OPTION_pci },
> @@ -2568,8 +2586,11 @@
>      const char *r, *optarg;
>      CharDriverState *monitor_hd;
>      char monitor_device[128];
> -    char serial_device[128];
> -
> +    char serial1_device[128];
> +    char serial2_device[128];
> +    char serial3_device[128];
> +    char serial4_device[128];
> + 
>  #if !defined(CONFIG_SOFTMMU)
>      /* we never want that malloc() uses mmap() */
>      mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
> @@ -2594,7 +2615,14 @@
>      has_cdrom = 1;
>      cyls = heads = secs = 0;
>      pstrcpy(monitor_device, sizeof(monitor_device), "vc");
> -    pstrcpy(serial_device, sizeof(serial_device), "vc");
> +    /* Because serial1 is on by default we initialise it to the vc */
> +    pstrcpy(serial1_device, sizeof(serial1_device), "vc");
> +    pstrcpy(serial2_device, sizeof(serial2_device), "NULL");
> +    pstrcpy(serial3_device, sizeof(serial3_device), "NULL");
> +    pstrcpy(serial4_device, sizeof(serial4_device), "NULL");
> +    init_serial2_device = 0;
> +    init_serial3_device = 0;
> +    init_serial4_device = 0;
>  
>      nb_tun_fds = 0;
>      net_if_type = -1;
> @@ -2674,7 +2702,7 @@
>                  break;
>              case QEMU_OPTION_nographic:
>                  pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
> -                pstrcpy(serial_device, sizeof(serial_device), "stdio");
> +                pstrcpy(serial1_device, sizeof(serial1_device), "stdio");
>                  nographic = 1;
>                  break;
>              case QEMU_OPTION_kernel:
> @@ -2864,8 +2892,20 @@
>              case QEMU_OPTION_monitor:
>                  pstrcpy(monitor_device, sizeof(monitor_device), optarg);
>                  break;
> -            case QEMU_OPTION_serial:
> -                pstrcpy(serial_device, sizeof(serial_device), optarg);
> +            case QEMU_OPTION_serial1:
> +                pstrcpy(serial1_device, sizeof(serial1_device), optarg);
> +                break;
> +            case QEMU_OPTION_serial2:
> +                pstrcpy(serial2_device, sizeof(serial2_device), optarg);
> +                init_serial2_device = 1;
> +                break;
> +            case QEMU_OPTION_serial3:
> +                pstrcpy(serial3_device, sizeof(serial3_device), optarg);
> +                init_serial3_device = 1;
> +                break;
> +            case QEMU_OPTION_serial4:
> +                pstrcpy(serial4_device, sizeof(serial4_device), optarg);
> +                init_serial4_device = 1;
>                  break;
>              }
>          }
> @@ -3065,15 +3105,41 @@
>          exit(1);
>      }
>      monitor_init(monitor_hd, !nographic);
> -
> -    serial_hd = qemu_chr_open(serial_device);
> -    if (!serial_hd) {
> -        fprintf(stderr, "qemu: could not open serial device '%s'\n", serial_device);
> +   
> +    /* Initialise all relevant serial ports */
> +    /* serial1 is always connected by default */
> +    serial1_hd = qemu_chr_open(serial1_device);
> +    if (!serial1_hd) {
> +        fprintf(stderr, "qemu: could not open serial1 device '%s'\n", serial1_device);
>          exit(1);
>      }
> -    if (!strcmp(serial_device, "vc"))
> -        qemu_chr_printf(serial_hd, "serial0 console\n");
> +    if (!strcmp(serial1_device, "vc"))
> +        qemu_chr_printf(serial1_hd, "serial1 console\n");
>      
> +    if (init_serial2_device) {
> +        serial2_hd = qemu_chr_open(serial2_device);
> +        if (!serial2_hd) {
> +            fprintf(stderr, "qemu: could not open serial2 device '%s'\n", serial2_device);
> +            exit(1);
> +        }
> +    }
> +
> +    if (init_serial3_device) {
> +        serial3_hd = qemu_chr_open(serial3_device);
> +        if (!serial3_hd) {
> +            fprintf(stderr, "qemu: could not open serial3 device '%s'\n", serial3_device);
> +            exit(1);
> +        }
> +    }
> +
> +    if (init_serial4_device) {
> +        serial4_hd = qemu_chr_open(serial4_device);
> +        if (!serial4_hd) {
> +            fprintf(stderr, "qemu: could not open serial4 device '%s'\n", serial4_device);
> +            exit(1);
> +        }
> +    }
> +
>  
>      /* setup cpu signal handlers for MMU / self modifying code handling */
>  #if !defined(CONFIG_SOFTMMU)
> diff -ru qemu-snapshot-2004-08-16_23/vl.h qemu-snapshot-2004-08-16_23-testserial/vl.h
> --- qemu-snapshot-2004-08-16_23/vl.h	2004-08-04 09:15:11.000000000 +1200
> +++ qemu-snapshot-2004-08-16_23-testserial/vl.h	2004-08-20 13:59:59.110132869 +1200
> @@ -200,7 +200,14 @@
>                                 IOReadHandler *fd_read, void *opaque);
>  void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event);
>                                 
> -CharDriverState *serial_hd;
> +CharDriverState *serial1_hd;
> +CharDriverState *serial2_hd;
> +CharDriverState *serial3_hd;
> +CharDriverState *serial4_hd;
> +int init_serial2_device;
> +int init_serial3_device;
> +int init_serial4_device;
> +
>  
>  /* consoles */
>  
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Qemu-devel mailing list
> Qemu-devel@nongnu.org
> http://lists.nongnu.org/mailman/listinfo/qemu-devel

      reply	other threads:[~2004-08-23 19:07 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-16  0:13 [Qemu-devel] Serial port hacking Darryl Dixon
2004-08-15 19:37 ` Nile Geisinger
2004-08-17  6:26 ` [Qemu-devel] Serial port hacking -- BUG? Darryl Dixon
2004-08-17  0:23   ` [Qemu-devel] Serial port -- OPPOSITE BUG == COMPLETE SOLUTION? Nile Geisinger
2004-08-17 14:00     ` Darryl Dixon
2004-08-19 20:47   ` [Qemu-devel] Serial port hacking -- BUG? Hampa Hug
2004-08-19 17:15     ` [Qemu-devel] Serial port hacking -- Fix verified on Linux Nile Geisinger
2004-08-20  3:07       ` [Qemu-devel] Serial port hacking -- Fix verified for Windows Guest (kindof ;) Darryl Dixon
2004-08-23 19:00         ` Fabrice Bellard [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=412A3ED6.2010503@bellard.org \
    --to=fabrice@bellard.org \
    --cc=esrever_otua@pythonhacker.is-a-geek.net \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).