This pull request contains the following changes for UML:
- Various cleanups and fixes: xterm, serial line, time travel - Set ARCH_HAS_GCOV_PROFILE_ALL -----BEGIN PGP SIGNATURE----- iQJKBAABCAA0FiEEdgfidid8lnn52cLTZvlZhesYu8EFAmKZz4UWHHJpY2hhcmRA c2lnbWEtc3Rhci5hdAAKCRBm+VmF6xi7wRrZD/951tWxCjNiSZYL8B32YnaxqJLf vwDwXWxYbXmtLgVhqTGCQ61qNFhKnGVeyfO2niacB5EB3VFzxtB2dXTswDpcu/93 o99/Dozisehcn9L3CbGO0sKCxKZbdgP4TQPOGQpr8lyzv9NlmNF/bgkiH8s8rIB/ ACaiKmLrAVIyQz/8VElFqJNyB/RkmcILks//jVidFlueZhmYMSzbfdVDFyTDDJMA JEmIz+SG2hg15yCy620EpWgskHvSQSNhWMv4wxJVy4XRdZ7nztb9babV3lIaRmaI 8rBR+DsLGlDeep3SOv63giFzjMjHpXcAlJ0UoefkaRA4htSP4GmyDPHX6Fo6ilW4 fQ52lxsHmP+6fLmWNOnFjsvk93z9u3XU55ReEhP1PGzgAGDNUczy8BEYvb6l0Weq M8BdYgU2nh/SA0ycmXdSVbyl7nFST5s0lHr6hEt22CMxJ+jz6WS650vrnH2JimMX bnJMcEYX6PeyDq4lTYyrWOCdzPTorT6eEcn/BM3qKgWkosK0FlN+nnT0HOef5Bag jezo4/dt/VPfftKQS28Waufud/nnJD2oFAvFBG0/YHTooTZMkSnH2LnRbYkFo7vS xkDRnHJGSDOaxzdSfgNlwveqZ/qTgjNs1CUYHBrs2Tj1dJicqro+wWjZg8qzCHI+ 8YgCQjaEOYLN6CN0CA== =hD4o -----END PGP SIGNATURE----- Merge tag 'for-linus-5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml Pull UML updates from Richard Weinberger: - Various cleanups and fixes: xterm, serial line, time travel - Set ARCH_HAS_GCOV_PROFILE_ALL * tag 'for-linus-5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml: um: Fix out-of-bounds read in LDT setup um: chan_user: Fix winch_tramp() return value um: virtio_uml: Fix broken device handling in time-travel um: line: Use separate IRQs per line um: Enable ARCH_HAS_GCOV_PROFILE_ALL um: Use asm-generic/dma-mapping.h um: daemon: Make default socket configurable um: xterm: Make default terminal emulator configurable
This commit is contained in:
Коммит
4e583ff9df
|
@ -6,6 +6,7 @@ config UML
|
|||
bool
|
||||
default y
|
||||
select ARCH_EPHEMERAL_INODES
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
select ARCH_HAS_KCOV
|
||||
select ARCH_HAS_STRNCPY_FROM_USER
|
||||
select ARCH_HAS_STRNLEN_USER
|
||||
|
|
|
@ -64,6 +64,13 @@ config XTERM_CHAN
|
|||
its own xterm.
|
||||
It is safe to say 'Y' here.
|
||||
|
||||
config XTERM_CHAN_DEFAULT_EMULATOR
|
||||
string "xterm channel default terminal emulator"
|
||||
depends on XTERM_CHAN
|
||||
default "xterm"
|
||||
help
|
||||
This option allows changing the default terminal emulator.
|
||||
|
||||
config NOCONFIG_CHAN
|
||||
bool
|
||||
default !(XTERM_CHAN && TTY_CHAN && PTY_CHAN && PORT_CHAN && NULL_CHAN)
|
||||
|
@ -231,6 +238,14 @@ config UML_NET_DAEMON
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config UML_NET_DAEMON_DEFAULT_SOCK
|
||||
string "Default socket for daemon transport"
|
||||
default "/tmp/uml.ctl"
|
||||
depends on UML_NET_DAEMON
|
||||
help
|
||||
This option allows setting the default socket for the daemon
|
||||
transport, normally it defaults to /tmp/uml.ctl.
|
||||
|
||||
config UML_NET_VECTOR
|
||||
bool "Vector I/O high performance network devices"
|
||||
depends on UML_NET
|
||||
|
|
|
@ -70,4 +70,6 @@ obj-$(CONFIG_UML_PCI_OVER_VIRTIO) += virt-pci.o
|
|||
USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o vde_user.o vector_user.o
|
||||
CFLAGS_null.o = -DDEV_NULL=$(DEV_NULL_PATH)
|
||||
|
||||
CFLAGS_xterm.o += '-DCONFIG_XTERM_CHAN_DEFAULT_EMULATOR="$(CONFIG_XTERM_CHAN_DEFAULT_EMULATOR)"'
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
|
|
|
@ -133,7 +133,7 @@ static void line_timer_cb(struct work_struct *work)
|
|||
struct line *line = container_of(work, struct line, task.work);
|
||||
|
||||
if (!line->throttled)
|
||||
chan_interrupt(line, line->driver->read_irq);
|
||||
chan_interrupt(line, line->read_irq);
|
||||
}
|
||||
|
||||
int enable_chan(struct line *line)
|
||||
|
@ -195,9 +195,9 @@ void free_irqs(void)
|
|||
chan = list_entry(ele, struct chan, free_list);
|
||||
|
||||
if (chan->input && chan->enabled)
|
||||
um_free_irq(chan->line->driver->read_irq, chan);
|
||||
um_free_irq(chan->line->read_irq, chan);
|
||||
if (chan->output && chan->enabled)
|
||||
um_free_irq(chan->line->driver->write_irq, chan);
|
||||
um_free_irq(chan->line->write_irq, chan);
|
||||
chan->enabled = 0;
|
||||
}
|
||||
}
|
||||
|
@ -215,9 +215,9 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
|
|||
spin_unlock_irqrestore(&irqs_to_free_lock, flags);
|
||||
} else {
|
||||
if (chan->input && chan->enabled)
|
||||
um_free_irq(chan->line->driver->read_irq, chan);
|
||||
um_free_irq(chan->line->read_irq, chan);
|
||||
if (chan->output && chan->enabled)
|
||||
um_free_irq(chan->line->driver->write_irq, chan);
|
||||
um_free_irq(chan->line->write_irq, chan);
|
||||
chan->enabled = 0;
|
||||
}
|
||||
if (chan->ops->close != NULL)
|
||||
|
|
|
@ -220,7 +220,7 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
|||
unsigned long *stack_out)
|
||||
{
|
||||
struct winch_data data;
|
||||
int fds[2], n, err;
|
||||
int fds[2], n, err, pid;
|
||||
char c;
|
||||
|
||||
err = os_pipe(fds, 1, 1);
|
||||
|
@ -238,8 +238,9 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
|||
* problem with /dev/net/tun, which if held open by this
|
||||
* thread, prevents the TUN/TAP device from being reused.
|
||||
*/
|
||||
err = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out);
|
||||
if (err < 0) {
|
||||
pid = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out);
|
||||
if (pid < 0) {
|
||||
err = pid;
|
||||
printk(UM_KERN_ERR "fork of winch_thread failed - errno = %d\n",
|
||||
-err);
|
||||
goto out_close;
|
||||
|
@ -263,7 +264,7 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
|||
goto out_close;
|
||||
}
|
||||
|
||||
return err;
|
||||
return pid;
|
||||
|
||||
out_close:
|
||||
close(fds[1]);
|
||||
|
|
|
@ -65,7 +65,7 @@ static int daemon_setup(char *str, char **mac_out, void *data)
|
|||
|
||||
*init = ((struct daemon_init)
|
||||
{ .sock_type = "unix",
|
||||
.ctl_sock = "/tmp/uml.ctl" });
|
||||
.ctl_sock = CONFIG_UML_NET_DAEMON_DEFAULT_SOCK });
|
||||
|
||||
remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock,
|
||||
NULL);
|
||||
|
|
|
@ -139,7 +139,7 @@ static int flush_buffer(struct line *line)
|
|||
count = line->buffer + LINE_BUFSIZE - line->head;
|
||||
|
||||
n = write_chan(line->chan_out, line->head, count,
|
||||
line->driver->write_irq);
|
||||
line->write_irq);
|
||||
if (n < 0)
|
||||
return n;
|
||||
if (n == count) {
|
||||
|
@ -156,7 +156,7 @@ static int flush_buffer(struct line *line)
|
|||
|
||||
count = line->tail - line->head;
|
||||
n = write_chan(line->chan_out, line->head, count,
|
||||
line->driver->write_irq);
|
||||
line->write_irq);
|
||||
|
||||
if (n < 0)
|
||||
return n;
|
||||
|
@ -195,7 +195,7 @@ int line_write(struct tty_struct *tty, const unsigned char *buf, int len)
|
|||
ret = buffer_data(line, buf, len);
|
||||
else {
|
||||
n = write_chan(line->chan_out, buf, len,
|
||||
line->driver->write_irq);
|
||||
line->write_irq);
|
||||
if (n < 0) {
|
||||
ret = n;
|
||||
goto out_up;
|
||||
|
@ -215,7 +215,7 @@ void line_throttle(struct tty_struct *tty)
|
|||
{
|
||||
struct line *line = tty->driver_data;
|
||||
|
||||
deactivate_chan(line->chan_in, line->driver->read_irq);
|
||||
deactivate_chan(line->chan_in, line->read_irq);
|
||||
line->throttled = 1;
|
||||
}
|
||||
|
||||
|
@ -224,7 +224,7 @@ void line_unthrottle(struct tty_struct *tty)
|
|||
struct line *line = tty->driver_data;
|
||||
|
||||
line->throttled = 0;
|
||||
chan_interrupt(line, line->driver->read_irq);
|
||||
chan_interrupt(line, line->read_irq);
|
||||
}
|
||||
|
||||
static irqreturn_t line_write_interrupt(int irq, void *data)
|
||||
|
@ -260,19 +260,23 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
|
|||
int err;
|
||||
|
||||
if (input) {
|
||||
err = um_request_irq(driver->read_irq, fd, IRQ_READ,
|
||||
line_interrupt, IRQF_SHARED,
|
||||
err = um_request_irq(UM_IRQ_ALLOC, fd, IRQ_READ,
|
||||
line_interrupt, 0,
|
||||
driver->read_irq_name, data);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
line->read_irq = err;
|
||||
}
|
||||
|
||||
if (output) {
|
||||
err = um_request_irq(driver->write_irq, fd, IRQ_WRITE,
|
||||
line_write_interrupt, IRQF_SHARED,
|
||||
err = um_request_irq(UM_IRQ_ALLOC, fd, IRQ_WRITE,
|
||||
line_write_interrupt, 0,
|
||||
driver->write_irq_name, data);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
line->write_irq = err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -23,9 +23,7 @@ struct line_driver {
|
|||
const short minor_start;
|
||||
const short type;
|
||||
const short subtype;
|
||||
const int read_irq;
|
||||
const char *read_irq_name;
|
||||
const int write_irq;
|
||||
const char *write_irq_name;
|
||||
struct mc_device mc;
|
||||
struct tty_driver *driver;
|
||||
|
@ -35,6 +33,8 @@ struct line {
|
|||
struct tty_port port;
|
||||
int valid;
|
||||
|
||||
int read_irq, write_irq;
|
||||
|
||||
char *init_str;
|
||||
struct list_head chan_list;
|
||||
struct chan *chan_in, *chan_out;
|
||||
|
|
|
@ -47,9 +47,7 @@ static struct line_driver driver = {
|
|||
.minor_start = 64,
|
||||
.type = TTY_DRIVER_TYPE_SERIAL,
|
||||
.subtype = 0,
|
||||
.read_irq = SSL_IRQ,
|
||||
.read_irq_name = "ssl",
|
||||
.write_irq = SSL_WRITE_IRQ,
|
||||
.write_irq_name = "ssl-write",
|
||||
.mc = {
|
||||
.list = LIST_HEAD_INIT(driver.mc.list),
|
||||
|
|
|
@ -53,9 +53,7 @@ static struct line_driver driver = {
|
|||
.minor_start = 0,
|
||||
.type = TTY_DRIVER_TYPE_CONSOLE,
|
||||
.subtype = SYSTEM_TYPE_CONSOLE,
|
||||
.read_irq = CONSOLE_IRQ,
|
||||
.read_irq_name = "console",
|
||||
.write_irq = CONSOLE_WRITE_IRQ,
|
||||
.write_irq_name = "console-write",
|
||||
.mc = {
|
||||
.list = LIST_HEAD_INIT(driver.mc.list),
|
||||
|
|
|
@ -63,6 +63,7 @@ struct virtio_uml_device {
|
|||
|
||||
u8 config_changed_irq:1;
|
||||
uint64_t vq_irq_vq_map;
|
||||
int recv_rc;
|
||||
};
|
||||
|
||||
struct virtio_uml_vq_info {
|
||||
|
@ -148,14 +149,6 @@ static int vhost_user_recv(struct virtio_uml_device *vu_dev,
|
|||
|
||||
rc = vhost_user_recv_header(fd, msg);
|
||||
|
||||
if (rc == -ECONNRESET && vu_dev->registered) {
|
||||
struct virtio_uml_platform_data *pdata;
|
||||
|
||||
pdata = vu_dev->pdata;
|
||||
|
||||
virtio_break_device(&vu_dev->vdev);
|
||||
schedule_work(&pdata->conn_broken_wk);
|
||||
}
|
||||
if (rc)
|
||||
return rc;
|
||||
size = msg->header.size;
|
||||
|
@ -164,6 +157,21 @@ static int vhost_user_recv(struct virtio_uml_device *vu_dev,
|
|||
return full_read(fd, &msg->payload, size, false);
|
||||
}
|
||||
|
||||
static void vhost_user_check_reset(struct virtio_uml_device *vu_dev,
|
||||
int rc)
|
||||
{
|
||||
struct virtio_uml_platform_data *pdata = vu_dev->pdata;
|
||||
|
||||
if (rc != -ECONNRESET)
|
||||
return;
|
||||
|
||||
if (!vu_dev->registered)
|
||||
return;
|
||||
|
||||
virtio_break_device(&vu_dev->vdev);
|
||||
schedule_work(&pdata->conn_broken_wk);
|
||||
}
|
||||
|
||||
static int vhost_user_recv_resp(struct virtio_uml_device *vu_dev,
|
||||
struct vhost_user_msg *msg,
|
||||
size_t max_payload_size)
|
||||
|
@ -171,8 +179,10 @@ static int vhost_user_recv_resp(struct virtio_uml_device *vu_dev,
|
|||
int rc = vhost_user_recv(vu_dev, vu_dev->sock, msg,
|
||||
max_payload_size, true);
|
||||
|
||||
if (rc)
|
||||
if (rc) {
|
||||
vhost_user_check_reset(vu_dev, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (msg->header.flags != (VHOST_USER_FLAG_REPLY | VHOST_USER_VERSION))
|
||||
return -EPROTO;
|
||||
|
@ -369,6 +379,7 @@ static irqreturn_t vu_req_read_message(struct virtio_uml_device *vu_dev,
|
|||
sizeof(msg.msg.payload) +
|
||||
sizeof(msg.extra_payload));
|
||||
|
||||
vu_dev->recv_rc = rc;
|
||||
if (rc)
|
||||
return IRQ_NONE;
|
||||
|
||||
|
@ -412,7 +423,9 @@ static irqreturn_t vu_req_interrupt(int irq, void *data)
|
|||
if (!um_irq_timetravel_handler_used())
|
||||
ret = vu_req_read_message(vu_dev, NULL);
|
||||
|
||||
if (vu_dev->vq_irq_vq_map) {
|
||||
if (vu_dev->recv_rc) {
|
||||
vhost_user_check_reset(vu_dev, vu_dev->recv_rc);
|
||||
} else if (vu_dev->vq_irq_vq_map) {
|
||||
struct virtqueue *vq;
|
||||
|
||||
virtio_device_for_each_vq((&vu_dev->vdev), vq) {
|
||||
|
|
|
@ -42,7 +42,7 @@ static void *xterm_init(char *str, int device, const struct chan_opts *opts)
|
|||
}
|
||||
|
||||
/* Only changed by xterm_setup, which is a setup */
|
||||
static char *terminal_emulator = "xterm";
|
||||
static char *terminal_emulator = CONFIG_XTERM_CHAN_DEFAULT_EMULATOR;
|
||||
static char *title_switch = "-T";
|
||||
static char *exec_switch = "-e";
|
||||
|
||||
|
@ -79,8 +79,9 @@ __uml_setup("xterm=", xterm_setup,
|
|||
" respectively. The title switch must have the form '<switch> title',\n"
|
||||
" not '<switch>=title'. Similarly, the exec switch must have the form\n"
|
||||
" '<switch> command arg1 arg2 ...'.\n"
|
||||
" The default values are 'xterm=xterm,-T,-e'. Values for gnome-terminal\n"
|
||||
" are 'xterm=gnome-terminal,-t,-x'.\n\n"
|
||||
" The default values are 'xterm=" CONFIG_XTERM_CHAN_DEFAULT_EMULATOR
|
||||
",-T,-e'.\n"
|
||||
" Values for gnome-terminal are 'xterm=gnome-terminal,-t,-x'.\n\n"
|
||||
);
|
||||
|
||||
static int xterm_open(int input, int output, int primary, void *d,
|
||||
|
|
|
@ -4,6 +4,7 @@ generic-y += bug.h
|
|||
generic-y += compat.h
|
||||
generic-y += current.h
|
||||
generic-y += device.h
|
||||
generic-y += dma-mapping.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += exec.h
|
||||
generic-y += extable.h
|
||||
|
|
|
@ -4,19 +4,15 @@
|
|||
|
||||
#define TIMER_IRQ 0
|
||||
#define UMN_IRQ 1
|
||||
#define CONSOLE_IRQ 2
|
||||
#define CONSOLE_WRITE_IRQ 3
|
||||
#define UBD_IRQ 4
|
||||
#define UM_ETH_IRQ 5
|
||||
#define SSL_IRQ 6
|
||||
#define SSL_WRITE_IRQ 7
|
||||
#define ACCEPT_IRQ 8
|
||||
#define MCONSOLE_IRQ 9
|
||||
#define WINCH_IRQ 10
|
||||
#define SIGIO_WRITE_IRQ 11
|
||||
#define TELNETD_IRQ 12
|
||||
#define XTERM_IRQ 13
|
||||
#define RANDOM_IRQ 14
|
||||
#define UBD_IRQ 2
|
||||
#define UM_ETH_IRQ 3
|
||||
#define ACCEPT_IRQ 4
|
||||
#define MCONSOLE_IRQ 5
|
||||
#define WINCH_IRQ 6
|
||||
#define SIGIO_WRITE_IRQ 7
|
||||
#define TELNETD_IRQ 8
|
||||
#define XTERM_IRQ 9
|
||||
#define RANDOM_IRQ 10
|
||||
|
||||
#ifdef CONFIG_UML_NET_VECTOR
|
||||
|
||||
|
|
|
@ -23,9 +23,11 @@ static long write_ldt_entry(struct mm_id *mm_idp, int func,
|
|||
{
|
||||
long res;
|
||||
void *stub_addr;
|
||||
|
||||
BUILD_BUG_ON(sizeof(*desc) % sizeof(long));
|
||||
|
||||
res = syscall_stub_data(mm_idp, (unsigned long *)desc,
|
||||
(sizeof(*desc) + sizeof(long) - 1) &
|
||||
~(sizeof(long) - 1),
|
||||
sizeof(*desc) / sizeof(long),
|
||||
addr, &stub_addr);
|
||||
if (!res) {
|
||||
unsigned long args[] = { func,
|
||||
|
|
Загрузка…
Ссылка в новой задаче