Commit 983dfa4b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-5.2-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/rw/uml

Pull UML updates from Richard Weinberger:

 - Kconfig cleanups

 - Fix cpu_all_mask() usage

 - Various bug fixes

* tag 'for-linus-5.2-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/rw/uml:
  um: irq: don't set the chip for all irqs
  um: define set_pte_at() as a static inline function, not a macro
  um: remove uses of variable length arrays
  um: remove unused variable
  uml: fix a boot splat wrt use of cpu_all_mask
  um: Do not unlock mutex that is not hold.
  hostfs: fix mismatch between link_file definition and declaration
  arch: um: drivers: Kconfig: pedantic formatting
  arch: um: Kconfig: pedantic indention cleanups
  um: Revert to using stack for pt_regs in signal handling
parents 47782361 1987b1b8
...@@ -80,46 +80,46 @@ config LD_SCRIPT_DYN ...@@ -80,46 +80,46 @@ config LD_SCRIPT_DYN
bool bool
default y default y
depends on !LD_SCRIPT_STATIC depends on !LD_SCRIPT_STATIC
select MODULE_REL_CRCS if MODVERSIONS select MODULE_REL_CRCS if MODVERSIONS
config HOSTFS config HOSTFS
tristate "Host filesystem" tristate "Host filesystem"
help help
While the User-Mode Linux port uses its own root file system for While the User-Mode Linux port uses its own root file system for
booting and normal file access, this module lets the UML user booting and normal file access, this module lets the UML user
access files stored on the host. It does not require any access files stored on the host. It does not require any
network connection between the Host and UML. An example use of network connection between the Host and UML. An example use of
this might be: this might be:
mount none /tmp/fromhost -t hostfs -o /tmp/umlshare mount none /tmp/fromhost -t hostfs -o /tmp/umlshare
where /tmp/fromhost is an empty directory inside UML and where /tmp/fromhost is an empty directory inside UML and
/tmp/umlshare is a directory on the host with files the UML user /tmp/umlshare is a directory on the host with files the UML user
wishes to access. wishes to access.
For more information, see For more information, see
<http://user-mode-linux.sourceforge.net/hostfs.html>. <http://user-mode-linux.sourceforge.net/hostfs.html>.
If you'd like to be able to work with files stored on the host, If you'd like to be able to work with files stored on the host,
say Y or M here; otherwise say N. say Y or M here; otherwise say N.
config MCONSOLE config MCONSOLE
bool "Management console" bool "Management console"
depends on PROC_FS depends on PROC_FS
default y default y
help help
The user mode linux management console is a low-level interface to The user mode linux management console is a low-level interface to
the kernel, somewhat like the i386 SysRq interface. Since there is the kernel, somewhat like the i386 SysRq interface. Since there is
a full-blown operating system running under every user mode linux a full-blown operating system running under every user mode linux
instance, there is much greater flexibility possible than with the instance, there is much greater flexibility possible than with the
SysRq mechanism. SysRq mechanism.
If you answer 'Y' to this option, to use this feature, you need the If you answer 'Y' to this option, to use this feature, you need the
mconsole client (called uml_mconsole) which is present in CVS in mconsole client (called uml_mconsole) which is present in CVS in
2.4.5-9um and later (path /tools/mconsole), and is also in the 2.4.5-9um and later (path /tools/mconsole), and is also in the
distribution RPM package in 2.4.6 and later. distribution RPM package in 2.4.6 and later.
It is safe to say 'Y' here. It is safe to say 'Y' here.
config MAGIC_SYSRQ config MAGIC_SYSRQ
bool "Magic SysRq key" bool "Magic SysRq key"
...@@ -142,13 +142,17 @@ config MAGIC_SYSRQ ...@@ -142,13 +142,17 @@ config MAGIC_SYSRQ
config KERNEL_STACK_ORDER config KERNEL_STACK_ORDER
int "Kernel stack size order" int "Kernel stack size order"
default 1 if 64BIT default 2 if 64BIT
range 1 10 if 64BIT range 2 10 if 64BIT
default 0 if !64BIT default 1 if !64BIT
help help
This option determines the size of UML kernel stacks. They will This option determines the size of UML kernel stacks. They will
be 1 << order pages. The default is OK unless you're running Valgrind be 1 << order pages. The default is OK unless you're running Valgrind
on UML, in which case, set this to 3. on UML, in which case, set this to 3.
It is possible to reduce the stack to 1 for 64BIT and 0 for 32BIT on
older (pre-2017) CPUs. It is not recommended on newer CPUs due to the
increase in the size of the state which needs to be saved when handling
signals.
config MMAPPER config MMAPPER
tristate "iomem emulation driver" tristate "iomem emulation driver"
......
...@@ -11,58 +11,58 @@ config STDERR_CONSOLE ...@@ -11,58 +11,58 @@ config STDERR_CONSOLE
config SSL config SSL
bool "Virtual serial line" bool "Virtual serial line"
help help
The User-Mode Linux environment allows you to create virtual serial The User-Mode Linux environment allows you to create virtual serial
lines on the UML that are usually made to show up on the host as lines on the UML that are usually made to show up on the host as
ttys or ptys. ttys or ptys.
See <http://user-mode-linux.sourceforge.net/old/input.html> for more See <http://user-mode-linux.sourceforge.net/old/input.html> for more
information and command line examples of how to use this facility. information and command line examples of how to use this facility.
Unless you have a specific reason for disabling this, say Y. Unless you have a specific reason for disabling this, say Y.
config NULL_CHAN config NULL_CHAN
bool "null channel support" bool "null channel support"
help help
This option enables support for attaching UML consoles and serial This option enables support for attaching UML consoles and serial
lines to a device similar to /dev/null. Data written to it disappears lines to a device similar to /dev/null. Data written to it disappears
and there is never any data to be read. and there is never any data to be read.
config PORT_CHAN config PORT_CHAN
bool "port channel support" bool "port channel support"
help help
This option enables support for attaching UML consoles and serial This option enables support for attaching UML consoles and serial
lines to host portals. They may be accessed with 'telnet <host> lines to host portals. They may be accessed with 'telnet <host>
<port number>'. Any number of consoles and serial lines may be <port number>'. Any number of consoles and serial lines may be
attached to a single portal, although what UML device you get when attached to a single portal, although what UML device you get when
you telnet to that portal will be unpredictable. you telnet to that portal will be unpredictable.
It is safe to say 'Y' here. It is safe to say 'Y' here.
config PTY_CHAN config PTY_CHAN
bool "pty channel support" bool "pty channel support"
help help
This option enables support for attaching UML consoles and serial This option enables support for attaching UML consoles and serial
lines to host pseudo-terminals. Access to both traditional lines to host pseudo-terminals. Access to both traditional
pseudo-terminals (/dev/pty*) and pts pseudo-terminals are controlled pseudo-terminals (/dev/pty*) and pts pseudo-terminals are controlled
with this option. The assignment of UML devices to host devices with this option. The assignment of UML devices to host devices
will be announced in the kernel message log. will be announced in the kernel message log.
It is safe to say 'Y' here. It is safe to say 'Y' here.
config TTY_CHAN config TTY_CHAN
bool "tty channel support" bool "tty channel support"
help help
This option enables support for attaching UML consoles and serial This option enables support for attaching UML consoles and serial
lines to host terminals. Access to both virtual consoles lines to host terminals. Access to both virtual consoles
(/dev/tty*) and the slave side of pseudo-terminals (/dev/ttyp* and (/dev/tty*) and the slave side of pseudo-terminals (/dev/ttyp* and
/dev/pts/*) are controlled by this option. /dev/pts/*) are controlled by this option.
It is safe to say 'Y' here. It is safe to say 'Y' here.
config XTERM_CHAN config XTERM_CHAN
bool "xterm channel support" bool "xterm channel support"
help help
This option enables support for attaching UML consoles and serial This option enables support for attaching UML consoles and serial
lines to xterms. Each UML device so assigned will be brought up in lines to xterms. Each UML device so assigned will be brought up in
its own xterm. its own xterm.
It is safe to say 'Y' here. It is safe to say 'Y' here.
config NOCONFIG_CHAN config NOCONFIG_CHAN
bool bool
...@@ -72,43 +72,43 @@ config CON_ZERO_CHAN ...@@ -72,43 +72,43 @@ config CON_ZERO_CHAN
string "Default main console channel initialization" string "Default main console channel initialization"
default "fd:0,fd:1" default "fd:0,fd:1"
help help
This is the string describing the channel to which the main console This is the string describing the channel to which the main console
will be attached by default. This value can be overridden from the will be attached by default. This value can be overridden from the
command line. The default value is "fd:0,fd:1", which attaches the command line. The default value is "fd:0,fd:1", which attaches the
main console to stdin and stdout. main console to stdin and stdout.
It is safe to leave this unchanged. It is safe to leave this unchanged.
config CON_CHAN config CON_CHAN
string "Default console channel initialization" string "Default console channel initialization"
default "xterm" default "xterm"
help help
This is the string describing the channel to which all consoles This is the string describing the channel to which all consoles
except the main console will be attached by default. This value can except the main console will be attached by default. This value can
be overridden from the command line. The default value is "xterm", be overridden from the command line. The default value is "xterm",
which brings them up in xterms. which brings them up in xterms.
It is safe to leave this unchanged, although you may wish to change It is safe to leave this unchanged, although you may wish to change
this if you expect the UML that you build to be run in environments this if you expect the UML that you build to be run in environments
which don't have X or xterm available. which don't have X or xterm available.
config SSL_CHAN config SSL_CHAN
string "Default serial line channel initialization" string "Default serial line channel initialization"
default "pty" default "pty"
help help
This is the string describing the channel to which the serial lines This is the string describing the channel to which the serial lines
will be attached by default. This value can be overridden from the will be attached by default. This value can be overridden from the
command line. The default value is "pty", which attaches them to command line. The default value is "pty", which attaches them to
traditional pseudo-terminals. traditional pseudo-terminals.
It is safe to leave this unchanged, although you may wish to change It is safe to leave this unchanged, although you may wish to change
this if you expect the UML that you build to be run in environments this if you expect the UML that you build to be run in environments
which don't have a set of /dev/pty* devices. which don't have a set of /dev/pty* devices.
config UML_SOUND config UML_SOUND
tristate "Sound support" tristate "Sound support"
help help
This option enables UML sound support. If enabled, it will pull in This option enables UML sound support. If enabled, it will pull in
soundcore and the UML hostaudio relay, which acts as a intermediary soundcore and the UML hostaudio relay, which acts as a intermediary
between the host's dsp and mixer devices and the UML sound system. between the host's dsp and mixer devices and the UML sound system.
It is safe to say 'Y' here. It is safe to say 'Y' here.
config SOUND config SOUND
tristate tristate
...@@ -131,107 +131,107 @@ menu "UML Network Devices" ...@@ -131,107 +131,107 @@ menu "UML Network Devices"
config UML_NET config UML_NET
bool "Virtual network device" bool "Virtual network device"
help help
While the User-Mode port cannot directly talk to any physical While the User-Mode port cannot directly talk to any physical
hardware devices, this choice and the following transport options hardware devices, this choice and the following transport options
provide one or more virtual network devices through which the UML provide one or more virtual network devices through which the UML
kernels can talk to each other, the host, and with the host's help, kernels can talk to each other, the host, and with the host's help,
machines on the outside world. machines on the outside world.
For more information, including explanations of the networking and For more information, including explanations of the networking and
sample configurations, see sample configurations, see
<http://user-mode-linux.sourceforge.net/old/networking.html>. <http://user-mode-linux.sourceforge.net/old/networking.html>.
If you'd like to be able to enable networking in the User-Mode If you'd like to be able to enable networking in the User-Mode
linux environment, say Y; otherwise say N. Note that you must linux environment, say Y; otherwise say N. Note that you must
enable at least one of the following transport options to actually enable at least one of the following transport options to actually
make use of UML networking. make use of UML networking.
config UML_NET_ETHERTAP config UML_NET_ETHERTAP
bool "Ethertap transport" bool "Ethertap transport"
depends on UML_NET depends on UML_NET
help help
The Ethertap User-Mode Linux network transport allows a single The Ethertap User-Mode Linux network transport allows a single
running UML to exchange packets with its host over one of the running UML to exchange packets with its host over one of the
host's Ethertap devices, such as /dev/tap0. Additional running host's Ethertap devices, such as /dev/tap0. Additional running
UMLs can use additional Ethertap devices, one per running UML. UMLs can use additional Ethertap devices, one per running UML.
While the UML believes it's on a (multi-device, broadcast) virtual While the UML believes it's on a (multi-device, broadcast) virtual
Ethernet network, it's in fact communicating over a point-to-point Ethernet network, it's in fact communicating over a point-to-point
link with the host. link with the host.
To use this, your host kernel must have support for Ethertap To use this, your host kernel must have support for Ethertap
devices. Also, if your host kernel is 2.4.x, it must have devices. Also, if your host kernel is 2.4.x, it must have
CONFIG_NETLINK_DEV configured as Y or M. CONFIG_NETLINK_DEV configured as Y or M.
For more information, see For more information, see
<http://user-mode-linux.sourceforge.net/old/networking.html> That site <http://user-mode-linux.sourceforge.net/old/networking.html> That site
has examples of the UML command line to use to enable Ethertap has examples of the UML command line to use to enable Ethertap
networking. networking.
If you'd like to set up an IP network with the host and/or the If you'd like to set up an IP network with the host and/or the
outside world, say Y to this, the Daemon Transport and/or the outside world, say Y to this, the Daemon Transport and/or the
Slip Transport. You'll need at least one of them, but may choose Slip Transport. You'll need at least one of them, but may choose
more than one without conflict. If you don't need UML networking, more than one without conflict. If you don't need UML networking,
say N. say N.
config UML_NET_TUNTAP config UML_NET_TUNTAP
bool "TUN/TAP transport" bool "TUN/TAP transport"
depends on UML_NET depends on UML_NET
help help
The UML TUN/TAP network transport allows a UML instance to exchange The UML TUN/TAP network transport allows a UML instance to exchange
packets with the host over a TUN/TAP device. This option will only packets with the host over a TUN/TAP device. This option will only
work with a 2.4 host, unless you've applied the TUN/TAP patch to work with a 2.4 host, unless you've applied the TUN/TAP patch to
your 2.2 host kernel. your 2.2 host kernel.
To use this transport, your host kernel must have support for TUN/TAP To use this transport, your host kernel must have support for TUN/TAP
devices, either built-in or as a module. devices, either built-in or as a module.
config UML_NET_SLIP config UML_NET_SLIP
bool "SLIP transport" bool "SLIP transport"
depends on UML_NET depends on UML_NET
help help
The slip User-Mode Linux network transport allows a running UML to The slip User-Mode Linux network transport allows a running UML to
network with its host over a point-to-point link. Unlike Ethertap, network with its host over a point-to-point link. Unlike Ethertap,
which can carry any Ethernet frame (and hence even non-IP packets), which can carry any Ethernet frame (and hence even non-IP packets),
the slip transport can only carry IP packets. the slip transport can only carry IP packets.
To use this, your host must support slip devices. To use this, your host must support slip devices.
For more information, see For more information, see
<http://user-mode-linux.sourceforge.net/old/networking.html>. <http://user-mode-linux.sourceforge.net/old/networking.html>.
has examples of the UML command line to use to enable slip has examples of the UML command line to use to enable slip
networking, and details of a few quirks with it. networking, and details of a few quirks with it.
The Ethertap Transport is preferred over slip because of its The Ethertap Transport is preferred over slip because of its
limitations. If you prefer slip, however, say Y here. Otherwise limitations. If you prefer slip, however, say Y here. Otherwise
choose the Multicast transport (to network multiple UMLs on choose the Multicast transport (to network multiple UMLs on
multiple hosts), Ethertap (to network with the host and the multiple hosts), Ethertap (to network with the host and the
outside world), and/or the Daemon transport (to network multiple outside world), and/or the Daemon transport (to network multiple
UMLs on a single host). You may choose more than one without UMLs on a single host). You may choose more than one without
conflict. If you don't need UML networking, say N. conflict. If you don't need UML networking, say N.
config UML_NET_DAEMON config UML_NET_DAEMON
bool "Daemon transport" bool "Daemon transport"
depends on UML_NET depends on UML_NET
help help
This User-Mode Linux network transport allows one or more running This User-Mode Linux network transport allows one or more running
UMLs on a single host to communicate with each other, but not to UMLs on a single host to communicate with each other, but not to
the host. the host.
To use this form of networking, you'll need to run the UML To use this form of networking, you'll need to run the UML
networking daemon on the host. networking daemon on the host.
For more information, see For more information, see
<http://user-mode-linux.sourceforge.net/old/networking.html> That site <http://user-mode-linux.sourceforge.net/old/networking.html> That site
has examples of the UML command line to use to enable Daemon has examples of the UML command line to use to enable Daemon
networking. networking.
If you'd like to set up a network with other UMLs on a single host, If you'd like to set up a network with other UMLs on a single host,
say Y. If you need a network between UMLs on multiple physical say Y. If you need a network between UMLs on multiple physical
hosts, choose the Multicast Transport. To set up a network with hosts, choose the Multicast Transport. To set up a network with
the host and/or other IP machines, say Y to the Ethertap or Slip the host and/or other IP machines, say Y to the Ethertap or Slip
transports. You'll need at least one of them, but may choose transports. You'll need at least one of them, but may choose
more than one without conflict. If you don't need UML networking, more than one without conflict. If you don't need UML networking,
say N. say N.
config UML_NET_VECTOR config UML_NET_VECTOR
bool "Vector I/O high performance network devices" bool "Vector I/O high performance network devices"
...@@ -270,26 +270,26 @@ config UML_NET_MCAST ...@@ -270,26 +270,26 @@ config UML_NET_MCAST
bool "Multicast transport" bool "Multicast transport"
depends on UML_NET depends on UML_NET
help help
This Multicast User-Mode Linux network transport allows multiple This Multicast User-Mode Linux network transport allows multiple
UMLs (even ones running on different host machines!) to talk to UMLs (even ones running on different host machines!) to talk to
each other over a virtual ethernet network. However, it requires each other over a virtual ethernet network. However, it requires
at least one UML with one of the other transports to act as a at least one UML with one of the other transports to act as a
bridge if any of them need to be able to talk to their hosts or any bridge if any of them need to be able to talk to their hosts or any
other IP machines. other IP machines.
To use this, your host kernel(s) must support IP Multicasting. To use this, your host kernel(s) must support IP Multicasting.
For more information, see For more information, see
<http://user-mode-linux.sourceforge.net/old/networking.html> That site <http://user-mode-linux.sourceforge.net/old/networking.html> That site
has examples of the UML command line to use to enable Multicast has examples of the UML command line to use to enable Multicast
networking, and notes about the security of this approach. networking, and notes about the security of this approach.
If you need UMLs on multiple physical hosts to communicate as if If you need UMLs on multiple physical hosts to communicate as if
they shared an Ethernet network, say Y. If you need to communicate they shared an Ethernet network, say Y. If you need to communicate
with other IP machines, make sure you select one of the other with other IP machines, make sure you select one of the other
transports (possibly in addition to Multicast; they're not transports (possibly in addition to Multicast; they're not
exclusive). If you don't need to network UMLs say N to each of exclusive). If you don't need to network UMLs say N to each of
the transports. the transports.
config UML_NET_PCAP config UML_NET_PCAP
bool "pcap transport" bool "pcap transport"
...@@ -300,9 +300,9 @@ config UML_NET_PCAP ...@@ -300,9 +300,9 @@ config UML_NET_PCAP
UML act as a network monitor for the host. You must have libcap UML act as a network monitor for the host. You must have libcap
installed in order to build the pcap transport into UML. installed in order to build the pcap transport into UML.
For more information, see For more information, see
<http://user-mode-linux.sourceforge.net/old/networking.html> That site <http://user-mode-linux.sourceforge.net/old/networking.html> That site
has examples of the UML command line to use to enable this option. has examples of the UML command line to use to enable this option.
If you intend to use UML as a network monitor for the host, say If you intend to use UML as a network monitor for the host, say
Y here. Otherwise, say N. Y here. Otherwise, say N.
...@@ -311,27 +311,27 @@ config UML_NET_SLIRP ...@@ -311,27 +311,27 @@ config UML_NET_SLIRP
bool "SLiRP transport" bool "SLiRP transport"
depends on UML_NET depends on UML_NET
help help
The SLiRP User-Mode Linux network transport allows a running UML The SLiRP User-Mode Linux network transport allows a running UML
to network by invoking a program that can handle SLIP encapsulated to network by invoking a program that can handle SLIP encapsulated
packets. This is commonly (but not limited to) the application packets. This is commonly (but not limited to) the application
known as SLiRP, a program that can re-socket IP packets back onto known as SLiRP, a program that can re-socket IP packets back onto
the host on which it is run. Only IP packets are supported, he host on which it is run. Only IP packets are supported,
unlike other network transports that can handle all Ethernet unlike other network transports that can handle all Ethernet
frames. In general, slirp allows the UML the same IP connectivity frames. In general, slirp allows the UML the same IP connectivity
to the outside world that the host user is permitted, and unlike to the outside world that the host user is permitted, and unlike
other transports, SLiRP works without the need of root level other transports, SLiRP works without the need of root level
privleges, setuid binaries, or SLIP devices on the host. This privleges, setuid binaries, or SLIP devices on the host. This
also means not every type of connection is possible, but most also means not every type of connection is possible, but most
situations can be accommodated with carefully crafted slirp situations can be accommodated with carefully crafted slirp
commands that can be passed along as part of the network device's commands that can be passed along as part of the network device's
setup string. The effect of this transport on the UML is similar setup string. The effect of this transport on the UML is similar
that of a host behind a firewall that masquerades all network that of a host behind a firewall that masquerades all network
connections passing through it (but is less secure). connections passing through it (but is less secure).
To use this you should first have slirp compiled somewhere To use this you should first have slirp compiled somewhere
accessible on the host, and have read its documentation. If you accessible on the host, and have read its documentation. If you
don't need UML networking, say N. don't need UML networking, say N.
Startup example: "eth0=slirp,FE:FD:01:02:03:04,/usr/local/bin/slirp" Startup example: "eth0=slirp,FE:FD:01:02:03:04,/usr/local/bin/slirp"
endmenu endmenu
...@@ -276,14 +276,14 @@ static int ubd_setup_common(char *str, int *index_out, char **error_out) ...@@ -276,14 +276,14 @@ static int ubd_setup_common(char *str, int *index_out, char **error_out)
str++; str++;
if(!strcmp(str, "sync")){ if(!strcmp(str, "sync")){
global_openflags = of_sync(global_openflags); global_openflags = of_sync(global_openflags);
goto out1; return err;
} }
err = -EINVAL; err = -EINVAL;
major = simple_strtoul(str, &end, 0); major = simple_strtoul(str, &end, 0);
if((*end != '\0') || (end == str)){ if((*end != '\0') || (end == str)){
*error_out = "Didn't parse major number"; *error_out = "Didn't parse major number";
goto out1; return err;
} }
mutex_lock(&ubd_lock); mutex_lock(&ubd_lock);
......
...@@ -263,7 +263,12 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval) ...@@ -263,7 +263,12 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval)
*pteptr = pte_mknewpage(*pteptr); *pteptr = pte_mknewpage(*pteptr);
if(pte_present(*pteptr)) *pteptr = pte_mknewprot(*pteptr); if(pte_present(*pteptr)) *pteptr = pte_mknewprot(*pteptr);
} }
#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *pteptr, pte_t pteval)
{
set_pte(pteptr, pteval);
}
#define __HAVE_ARCH_PTE_SAME #define __HAVE_ARCH_PTE_SAME
static inline int pte_same(pte_t pte_a, pte_t pte_b) static inline int pte_same(pte_t pte_a, pte_t pte_b)
......
...@@ -479,7 +479,7 @@ void __init init_IRQ(void) ...@@ -479,7 +479,7 @@ void __init init_IRQ(void)
irq_set_chip_and_handler(TIMER_IRQ, &SIGVTALRM_irq_type, handle_edge_irq); irq_set_chip_and_handler(TIMER_IRQ, &SIGVTALRM_irq_type, handle_edge_irq);
for (i = 1; i < NR_IRQS; i++) for (i = 1; i < LAST_IRQ; i++)
irq_set_chip_and_handler(i, &normal_irq_type, handle_edge_irq); irq_set_chip_and_handler(i, &normal_irq_type, handle_edge_irq);
/* Initialize EPOLL Loop */ /* Initialize EPOLL Loop */
os_setup_epoll(); os_setup_epoll();
......
...@@ -59,7 +59,6 @@ static pte_t *maybe_map(unsigned long virt, int is_write) ...@@ -59,7 +59,6 @@ static pte_t *maybe_map(unsigned long virt, int is_write)
static int do_op_one_page(unsigned long addr, int len, int is_write, static int do_op_one_page(unsigned long addr, int len, int is_write,
int (*op)(unsigned long addr, int len, void *arg), void *arg) int (*op)(unsigned long addr, int len, void *arg), void *arg)
{ {
jmp_buf buf;
struct page *page; struct page *page;
pte_t *pte; pte_t *pte;
int n; int n;
......
...@@ -56,7 +56,7 @@ static int itimer_one_shot(struct clock_event_device *evt) ...@@ -56,7 +56,7 @@ static int itimer_one_shot(struct clock_event_device *evt)
static struct clock_event_device timer_clockevent = { static struct clock_event_device timer_clockevent = {
.name = "posix-timer", .name = "posix-timer",
.rating = 250, .rating = 250,
.cpumask = cpu_all_mask, .cpumask = cpu_possible_mask,
.features = CLOCK_EVT_FEAT_PERIODIC | .features = CLOCK_EVT_FEAT_PERIODIC |
CLOCK_EVT_FEAT_ONESHOT, CLOCK_EVT_FEAT_ONESHOT,
.set_state_shutdown = itimer_shutdown, .set_state_shutdown = itimer_shutdown,
......
...@@ -31,29 +31,23 @@ void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *) = { ...@@ -31,29 +31,23 @@ void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *) = {
static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc) static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc)
{ {
struct uml_pt_regs *r; struct uml_pt_regs r;
int save_errno = errno; int save_errno = errno;
r = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC); r.is_user = 0;
if (!r)
panic("out of memory");
r->is_user = 0;
if (sig == SIGSEGV) { if (sig == SIGSEGV) {
/* For segfaults, we want the data from the sigcontext. */ /* For segfaults, we want the data from the sigcontext. */
get_regs_from_mc(r, mc); get_regs_from_mc(&r, mc);
GET_FAULTINFO_FROM_MC(r->faultinfo, mc); GET_FAULTINFO_FROM_MC(r.faultinfo, mc);
} }
/* enable signals if sig isn't IRQ signal */ /* enable signals if sig isn't IRQ signal */
if ((sig != SIGIO) && (sig != SIGWINCH) && (sig != SIGALRM)) if ((sig != SIGIO) && (sig != SIGWINCH) && (sig != SIGALRM))
unblock_signals(); unblock_signals();
(*sig_info[sig])(sig, si, r); (*sig_info[sig])(sig, si, &r);
errno = save_errno; errno = save_errno;
free(r);
} }
/* /*
...@@ -91,17 +85,11 @@ void sig_handler(int sig, struct siginfo *si, mcontext_t *mc) ...@@ -91,17 +85,11 @@ void sig_handler(int sig, struct siginfo *si, mcontext_t *mc)
static void timer_real_alarm_handler(mcontext_t *mc) static void timer_real_alarm_handler(mcontext_t *mc)
{ {
struct uml_pt_regs *regs; struct uml_pt_regs regs;
regs = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC);
if (!regs)
panic("out of memory");
if (mc != NULL) if (mc != NULL)
get_regs_from_mc(regs, mc); get_regs_from_mc(&regs, mc);
timer_handler(SIGALRM, NULL, regs); timer_handler(SIGALRM, NULL, &regs);
free(regs);
} }
void timer_alarm_handler(int sig, struct siginfo *unused_si, mcontext_t *mc) void timer_alarm_handler(int sig, struct siginfo *unused_si, mcontext_t *mc)
......
...@@ -135,12 +135,18 @@ static int remove_files_and_dir(char *dir) ...@@ -135,12 +135,18 @@ static int remove_files_and_dir(char *dir)
*/ */
static inline int is_umdir_used(char *dir) static inline int is_umdir_used(char *dir)
{ {
char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; char pid[sizeof("nnnnn\0")], *end, *file;
char pid[sizeof("nnnnn\0")], *end;
int dead, fd, p, n, err; int dead, fd, p, n, err;
size_t filelen;
n = snprintf(file, sizeof(file), "%s/pid", dir); err = asprintf(&file, "%s/pid", dir);
if (n >= sizeof(file)) { if (err < 0)
return 0;
filelen = strlen(file);
n = snprintf(file, filelen, "%s/pid", dir);
if (n >= filelen) {
printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n"); printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n");
err = -E2BIG; err = -E2BIG;
goto out; goto out;
...@@ -185,6 +191,7 @@ static inline int is_umdir_used(char *dir) ...@@ -185,6 +191,7 @@ static inline int is_umdir_used(char *dir)
out_close: out_close:
close(fd); close(fd);
out: out:
free(file);
return 0; return 0;
} }
...@@ -210,18 +217,21 @@ static int umdir_take_if_dead(char *dir) ...@@ -210,18 +217,21 @@ static int umdir_take_if_dead(char *dir)
static void __init create_pid_file(void) static void __init create_pid_file(void)
{ {
char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; char pid[sizeof("nnnnn\0")], *file;
char pid[sizeof("nnnnn\0")];
int fd, n; int fd, n;
if (umid_file_name("pid", file, sizeof(file))) file = malloc(strlen(uml_dir) + UMID_LEN + sizeof("/pid\0"));
if (!file)
return; return;
if (umid_file_name("pid", file, sizeof(file)))
goto out;
fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644); fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644);
if (fd < 0) { if (fd < 0) {
printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: " printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: "
"%s\n", file, strerror(errno)); "%s\n", file, strerror(errno));
return; goto out;
} }
snprintf(pid, sizeof(pid), "%d\n", getpid()); snprintf(pid, sizeof(pid), "%d\n", getpid());
...@@ -231,6 +241,8 @@ static void __init create_pid_file(void) ...@@ -231,6 +241,8 @@ static void __init create_pid_file(void)
errno); errno);
close(fd); close(fd);
out:
free(file);
} }
int __init set_umid(char *name) int __init set_umid(char *name)
...@@ -385,13 +397,19 @@ __uml_setup("uml_dir=", set_uml_dir, ...@@ -385,13 +397,19 @@ __uml_setup("uml_dir=", set_uml_dir,
static void remove_umid_dir(void) static void remove_umid_dir(void)
{ {
char dir[strlen(uml_dir) + UMID_LEN + 1], err; char *dir, err;
dir = malloc(strlen(uml_dir) + UMID_LEN + 1);
if (!dir)
return;
sprintf(dir, "%s%s", uml_dir, umid); sprintf(dir, "%s%s", uml_dir, umid);
err = remove_files_and_dir(dir); err = remove_files_and_dir(dir);
if (err) if (err)
os_warn("%s - remove_files_and_dir failed with err = %d\n", os_warn("%s - remove_files_and_dir failed with err = %d\n",
__func__, err); __func__, err);
free(dir);
} }
__uml_exitcall(remove_umid_dir); __uml_exitcall(remove_umid_dir);
...@@ -87,7 +87,7 @@ extern int do_mkdir(const char *file, int mode); ...@@ -87,7 +87,7 @@ extern int do_mkdir(const char *file, int mode);
extern int hostfs_do_rmdir(const char *file); extern int hostfs_do_rmdir(const char *file);
extern int do_mknod(const char *file, int mode, unsigned int major, extern int do_mknod(const char *file, int mode, unsigned int major,
unsigned int minor); unsigned int minor);
extern int link_file(const char *from, const char *to); extern int link_file(const char *to, const char *from);
extern int hostfs_do_readlink(char *file, char *buf, int size); extern int hostfs_do_readlink(char *file, char *buf, int size);
extern int rename_file(char *from, char *to); extern int rename_file(char *from, char *to);
extern int rename2_file(char *from, char *to, unsigned int flags); extern int rename2_file(char *from, char *to, unsigned int flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment