All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.