Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xing Lin
qemu
Commits
82c643ff
Commit
82c643ff
authored
Jul 14, 2004
by
bellard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
char device support
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@1023
c046a42c-6fe2-441c-8c8c-71466251a162
parent
457831f4
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
408 additions
and
76 deletions
+408
-76
hw/pc.c
hw/pc.c
+2
-3
hw/ppc_chrp.c
hw/ppc_chrp.c
+2
-3
hw/ppc_prep.c
hw/ppc_prep.c
+2
-3
hw/serial.c
hw/serial.c
+17
-24
vl.c
vl.c
+316
-31
vl.h
vl.h
+69
-12
No files found.
hw/pc.c
View file @
82c643ff
...
...
@@ -324,7 +324,7 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device,
const
char
*
initrd_filename
)
{
char
buf
[
1024
];
int
ret
,
linux_boot
,
initrd_size
,
i
,
nb_nics1
,
fd
;
int
ret
,
linux_boot
,
initrd_size
,
i
,
nb_nics1
;
unsigned
long
bios_offset
,
vga_bios_offset
;
int
bios_size
,
isa_bios_size
;
PCIBus
*
pci_bus
;
...
...
@@ -471,8 +471,7 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device,
pic_init
();
pit
=
pit_init
(
0x40
,
0
);
fd
=
serial_open_device
();
serial_init
(
0x3f8
,
4
,
fd
);
serial_init
(
0x3f8
,
4
,
serial_hd
);
if
(
pci_enabled
)
{
for
(
i
=
0
;
i
<
nb_nics
;
i
++
)
{
...
...
hw/ppc_chrp.c
View file @
82c643ff
...
...
@@ -126,7 +126,7 @@ void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
openpic_t
*
openpic
;
m48t59_t
*
nvram
;
int
PPC_io_memory
;
int
ret
,
linux_boot
,
i
,
fd
;
int
ret
,
linux_boot
,
i
;
unsigned
long
bios_offset
;
uint32_t
kernel_base
,
kernel_size
,
initrd_base
,
initrd_size
;
PCIBus
*
pci_bus
;
...
...
@@ -200,8 +200,7 @@ void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
pic_init
();
/* XXX: use Mac Serial port */
fd
=
serial_open_device
();
serial_init
(
0x3f8
,
4
,
fd
);
serial_init
(
0x3f8
,
4
,
serial_hd
);
for
(
i
=
0
;
i
<
nb_nics
;
i
++
)
{
pci_ne2000_init
(
pci_bus
,
&
nd_table
[
i
]);
...
...
hw/ppc_prep.c
View file @
82c643ff
...
...
@@ -415,7 +415,7 @@ void ppc_prep_init(int ram_size, int vga_ram_size, int boot_device,
char
buf
[
1024
];
m48t59_t
*
nvram
;
int
PPC_io_memory
;
int
ret
,
linux_boot
,
i
,
nb_nics1
,
fd
;
int
ret
,
linux_boot
,
i
,
nb_nics1
;
unsigned
long
bios_offset
;
uint32_t
kernel_base
,
kernel_size
,
initrd_base
,
initrd_size
;
PCIBus
*
pci_bus
;
...
...
@@ -492,8 +492,7 @@ void ppc_prep_init(int ram_size, int vga_ram_size, int boot_device,
pic_init
();
// pit = pit_init(0x40, 0);
fd
=
serial_open_device
();
serial_init
(
0x3f8
,
4
,
fd
);
serial_init
(
0x3f8
,
4
,
serial_hd
);
nb_nics1
=
nb_nics
;
if
(
nb_nics1
>
NE2000_NB_MAX
)
nb_nics1
=
NE2000_NB_MAX
;
...
...
hw/serial.c
View file @
82c643ff
...
...
@@ -84,7 +84,7 @@ struct SerialState {
it can be reset while reading iir */
int
thr_ipending
;
int
irq
;
int
out_fd
;
CharDriverState
*
chr
;
};
static
void
serial_update_irq
(
SerialState
*
s
)
...
...
@@ -107,7 +107,6 @@ static void serial_ioport_write(void *opaque, uint32_t addr, uint32_t val)
{
SerialState
*
s
=
opaque
;
unsigned
char
ch
;
int
ret
;
addr
&=
7
;
#ifdef DEBUG_SERIAL
...
...
@@ -122,13 +121,8 @@ static void serial_ioport_write(void *opaque, uint32_t addr, uint32_t val)
s
->
thr_ipending
=
0
;
s
->
lsr
&=
~
UART_LSR_THRE
;
serial_update_irq
(
s
);
if
(
s
->
out_fd
>=
0
)
{
ch
=
val
;
do
{
ret
=
write
(
s
->
out_fd
,
&
ch
,
1
);
}
while
(
ret
!=
1
);
}
ch
=
val
;
qemu_chr_write
(
s
->
chr
,
&
ch
,
1
);
s
->
thr_ipending
=
1
;
s
->
lsr
|=
UART_LSR_THRE
;
s
->
lsr
|=
UART_LSR_TEMT
;
...
...
@@ -223,19 +217,19 @@ static uint32_t serial_ioport_read(void *opaque, uint32_t addr)
return
ret
;
}
int
serial_can_receive
(
SerialState
*
s
)
static
int
serial_can_receive
(
SerialState
*
s
)
{
return
!
(
s
->
lsr
&
UART_LSR_DR
);
}
void
serial_receive_byte
(
SerialState
*
s
,
int
ch
)
static
void
serial_receive_byte
(
SerialState
*
s
,
int
ch
)
{
s
->
rbr
=
ch
;
s
->
lsr
|=
UART_LSR_DR
;
serial_update_irq
(
s
);
}
void
serial_receive_break
(
SerialState
*
s
)
static
void
serial_receive_break
(
SerialState
*
s
)
{
s
->
rbr
=
0
;
s
->
lsr
|=
UART_LSR_BI
|
UART_LSR_DR
;
...
...
@@ -254,8 +248,15 @@ static void serial_receive1(void *opaque, const uint8_t *buf, int size)
serial_receive_byte
(
s
,
buf
[
0
]);
}
static
void
serial_event
(
void
*
opaque
,
int
event
)
{
SerialState
*
s
=
opaque
;
if
(
event
==
CHR_EVENT_BREAK
)
serial_receive_break
(
s
);
}
/* If fd is zero, it means that the serial device uses the console */
SerialState
*
serial_init
(
int
base
,
int
irq
,
int
fd
)
SerialState
*
serial_init
(
int
base
,
int
irq
,
CharDriverState
*
chr
)
{
SerialState
*
s
;
...
...
@@ -268,16 +269,8 @@ SerialState *serial_init(int base, int irq, int fd)
register_ioport_write
(
base
,
8
,
1
,
serial_ioport_write
,
s
);
register_ioport_read
(
base
,
8
,
1
,
serial_ioport_read
,
s
);
if
(
fd
<
0
)
{
/* no associated device */
s
->
out_fd
=
-
1
;
}
else
if
(
fd
!=
0
)
{
qemu_add_fd_read_handler
(
fd
,
serial_can_receive1
,
serial_receive1
,
s
);
s
->
out_fd
=
fd
;
}
else
{
serial_console
=
s
;
s
->
out_fd
=
1
;
}
s
->
chr
=
chr
;
qemu_chr_add_read_handler
(
chr
,
serial_can_receive1
,
serial_receive1
,
s
);
qemu_chr_add_event_handler
(
chr
,
serial_event
);
return
s
;
}
vl.c
View file @
82c643ff
...
...
@@ -128,7 +128,6 @@ static char network_script[1024];
int
pit_min_timer_count
=
0
;
int
nb_nics
;
NetDriverState
nd_table
[
MAX_NICS
];
SerialState
*
serial_console
;
QEMUTimer
*
gui_timer
;
int
vm_running
;
int
audio_enabled
=
0
;
...
...
@@ -139,6 +138,7 @@ int cirrus_vga_enabled = 1;
int
graphic_width
=
800
;
int
graphic_height
=
600
;
int
graphic_depth
=
15
;
TextConsole
*
vga_console
;
/***********************************************************/
/* x86 ISA bus support */
...
...
@@ -298,6 +298,22 @@ char *pstrcat(char *buf, int buf_size, const char *s)
return
buf
;
}
int
strstart
(
const
char
*
str
,
const
char
*
val
,
const
char
**
ptr
)
{
const
char
*
p
,
*
q
;
p
=
str
;
q
=
val
;
while
(
*
q
!=
'\0'
)
{
if
(
*
p
!=
*
q
)
return
0
;
p
++
;
q
++
;
}
if
(
ptr
)
*
ptr
=
p
;
return
1
;
}
/* return the size or -1 if error */
int
get_image_size
(
const
char
*
filename
)
{
...
...
@@ -949,42 +965,273 @@ void quit_timers(void)
}
/***********************************************************/
/*
serial
device */
/*
character
device */
#ifdef _WIN32
int
qemu_chr_write
(
CharDriverState
*
s
,
const
uint8_t
*
buf
,
int
len
)
{
return
s
->
chr_write
(
s
,
buf
,
len
);
}
int
serial_open_device
(
void
)
void
qemu_chr_printf
(
CharDriverState
*
s
,
const
char
*
fmt
,
...
)
{
return
-
1
;
char
buf
[
4096
];
va_list
ap
;
va_start
(
ap
,
fmt
);
vsnprintf
(
buf
,
sizeof
(
buf
),
fmt
,
ap
);
qemu_chr_write
(
s
,
buf
,
strlen
(
buf
));
va_end
(
ap
);
}
#else
void
qemu_chr_add_read_handler
(
CharDriverState
*
s
,
IOCanRWHandler
*
fd_can_read
,
IOReadHandler
*
fd_read
,
void
*
opaque
)
{
s
->
chr_add_read_handler
(
s
,
fd_can_read
,
fd_read
,
opaque
);
}
void
qemu_chr_add_event_handler
(
CharDriverState
*
s
,
IOEventHandler
*
chr_event
)
{
s
->
chr_event
=
chr_event
;
}
int
serial_open_device
(
void
)
static
int
null_chr_write
(
CharDriverState
*
chr
,
const
uint8_t
*
buf
,
int
len
)
{
if
(
serial_console
==
NULL
&&
nographic
)
{
/* use console for serial port */
return
0
;
return
len
;
}
static
void
null_chr_add_read_handler
(
CharDriverState
*
chr
,
IOCanRWHandler
*
fd_can_read
,
IOReadHandler
*
fd_read
,
void
*
opaque
)
{
}
CharDriverState
*
qemu_chr_open_null
(
void
)
{
CharDriverState
*
chr
;
chr
=
qemu_mallocz
(
sizeof
(
CharDriverState
));
if
(
!
chr
)
return
NULL
;
chr
->
chr_write
=
null_chr_write
;
chr
->
chr_add_read_handler
=
null_chr_add_read_handler
;
return
chr
;
}
#ifndef _WIN32
typedef
struct
{
int
fd_in
,
fd_out
;
/* for nographic stdio only */
IOCanRWHandler
*
fd_can_read
;
IOReadHandler
*
fd_read
;
void
*
fd_opaque
;
}
FDCharDriver
;
#define STDIO_MAX_CLIENTS 2
static
int
stdio_nb_clients
;
static
CharDriverState
*
stdio_clients
[
STDIO_MAX_CLIENTS
];
static
int
fd_chr_write
(
CharDriverState
*
chr
,
const
uint8_t
*
buf
,
int
len
)
{
FDCharDriver
*
s
=
chr
->
opaque
;
return
write
(
s
->
fd_out
,
buf
,
len
);
}
static
void
fd_chr_add_read_handler
(
CharDriverState
*
chr
,
IOCanRWHandler
*
fd_can_read
,
IOReadHandler
*
fd_read
,
void
*
opaque
)
{
FDCharDriver
*
s
=
chr
->
opaque
;
if
(
nographic
&&
s
->
fd_in
==
0
)
{
s
->
fd_can_read
=
fd_can_read
;
s
->
fd_read
=
fd_read
;
s
->
fd_opaque
=
opaque
;
}
else
{
#if 0
char slave_name[1024];
int master_fd, slave_fd;
/* Not satisfying */
if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
fprintf(stderr, "warning: could not create pseudo terminal for serial port\n");
return -1;
qemu_add_fd_read_handler
(
s
->
fd_in
,
fd_can_read
,
fd_read
,
opaque
);
}
}
/* open a character device to a unix fd */
CharDriverState
*
qemu_chr_open_fd
(
int
fd_in
,
int
fd_out
)
{
CharDriverState
*
chr
;
FDCharDriver
*
s
;
chr
=
qemu_mallocz
(
sizeof
(
CharDriverState
));
if
(
!
chr
)
return
NULL
;
s
=
qemu_mallocz
(
sizeof
(
FDCharDriver
));
if
(
!
s
)
{
free
(
chr
);
return
NULL
;
}
s
->
fd_in
=
fd_in
;
s
->
fd_out
=
fd_out
;
chr
->
opaque
=
s
;
chr
->
chr_write
=
fd_chr_write
;
chr
->
chr_add_read_handler
=
fd_chr_add_read_handler
;
return
chr
;
}
/* for STDIO, we handle the case where several clients use it
(nographic mode) */
#define TERM_ESCAPE 0x01
/* ctrl-a is used for escape */
static
int
term_got_escape
,
client_index
;
void
term_print_help
(
void
)
{
printf
(
"
\n
"
"C-a h print this help
\n
"
"C-a x exit emulator
\n
"
"C-a s save disk data back to file (if -snapshot)
\n
"
"C-a b send break (magic sysrq)
\n
"
"C-a c switch between console and monitor
\n
"
"C-a C-a send C-a
\n
"
);
}
/* called when a char is received */
static
void
stdio_received_byte
(
int
ch
)
{
if
(
term_got_escape
)
{
term_got_escape
=
0
;
switch
(
ch
)
{
case
'h'
:
term_print_help
();
break
;
case
'x'
:
exit
(
0
);
break
;
case
's'
:
{
int
i
;
for
(
i
=
0
;
i
<
MAX_DISKS
;
i
++
)
{
if
(
bs_table
[
i
])
bdrv_commit
(
bs_table
[
i
]);
}
}
break
;
case
'b'
:
if
(
client_index
<
stdio_nb_clients
)
{
CharDriverState
*
chr
;
FDCharDriver
*
s
;
chr
=
stdio_clients
[
client_index
];
s
=
chr
->
opaque
;
chr
->
chr_event
(
s
->
fd_opaque
,
CHR_EVENT_BREAK
);
}
break
;
case
'c'
:
client_index
++
;
if
(
client_index
>=
stdio_nb_clients
)
client_index
=
0
;
if
(
client_index
==
0
)
{
/* send a new line in the monitor to get the prompt */
ch
=
'\r'
;
goto
send_char
;
}
break
;
case
TERM_ESCAPE
:
goto
send_char
;
}
}
else
if
(
ch
==
TERM_ESCAPE
)
{
term_got_escape
=
1
;
}
else
{
send_char:
if
(
client_index
<
stdio_nb_clients
)
{
uint8_t
buf
[
1
];
CharDriverState
*
chr
;
FDCharDriver
*
s
;
chr
=
stdio_clients
[
client_index
];
s
=
chr
->
opaque
;
buf
[
0
]
=
ch
;
/* XXX: should queue the char if the device is not
ready */
if
(
s
->
fd_can_read
(
s
->
fd_opaque
)
>
0
)
s
->
fd_read
(
s
->
fd_opaque
,
buf
,
1
);
}
fprintf(stderr, "Serial port redirected to %s\n", slave_name);
return master_fd;
#else
return
-
1
;
#endif
}
}
static
int
stdio_can_read
(
void
*
opaque
)
{
/* XXX: not strictly correct */
return
1
;
}
static
void
stdio_read
(
void
*
opaque
,
const
uint8_t
*
buf
,
int
size
)
{
int
i
;
for
(
i
=
0
;
i
<
size
;
i
++
)
stdio_received_byte
(
buf
[
i
]);
}
CharDriverState
*
qemu_chr_open_stdio
(
void
)
{
CharDriverState
*
chr
;
if
(
nographic
)
{
if
(
stdio_nb_clients
>=
STDIO_MAX_CLIENTS
)
return
NULL
;
chr
=
qemu_chr_open_fd
(
0
,
1
);
if
(
stdio_nb_clients
==
0
)
qemu_add_fd_read_handler
(
0
,
stdio_can_read
,
stdio_read
,
NULL
);
client_index
=
stdio_nb_clients
;
}
else
{
if
(
stdio_nb_clients
!=
0
)
return
NULL
;
chr
=
qemu_chr_open_fd
(
0
,
1
);
}
stdio_clients
[
stdio_nb_clients
++
]
=
chr
;
return
chr
;
}
#if defined(__linux__)
CharDriverState
*
qemu_chr_open_pty
(
void
)
{
char
slave_name
[
1024
];
int
master_fd
,
slave_fd
;
/* Not satisfying */
if
(
openpty
(
&
master_fd
,
&
slave_fd
,
slave_name
,
NULL
,
NULL
)
<
0
)
{
return
NULL
;
}
fprintf
(
stderr
,
"char device redirected to %s
\n
"
,
slave_name
);
return
qemu_chr_open_fd
(
master_fd
,
master_fd
);
}
#else
CharDriverState
*
qemu_chr_open_pty
(
void
)
{
return
NULL
;
}
#endif
#endif
/* !defined(_WIN32) */
CharDriverState
*
qemu_chr_open
(
const
char
*
filename
)
{
if
(
!
strcmp
(
filename
,
"vc"
))
{
return
text_console_init
(
&
display_state
);
}
else
if
(
!
strcmp
(
filename
,
"null"
))
{
return
qemu_chr_open_null
();
}
else
#ifndef _WIN32
if
(
!
strcmp
(
filename
,
"pty"
))
{
return
qemu_chr_open_pty
();
}
else
if
(
!
strcmp
(
filename
,
"stdio"
))
{
return
qemu_chr_open_stdio
();
}
else
#endif
{
return
NULL
;
}
}
/***********************************************************/
/* Linux network device redirectors */
...
...
@@ -2106,6 +2353,8 @@ void help(void)
"-initrd file use 'file' as initial ram disk
\n
"
"
\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
"
"-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
"
...
...
@@ -2121,7 +2370,13 @@ void help(void)
" (default is CL-GD5446 PCI VGA)
\n
"
#endif
"
\n
"
"During emulation, use C-a h to get terminal commands:
\n
"
,
"During emulation, the following keys are useful:
\n
"
"ctrl-shift-f toggle full screen
\n
"
"ctrl-shift-Fn switch to virtual console 'n'
\n
"
"ctrl-shift toggle mouse and keyboard grab
\n
"
"
\n
"
"When using -nographic, press 'ctrl-a h' to get some help.
\n
"
,
#ifdef CONFIG_SOFTMMU
"qemu"
,
#else
...
...
@@ -2131,7 +2386,6 @@ void help(void)
DEFAULT_NETWORK_SCRIPT
,
DEFAULT_GDBSTUB_PORT
,
"/tmp/qemu.log"
);
term_print_help
();
#ifndef CONFIG_SOFTMMU
printf
(
"
\n
"
"NOTE: this version of QEMU is faster but it needs slightly patched OSes to
\n
"
...
...
@@ -2184,6 +2438,8 @@ enum {
QEMU_OPTION_cirrusvga
,
QEMU_OPTION_g
,
QEMU_OPTION_std_vga
,
QEMU_OPTION_monitor
,
QEMU_OPTION_serial
,
};
typedef
struct
QEMUOption
{
...
...
@@ -2235,7 +2491,9 @@ const QEMUOption qemu_options[] = {
{
"localtime"
,
0
,
QEMU_OPTION_localtime
},
{
"isa"
,
0
,
QEMU_OPTION_isa
},
{
"std-vga"
,
0
,
QEMU_OPTION_std_vga
},
{
"monitor"
,
1
,
QEMU_OPTION_monitor
},
{
"serial"
,
1
,
QEMU_OPTION_serial
},
/* temporary options */
{
"pci"
,
0
,
QEMU_OPTION_pci
},
{
"cirrusvga"
,
0
,
QEMU_OPTION_cirrusvga
},
...
...
@@ -2273,6 +2531,9 @@ int main(int argc, char **argv)
int
net_if_type
,
nb_tun_fds
,
tun_fds
[
MAX_NICS
];
int
optind
;
const
char
*
r
,
*
optarg
;
CharDriverState
*
monitor_hd
;
char
monitor_device
[
128
];
char
serial_device
[
128
];
#if !defined(CONFIG_SOFTMMU)
/* we never want that malloc() uses mmap() */
...
...
@@ -2297,6 +2558,8 @@ int main(int argc, char **argv)
kernel_cmdline
=
""
;
has_cdrom
=
1
;
cyls
=
heads
=
secs
=
0
;
pstrcpy
(
monitor_device
,
sizeof
(
monitor_device
),
"vc"
);
pstrcpy
(
serial_device
,
sizeof
(
serial_device
),
"vc"
);
nb_tun_fds
=
0
;
net_if_type
=
-
1
;
...
...
@@ -2308,7 +2571,7 @@ int main(int argc, char **argv)
macaddr
[
3
]
=
0x12
;
macaddr
[
4
]
=
0x34
;
macaddr
[
5
]
=
0x56
;
optind
=
1
;
for
(;;)
{
if
(
optind
>=
argc
)
...
...
@@ -2375,6 +2638,8 @@ int main(int argc, char **argv)
}
break
;
case
QEMU_OPTION_nographic
:
pstrcpy
(
monitor_device
,
sizeof
(
monitor_device
),
"stdio"
);
pstrcpy
(
serial_device
,
sizeof
(
serial_device
),
"stdio"
);
nographic
=
1
;
break
;
case
QEMU_OPTION_kernel
:
...
...
@@ -2561,6 +2826,12 @@ int main(int argc, char **argv)
graphic_depth
=
depth
;
}
break
;
case
QEMU_OPTION_monitor
:
pstrcpy
(
monitor_device
,
sizeof
(
monitor_device
),
optarg
);
break
;
case
QEMU_OPTION_serial
:
pstrcpy
(
serial_device
,
sizeof
(
serial_device
),
optarg
);
break
;
}
}
}
...
...
@@ -2750,6 +3021,24 @@ int main(int argc, char **argv)
#endif
}
vga_console
=
graphic_console_init
(
ds
);
monitor_hd
=
qemu_chr_open
(
monitor_device
);
if
(
!
monitor_hd
)
{
fprintf
(
stderr
,
"qemu: could not open monitor device '%s'
\n
"
,
monitor_device
);
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
);
exit
(
1
);
}
if
(
!
strcmp
(
serial_device
,
"vc"
))
qemu_chr_printf
(
serial_hd
,
"serial0 console
\n
"
);
/* setup cpu signal handlers for MMU / self modifying code handling */
#if !defined(CONFIG_SOFTMMU)
...
...
@@ -2805,10 +3094,6 @@ int main(int argc, char **argv)
kernel_filename
,
kernel_cmdline
,
initrd_filename
);
#endif
/* launched after the device init so that it can display or not a
banner */
monitor_init
();
gui_timer
=
qemu_new_timer
(
rt_clock
,
gui_update
,
NULL
);
qemu_mod_timer
(
gui_timer
,
qemu_get_clock
(
rt_clock
));
...
...
vl.h
View file @
82c643ff
...
...
@@ -215,8 +215,7 @@ extern const char *bios_dir;
void
pstrcpy
(
char
*
buf
,
int
buf_size
,
const
char
*
str
);
char
*
pstrcat
(
char
*
buf
,
int
buf_size
,
const
char
*
s
);
int
serial_open_device
(
void
);
int
strstart
(
const
char
*
str
,
const
char
*
val
,
const
char
**
ptr
);
extern
int
vm_running
;
...
...
@@ -265,6 +264,31 @@ void qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque);
void
kbd_put_keycode
(
int
keycode
);
void
kbd_mouse_event
(
int
dx
,
int
dy
,
int
dz
,
int
buttons_state
);
/* keysym is a unicode code except for special keys (see QEMU_KEY_xxx
constants) */
#define QEMU_KEY_ESC1(c) ((c) | 0xe100)
#define QEMU_KEY_BACKSPACE 0x007f
#define QEMU_KEY_UP QEMU_KEY_ESC1('A')
#define QEMU_KEY_DOWN QEMU_KEY_ESC1('B')
#define QEMU_KEY_RIGHT QEMU_KEY_ESC1('C')
#define QEMU_KEY_LEFT QEMU_KEY_ESC1('D')
#define QEMU_KEY_HOME QEMU_KEY_ESC1(1)
#define QEMU_KEY_END QEMU_KEY_ESC1(4)
#define QEMU_KEY_PAGEUP QEMU_KEY_ESC1(5)
#define QEMU_KEY_PAGEDOWN QEMU_KEY_ESC1(6)
#define QEMU_KEY_DELETE QEMU_KEY_ESC1(3)