1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
peripherals: 0.896
virtual: 0.882
device: 0.878
user-level: 0.875
socket: 0.863
performance: 0.854
arm: 0.853
files: 0.849
permissions: 0.817
architecture: 0.808
ppc: 0.801
graphic: 0.778
boot: 0.742
PID: 0.705
network: 0.691
kernel: 0.690
debug: 0.688
vnc: 0.674
mistranslation: 0.665
hypervisor: 0.636
x86: 0.604
VMM: 0.564
KVM: 0.519
semantic: 0.508
risc-v: 0.493
register: 0.444
TCG: 0.372
assembly: 0.368
i386: 0.231
QEMU Windows COM port filenames not recognized i.e. \\.\COM19 or \\.\CNCA0
Steps to reproduce:
1. Run qemu-system-arm with the comand line above.
2. QEMU fails with `qemu-system-arm.exe: -gdb \\.\CNCA8: '\\.\CNCA8' is not a valid char driver`
3. ```qemu-system-arm.exe -machine mps2-an500 -gdb \\.\COM19
qemu-system-arm.exe: -gdb \\.\COM19: '\\.\COM19' is not a valid char driver
```
Additional information:
Windows allows COM ports numbered 10 and higher to be prefixed with a `\\.\` escape as in `\\.\COM17`. Such COM port assignments are not uncommon when a plurality of USB serial adapters.
Equally problematic are virtual COM port designations such as `\\.\CNCA8` created by the Windows 10x64 driver package known as `com0com`: https://pete.akeo.ie/2011/07/com0com-signed-drivers.html
Upon checking the source pulled from the Github mirror an initial fix was to simply modify /chardev/char.c, but this appears insufficient. Sadly.
Please ask if more information is required. I am actively working on extending an existing QEMU machine emulation. A patch to fix this problem is below. Please comment if applicable.
Jerry.
```
diff --git a/chardev/char.c b/chardev/char.c
index 3c43fb1278..7a3f342c72 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -418,6 +418,13 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename,
qemu_opt_set(opts, "path", filename, &error_abort);
return opts;
}
+ // JME
+ if (strstart(filename, "\\\\.\\", NULL)) {
+ qemu_opt_set(opts, "backend", "serial", &error_abort);
+ qemu_opt_set(opts, "path", filename, &error_abort);
+ return opts;
+ }
+
if (strstart(filename, "file:", &p)) {
qemu_opt_set(opts, "backend", "file", &error_abort);
qemu_opt_set(opts, "path", p, &error_abort);
```
/label ~"kind::Bug"
|