Commit 366fdb90 authored by Jeff Dike's avatar Jeff Dike

Merge

parents d164a32a 454f835d
...@@ -164,7 +164,7 @@ $(ARCH_DIR)/os: ...@@ -164,7 +164,7 @@ $(ARCH_DIR)/os:
cd $(ARCH_DIR) && ln -sf os-$(OS) os cd $(ARCH_DIR) && ln -sf os-$(OS) os
$(ARCH_DIR)/include/uml-config.h : $(ARCH_DIR)/include/uml-config.h :
ln -sf $(TOPDIR)/include/linux/autoconf.h $@ sed 's/ CONFIG/ UML_CONFIG/' $(TOPDIR)/include/linux/autoconf.h > $@
$(ARCH_DIR)/include/task.h : $(ARCH_DIR)/util/mk_task $(ARCH_DIR)/include/task.h : $(ARCH_DIR)/util/mk_task
$< > $@ $< > $@
......
...@@ -75,15 +75,15 @@ static void not_configged_free(void *data) ...@@ -75,15 +75,15 @@ static void not_configged_free(void *data)
} }
static struct chan_ops not_configged_ops = { static struct chan_ops not_configged_ops = {
init: not_configged_init, .init = not_configged_init,
open: not_configged_open, .open = not_configged_open,
close: not_configged_close, .close = not_configged_close,
read: not_configged_read, .read = not_configged_read,
write: not_configged_write, .write = not_configged_write,
console_write: not_configged_console_write, .console_write = not_configged_console_write,
window_size: not_configged_window_size, .window_size = not_configged_window_size,
free: not_configged_free, .free = not_configged_free,
winch: 0, .winch = 0,
}; };
static void tty_receive_char(struct tty_struct *tty, char ch) static void tty_receive_char(struct tty_struct *tty, char ch)
...@@ -395,15 +395,15 @@ static struct chan *parse_chan(char *str, int pri, int device, ...@@ -395,15 +395,15 @@ static struct chan *parse_chan(char *str, int pri, int device,
chan = kmalloc(sizeof(*chan), GFP_KERNEL); chan = kmalloc(sizeof(*chan), GFP_KERNEL);
if(chan == NULL) return(NULL); if(chan == NULL) return(NULL);
*chan = ((struct chan) { list : LIST_HEAD_INIT(chan->list), *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list),
primary : 1, .primary = 1,
input : 0, .input = 0,
output : 0, .output = 0,
opened : 0, .opened = 0,
fd : -1, .fd = -1,
pri : pri, .pri = pri,
ops : ops, .ops = ops,
data : data }); .data = data });
return(chan); return(chan);
} }
......
...@@ -159,9 +159,9 @@ static int winch_tramp(int fd, void *device_data, int *fd_out) ...@@ -159,9 +159,9 @@ static int winch_tramp(int fd, void *device_data, int *fd_out)
return(err); return(err);
} }
data = ((struct winch_data) { pty_fd : fd, data = ((struct winch_data) { .pty_fd = fd,
pipe_fd : fds[1], .pipe_fd = fds[1],
close_me : fds[0] } ); .close_me = fds[0] } );
pid = run_helper_thread(winch_thread, &data, 0, &stack, 0); pid = run_helper_thread(winch_thread, &data, 0, &stack, 0);
if(pid < 0){ if(pid < 0){
printk("fork of winch_thread failed - errno = %d\n", errno); printk("fork of winch_thread failed - errno = %d\n", errno);
......
...@@ -28,14 +28,14 @@ void daemon_init(struct net_device *dev, void *data) ...@@ -28,14 +28,14 @@ void daemon_init(struct net_device *dev, void *data)
pri = dev->priv; pri = dev->priv;
dpri = (struct daemon_data *) pri->user; dpri = (struct daemon_data *) pri->user;
*dpri = ((struct daemon_data) *dpri = ((struct daemon_data)
{ sock_type : init->sock_type, { .sock_type = init->sock_type,
ctl_sock : init->ctl_sock, .ctl_sock = init->ctl_sock,
ctl_addr : NULL, .ctl_addr = NULL,
data_addr : NULL, .data_addr = NULL,
local_addr : NULL, .local_addr = NULL,
fd : -1, .fd = -1,
control : -1, .control = -1,
dev : dev }); .dev = dev });
printk("daemon backend (uml_switch version %d) - %s:%s", printk("daemon backend (uml_switch version %d) - %s:%s",
SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock); SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock);
...@@ -59,10 +59,10 @@ static int daemon_write(int fd, struct sk_buff **skb, ...@@ -59,10 +59,10 @@ static int daemon_write(int fd, struct sk_buff **skb,
} }
static struct net_kern_info daemon_kern_info = { static struct net_kern_info daemon_kern_info = {
init: daemon_init, .init = daemon_init,
protocol: eth_protocol, .protocol = eth_protocol,
read: daemon_read, .read = daemon_read,
write: daemon_write, .write = daemon_write,
}; };
int daemon_setup(char *str, char **mac_out, void *data) int daemon_setup(char *str, char **mac_out, void *data)
...@@ -71,8 +71,8 @@ int daemon_setup(char *str, char **mac_out, void *data) ...@@ -71,8 +71,8 @@ int daemon_setup(char *str, char **mac_out, void *data)
char *remain; char *remain;
*init = ((struct daemon_init) *init = ((struct daemon_init)
{ sock_type : "unix", { .sock_type = "unix",
ctl_sock : "/tmp/uml.ctl" }); .ctl_sock = "/tmp/uml.ctl" });
remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock, remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock,
NULL); NULL);
...@@ -84,13 +84,13 @@ int daemon_setup(char *str, char **mac_out, void *data) ...@@ -84,13 +84,13 @@ int daemon_setup(char *str, char **mac_out, void *data)
} }
static struct transport daemon_transport = { static struct transport daemon_transport = {
list : LIST_HEAD_INIT(daemon_transport.list), .list = LIST_HEAD_INIT(daemon_transport.list),
name : "daemon", .name = "daemon",
setup : daemon_setup, .setup = daemon_setup,
user : &daemon_user_info, .user = &daemon_user_info,
kern : &daemon_kern_info, .kern = &daemon_kern_info,
private_size : sizeof(struct daemon_data), .private_size = sizeof(struct daemon_data),
setup_size : sizeof(struct daemon_init), .setup_size = sizeof(struct daemon_init),
}; };
static int register_daemon(void) static int register_daemon(void)
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <stdint.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/un.h> #include <sys/un.h>
#include <sys/time.h> #include <sys/time.h>
...@@ -24,8 +25,8 @@ enum request_type { REQ_NEW_CONTROL }; ...@@ -24,8 +25,8 @@ enum request_type { REQ_NEW_CONTROL };
#define SWITCH_MAGIC 0xfeedface #define SWITCH_MAGIC 0xfeedface
struct request_v3 { struct request_v3 {
unsigned long magic; uint32_t magic;
int version; uint32_t version;
enum request_type type; enum request_type type;
struct sockaddr_un sock; struct sockaddr_un sock;
}; };
...@@ -172,14 +173,14 @@ static int daemon_set_mtu(int mtu, void *data) ...@@ -172,14 +173,14 @@ static int daemon_set_mtu(int mtu, void *data)
} }
struct net_user_info daemon_user_info = { struct net_user_info daemon_user_info = {
init: daemon_user_init, .init = daemon_user_init,
open: daemon_open, .open = daemon_open,
close: NULL, .close = NULL,
remove: daemon_remove, .remove = daemon_remove,
set_mtu: daemon_set_mtu, .set_mtu = daemon_set_mtu,
add_address: NULL, .add_address = NULL,
delete_address: NULL, .delete_address = NULL,
max_packet: MAX_PACKET - ETH_HEADER_OTHER .max_packet = MAX_PACKET - ETH_HEADER_OTHER
}; };
/* /*
......
...@@ -36,8 +36,8 @@ void *fd_init(char *str, int device, struct chan_opts *opts) ...@@ -36,8 +36,8 @@ void *fd_init(char *str, int device, struct chan_opts *opts)
return(NULL); return(NULL);
} }
if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL); if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL);
*data = ((struct fd_chan) { fd : n, *data = ((struct fd_chan) { .fd = n,
raw : opts->raw }); .raw = opts->raw });
return(data); return(data);
} }
...@@ -72,16 +72,16 @@ int fd_console_write(int fd, const char *buf, int n, void *d) ...@@ -72,16 +72,16 @@ int fd_console_write(int fd, const char *buf, int n, void *d)
} }
struct chan_ops fd_ops = { struct chan_ops fd_ops = {
type: "fd", .type = "fd",
init: fd_init, .init = fd_init,
open: fd_open, .open = fd_open,
close: fd_close, .close = fd_close,
read: generic_read, .read = generic_read,
write: generic_write, .write = generic_write,
console_write: fd_console_write, .console_write = fd_console_write,
window_size: generic_window_size, .window_size = generic_window_size,
free: generic_free, .free = generic_free,
winch: 1, .winch = 1,
}; };
/* /*
......
...@@ -145,17 +145,17 @@ static int harddog_ioctl(struct inode *inode, struct file *file, ...@@ -145,17 +145,17 @@ static int harddog_ioctl(struct inode *inode, struct file *file,
} }
static struct file_operations harddog_fops = { static struct file_operations harddog_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
write: harddog_write, .write = harddog_write,
ioctl: harddog_ioctl, .ioctl = harddog_ioctl,
open: harddog_open, .open = harddog_open,
release: harddog_release, .release = harddog_release,
}; };
static struct miscdevice harddog_miscdev = { static struct miscdevice harddog_miscdev = {
minor: WATCHDOG_MINOR, .minor = WATCHDOG_MINOR,
name: "watchdog", .name = "watchdog",
fops: &harddog_fops, .fops = &harddog_fops,
}; };
static char banner[] __initdata = KERN_INFO "UML Watchdog Timer\n"; static char banner[] __initdata = KERN_INFO "UML Watchdog Timer\n";
......
...@@ -195,23 +195,23 @@ static int hostmixer_release(struct inode *inode, struct file *file) ...@@ -195,23 +195,23 @@ static int hostmixer_release(struct inode *inode, struct file *file)
/* kernel module operations */ /* kernel module operations */
static struct file_operations hostaudio_fops = { static struct file_operations hostaudio_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
llseek: no_llseek, .llseek = no_llseek,
read: hostaudio_read, .read = hostaudio_read,
write: hostaudio_write, .write = hostaudio_write,
poll: hostaudio_poll, .poll = hostaudio_poll,
ioctl: hostaudio_ioctl, .ioctl = hostaudio_ioctl,
mmap: NULL, .mmap = NULL,
open: hostaudio_open, .open = hostaudio_open,
release: hostaudio_release, .release = hostaudio_release,
}; };
static struct file_operations hostmixer_fops = { static struct file_operations hostmixer_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
llseek: no_llseek, .llseek = no_llseek,
ioctl: hostmixer_ioctl_mixdev, .ioctl = hostmixer_ioctl_mixdev,
open: hostmixer_open_mixdev, .open = hostmixer_open_mixdev,
release: hostmixer_release, .release = hostmixer_release,
}; };
struct { struct {
......
...@@ -35,7 +35,7 @@ void line_timer_cb(void *arg) ...@@ -35,7 +35,7 @@ void line_timer_cb(void *arg)
line_interrupt(dev->driver->read_irq, dev, NULL); line_interrupt(dev->driver->read_irq, dev, NULL);
} }
void buffer_data(struct line *line, const char *buf, int len) static void buffer_data(struct line *line, const char *buf, int len)
{ {
int end; int end;
...@@ -519,11 +519,11 @@ void register_winch_irq(int fd, int tty_fd, int pid, void *line) ...@@ -519,11 +519,11 @@ void register_winch_irq(int fd, int tty_fd, int pid, void *line)
printk("register_winch_irq - kmalloc failed\n"); printk("register_winch_irq - kmalloc failed\n");
goto out; goto out;
} }
*winch = ((struct winch) { list : LIST_HEAD_INIT(winch->list), *winch = ((struct winch) { .list = LIST_HEAD_INIT(winch->list),
fd : fd, .fd = fd,
tty_fd : tty_fd, .tty_fd = tty_fd,
pid : pid, .pid = pid,
line : line }); .line = line });
list_add(&winch->list, &winch_handlers); list_add(&winch->list, &winch_handlers);
if(um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, if(um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM,
...@@ -541,7 +541,8 @@ static void winch_cleanup(void) ...@@ -541,7 +541,8 @@ static void winch_cleanup(void)
list_for_each(ele, &winch_handlers){ list_for_each(ele, &winch_handlers){
winch = list_entry(ele, struct winch, list); winch = list_entry(ele, struct winch, list);
close(winch->fd); close(winch->fd);
if(winch->pid != -1) os_kill_process(winch->pid, 0); if(winch->pid != -1)
os_kill_process(winch->pid, 1);
} }
} }
......
...@@ -36,11 +36,11 @@ void mcast_init(struct net_device *dev, void *data) ...@@ -36,11 +36,11 @@ void mcast_init(struct net_device *dev, void *data)
pri = dev->priv; pri = dev->priv;
dpri = (struct mcast_data *) pri->user; dpri = (struct mcast_data *) pri->user;
*dpri = ((struct mcast_data) *dpri = ((struct mcast_data)
{ addr : init->addr, { .addr = init->addr,
port : init->port, .port = init->port,
ttl : init->ttl, .ttl = init->ttl,
mcast_addr : NULL, .mcast_addr = NULL,
dev : dev }); .dev = dev });
printk("mcast backend "); printk("mcast backend ");
printk("multicast adddress: %s:%u, TTL:%u ", printk("multicast adddress: %s:%u, TTL:%u ",
dpri->addr, dpri->port, dpri->ttl); dpri->addr, dpri->port, dpri->ttl);
...@@ -64,10 +64,10 @@ static int mcast_write(int fd, struct sk_buff **skb, ...@@ -64,10 +64,10 @@ static int mcast_write(int fd, struct sk_buff **skb,
} }
static struct net_kern_info mcast_kern_info = { static struct net_kern_info mcast_kern_info = {
init: mcast_init, .init = mcast_init,
protocol: eth_protocol, .protocol = eth_protocol,
read: mcast_read, .read = mcast_read,
write: mcast_write, .write = mcast_write,
}; };
int mcast_setup(char *str, char **mac_out, void *data) int mcast_setup(char *str, char **mac_out, void *data)
...@@ -78,9 +78,9 @@ int mcast_setup(char *str, char **mac_out, void *data) ...@@ -78,9 +78,9 @@ int mcast_setup(char *str, char **mac_out, void *data)
int n; int n;
*init = ((struct mcast_init) *init = ((struct mcast_init)
{ addr : "239.192.168.1", { .addr = "239.192.168.1",
port : 1102, .port = 1102,
ttl : 1 }); .ttl = 1 });
remain = split_if_spec(str, mac_out, &init->addr, &port_str, &ttl_str, remain = split_if_spec(str, mac_out, &init->addr, &port_str, &ttl_str,
NULL); NULL);
...@@ -116,13 +116,13 @@ int mcast_setup(char *str, char **mac_out, void *data) ...@@ -116,13 +116,13 @@ int mcast_setup(char *str, char **mac_out, void *data)
} }
static struct transport mcast_transport = { static struct transport mcast_transport = {
list : LIST_HEAD_INIT(mcast_transport.list), .list = LIST_HEAD_INIT(mcast_transport.list),
name : "mcast", .name = "mcast",
setup : mcast_setup, .setup = mcast_setup,
user : &mcast_user_info, .user = &mcast_user_info,
kern : &mcast_kern_info, .kern = &mcast_kern_info,
private_size : sizeof(struct mcast_data), .private_size = sizeof(struct mcast_data),
setup_size : sizeof(struct mcast_init), .setup_size = sizeof(struct mcast_init),
}; };
static int register_mcast(void) static int register_mcast(void)
......
...@@ -153,14 +153,14 @@ static int mcast_set_mtu(int mtu, void *data) ...@@ -153,14 +153,14 @@ static int mcast_set_mtu(int mtu, void *data)
} }
struct net_user_info mcast_user_info = { struct net_user_info mcast_user_info = {
init: mcast_user_init, .init = mcast_user_init,
open: mcast_open, .open = mcast_open,
close: mcast_close, .close = mcast_close,
remove: NULL, .remove = NULL,
set_mtu: mcast_set_mtu, .set_mtu = mcast_set_mtu,
add_address: NULL, .add_address = NULL,
delete_address: NULL, .delete_address = NULL,
max_packet: MAX_PACKET - ETH_HEADER_OTHER .max_packet = MAX_PACKET - ETH_HEADER_OTHER
}; };
/* /*
......
...@@ -36,8 +36,8 @@ static int do_unlink_socket(struct notifier_block *notifier, ...@@ -36,8 +36,8 @@ static int do_unlink_socket(struct notifier_block *notifier,
static struct notifier_block reboot_notifier = { static struct notifier_block reboot_notifier = {
notifier_call: do_unlink_socket, .notifier_call = do_unlink_socket,
priority: 0, .priority = 0,
}; };
/* Safe without explicit locking for now. Tasklets provide their own /* Safe without explicit locking for now. Tasklets provide their own
...@@ -418,9 +418,9 @@ static int notify_panic(struct notifier_block *self, unsigned long unused1, ...@@ -418,9 +418,9 @@ static int notify_panic(struct notifier_block *self, unsigned long unused1,
} }
static struct notifier_block panic_exit_notifier = { static struct notifier_block panic_exit_notifier = {
notifier_call : notify_panic, .notifier_call = notify_panic,
next : NULL, .next = NULL,
priority : 1 .priority = 1
}; };
static int add_notifier(void) static int add_notifier(void)
......
...@@ -106,13 +106,13 @@ mmapper_release(struct inode *inode, struct file *file) ...@@ -106,13 +106,13 @@ mmapper_release(struct inode *inode, struct file *file)
} }
static struct file_operations mmapper_fops = { static struct file_operations mmapper_fops = {
owner: THIS_MODULE, .owner = THIS_MODULE,
read: mmapper_read, .read = mmapper_read,
write: mmapper_write, .write = mmapper_write,
ioctl: mmapper_ioctl, .ioctl = mmapper_ioctl,
mmap: mmapper_mmap, .mmap = mmapper_mmap,
open: mmapper_open, .open = mmapper_open,
release: mmapper_release, .release = mmapper_release,
}; };
static int __init mmapper_init(void) static int __init mmapper_init(void)
......
...@@ -368,22 +368,22 @@ static int eth_configure(int n, void *init, char *mac, ...@@ -368,22 +368,22 @@ static int eth_configure(int n, void *init, char *mac,
*/ */
save = lp->user[0]; save = lp->user[0];
*lp = ((struct uml_net_private) *lp = ((struct uml_net_private)
{ list : LIST_HEAD_INIT(lp->list), { .list = LIST_HEAD_INIT(lp->list),
lock : SPIN_LOCK_UNLOCKED, .lock = SPIN_LOCK_UNLOCKED,
dev : dev, .dev = dev,
fd : -1, .fd = -1,
mac : { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0}, .mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0},
have_mac : device->have_mac, .have_mac = device->have_mac,
protocol : transport->kern->protocol, .protocol = transport->kern->protocol,
open : transport->user->open, .open = transport->user->open,
close : transport->user->close, .close = transport->user->close,
remove : transport->user->remove, .remove = transport->user->remove,
read : transport->kern->read, .read = transport->kern->read,
write : transport->kern->write, .write = transport->kern->write,
add_address : transport->user->add_address, .add_address = transport->user->add_address,
delete_address : transport->user->delete_address, .delete_address = transport->user->delete_address,
set_mtu : transport->user->set_mtu, .set_mtu = transport->user->set_mtu,
user : { save } }); .user = { save } });
init_timer(&lp->tl); init_timer(&lp->tl);
lp->tl.function = uml_net_user_timer_expire; lp->tl.function = uml_net_user_timer_expire;
memset(&lp->stats, 0, sizeof(lp->stats)); memset(&lp->stats, 0, sizeof(lp->stats));
...@@ -542,9 +542,9 @@ static int eth_setup(char *str) ...@@ -542,9 +542,9 @@ static int eth_setup(char *str)
printk("eth_init : alloc_bootmem failed\n"); printk("eth_init : alloc_bootmem failed\n");
return(1); return(1);
} }
*new = ((struct eth_init) { list : LIST_HEAD_INIT(new->list), *new = ((struct eth_init) { .list = LIST_HEAD_INIT(new->list),
index : n, .index = n,
init : str }); .init = str });
list_add_tail(&new->list, &eth_cmd_line); list_add_tail(&new->list, &eth_cmd_line);
return(1); return(1);
} }
...@@ -618,9 +618,10 @@ static int net_remove(char *str) ...@@ -618,9 +618,10 @@ static int net_remove(char *str)
} }
static struct mc_device net_mc = { static struct mc_device net_mc = {
name: "eth", .name = "eth",
config: net_config, .config = net_config,
remove: net_remove, .get_config = NULL,
.remove = net_remove,
}; };
static int uml_inetaddr_event(struct notifier_block *this, unsigned long event, static int uml_inetaddr_event(struct notifier_block *this, unsigned long event,
...@@ -662,7 +663,7 @@ static int uml_inetaddr_event(struct notifier_block *this, unsigned long event, ...@@ -662,7 +663,7 @@ static int uml_inetaddr_event(struct notifier_block *this, unsigned long event,
} }
struct notifier_block uml_inetaddr_notifier = { struct notifier_block uml_inetaddr_notifier = {
notifier_call: uml_inetaddr_event, .notifier_call = uml_inetaddr_event,
}; };
static int uml_net_init(void) static int uml_net_init(void)
......
...@@ -32,16 +32,16 @@ void null_free(void *data) ...@@ -32,16 +32,16 @@ void null_free(void *data)
} }
struct chan_ops null_ops = { struct chan_ops null_ops = {
type: "null", .type = "null",
init: null_init, .init = null_init,
open: null_open, .open = null_open,
close: generic_close, .close = generic_close,
read: null_read, .read = null_read,
write: generic_write, .write = generic_write,
console_write: generic_console_write, .console_write = generic_console_write,
window_size: generic_window_size, .window_size = generic_window_size,
free: null_free, .free = null_free,
winch: 0, .winch = 0,
}; };
/* /*
......
...@@ -27,12 +27,12 @@ void pcap_init(struct net_device *dev, void *data) ...@@ -27,12 +27,12 @@ void pcap_init(struct net_device *dev, void *data)
pri = dev->priv; pri = dev->priv;
ppri = (struct pcap_data *) pri->user; ppri = (struct pcap_data *) pri->user;
*ppri = ((struct pcap_data) *ppri = ((struct pcap_data)
{ host_if : init->host_if, { .host_if = init->host_if,
promisc : init->promisc, .promisc = init->promisc,
optimize : init->optimize, .optimize = init->optimize,
filter : init->filter, .filter = init->filter,
compiled : NULL, .compiled = NULL,
pcap : NULL }); .pcap = NULL });
} }
static int pcap_read(int fd, struct sk_buff **skb, static int pcap_read(int fd, struct sk_buff **skb,
...@@ -51,10 +51,10 @@ static int pcap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) ...@@ -51,10 +51,10 @@ static int pcap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp)
} }
static struct net_kern_info pcap_kern_info = { static struct net_kern_info pcap_kern_info = {
init: pcap_init, .init = pcap_init,
protocol: eth_protocol, .protocol = eth_protocol,
read: pcap_read, .read = pcap_read,
write: pcap_write, .write = pcap_write,
}; };
int pcap_setup(char *str, char **mac_out, void *data) int pcap_setup(char *str, char **mac_out, void *data)
...@@ -64,10 +64,10 @@ int pcap_setup(char *str, char **mac_out, void *data) ...@@ -64,10 +64,10 @@ int pcap_setup(char *str, char **mac_out, void *data)
int i; int i;
*init = ((struct pcap_init) *init = ((struct pcap_init)
{ host_if : "eth0", { .host_if = "eth0",
promisc : 1, .promisc = 1,
optimize : 0, .optimize = 0,
filter : NULL }); .filter = NULL });
remain = split_if_spec(str, &host_if, &init->filter, remain = split_if_spec(str, &host_if, &init->filter,
&options[0], &options[1], NULL); &options[0], &options[1], NULL);
...@@ -98,13 +98,13 @@ int pcap_setup(char *str, char **mac_out, void *data) ...@@ -98,13 +98,13 @@ int pcap_setup(char *str, char **mac_out, void *data)
} }
static struct transport pcap_transport = { static struct transport pcap_transport = {
list : LIST_HEAD_INIT(pcap_transport.list), .list = LIST_HEAD_INIT(pcap_transport.list),
name : "pcap", .name = "pcap",
setup : pcap_setup, .setup = pcap_setup,
user : &pcap_user_info, .user = &pcap_user_info,
kern : &pcap_kern_info, .kern = &pcap_kern_info,
private_size : sizeof(struct pcap_data), .private_size = sizeof(struct pcap_data),
setup_size : sizeof(struct pcap_init), .setup_size = sizeof(struct pcap_init),
}; };
static int register_pcap(void) static int register_pcap(void)
......
...@@ -106,8 +106,8 @@ static void handler(u_char *data, const struct pcap_pkthdr *header, ...@@ -106,8 +106,8 @@ static void handler(u_char *data, const struct pcap_pkthdr *header,
int pcap_user_read(int fd, void *buffer, int len, struct pcap_data *pri) int pcap_user_read(int fd, void *buffer, int len, struct pcap_data *pri)
{ {
struct pcap_handler_data hdata = ((struct pcap_handler_data) struct pcap_handler_data hdata = ((struct pcap_handler_data)
{ buffer : buffer, { .buffer = buffer,
len : len }); .len = len });
int n; int n;
n = pcap_dispatch(pri->pcap, 1, handler, (u_char *) &hdata); n = pcap_dispatch(pri->pcap, 1, handler, (u_char *) &hdata);
...@@ -121,14 +121,14 @@ int pcap_user_read(int fd, void *buffer, int len, struct pcap_data *pri) ...@@ -121,14 +121,14 @@ int pcap_user_read(int fd, void *buffer, int len, struct pcap_data *pri)
} }
struct net_user_info pcap_user_info = { struct net_user_info pcap_user_info = {
init: pcap_user_init, .init = pcap_user_init,
open: pcap_open, .open = pcap_open,
close: NULL, .close = NULL,
remove: pcap_remove, .remove = pcap_remove,
set_mtu: NULL, .set_mtu = NULL,
add_address: NULL, .add_address = NULL,
delete_address: NULL, .delete_address = NULL,
max_packet: MAX_PACKET - ETH_HEADER_OTHER .max_packet = MAX_PACKET - ETH_HEADER_OTHER
}; };
/* /*
......
...@@ -31,9 +31,8 @@ struct port_list { ...@@ -31,9 +31,8 @@ struct port_list {
struct port_dev { struct port_dev {
struct port_list *port; struct port_list *port;
int fd; int helper_pid;
int helper_pid; int telnetd_pid;
int telnetd_pid;
}; };
struct connection { struct connection {
...@@ -55,7 +54,8 @@ static void pipe_interrupt(int irq, void *data, struct pt_regs *regs) ...@@ -55,7 +54,8 @@ static void pipe_interrupt(int irq, void *data, struct pt_regs *regs)
if(fd == -EAGAIN) if(fd == -EAGAIN)
return; return;
printk("os_rcv_fd returned %d\n", -fd); printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n",
-fd);
os_close_file(conn->fd); os_close_file(conn->fd);
} }
...@@ -75,26 +75,29 @@ static int port_accept(struct port_list *port) ...@@ -75,26 +75,29 @@ static int port_accept(struct port_list *port)
fd = port_connection(port->fd, socket, &pid); fd = port_connection(port->fd, socket, &pid);
if(fd < 0){ if(fd < 0){
if(fd != -EAGAIN) if(fd != -EAGAIN)
printk("port_connection returned %d\n", -fd); printk(KERN_ERR "port_accept : port_connection "
"returned %d\n", -fd);
goto out; goto out;
} }
conn = kmalloc(sizeof(*conn), GFP_ATOMIC); conn = kmalloc(sizeof(*conn), GFP_ATOMIC);
if(conn == NULL){ if(conn == NULL){
printk("port_interrupt : failed to allocate connection\n"); printk(KERN_ERR "port_accept : failed to allocate "
"connection\n");
goto out_close; goto out_close;
} }
*conn = ((struct connection) *conn = ((struct connection)
{ list : LIST_HEAD_INIT(conn->list), { .list = LIST_HEAD_INIT(conn->list),
fd : fd, .fd = fd,
socket : { socket[0], socket[1] }, .socket = { socket[0], socket[1] },
telnetd_pid : pid, .telnetd_pid = pid,
port : port }); .port = port });
if(um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt, if(um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt,
SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM,
"telnetd", conn)){ "telnetd", conn)){
printk(KERN_ERR "Failed to get IRQ for telnetd\n"); printk(KERN_ERR "port_accept : failed to get IRQ for "
"telnetd\n");
goto out_free; goto out_free;
} }
...@@ -106,7 +109,8 @@ static int port_accept(struct port_list *port) ...@@ -106,7 +109,8 @@ static int port_accept(struct port_list *port)
kfree(conn); kfree(conn);
out_close: out_close:
os_close_file(fd); os_close_file(fd);
if(pid != -1) os_kill_process(pid, 0); if(pid != -1)
os_kill_process(pid, 1);
out: out:
return(ret); return(ret);
} }
...@@ -174,14 +178,15 @@ void *port_data(int port_num) ...@@ -174,14 +178,15 @@ void *port_data(int port_num)
} }
*port = ((struct port_list) *port = ((struct port_list)
{ list : LIST_HEAD_INIT(port->list), { .list = LIST_HEAD_INIT(port->list),
has_connection : 0, .has_connection = 0,
sem : __SEMAPHORE_INITIALIZER(port->sem, 0), .sem = __SEMAPHORE_INITIALIZER(port->sem,
lock : SPIN_LOCK_UNLOCKED, 0),
port : port_num, .lock = SPIN_LOCK_UNLOCKED,
fd : fd, .port = port_num,
pending : LIST_HEAD_INIT(port->pending), .fd = fd,
connections : LIST_HEAD_INIT(port->connections) }); .pending = LIST_HEAD_INIT(port->pending),
.connections = LIST_HEAD_INIT(port->connections) });
list_add(&port->list, &ports); list_add(&port->list, &ports);
found: found:
...@@ -191,9 +196,9 @@ void *port_data(int port_num) ...@@ -191,9 +196,9 @@ void *port_data(int port_num)
goto out; goto out;
} }
*dev = ((struct port_dev) { port : port, *dev = ((struct port_dev) { .port = port,
fd : -1, .helper_pid = -1,
helper_pid : -1 }); .telnetd_pid = -1 });
goto out; goto out;
out_free: out_free:
...@@ -205,38 +210,16 @@ void *port_data(int port_num) ...@@ -205,38 +210,16 @@ void *port_data(int port_num)
return(dev); return(dev);
} }
void port_remove_dev(void *d)
{
struct port_dev *dev = d;
if(dev->helper_pid != -1)
os_kill_process(dev->helper_pid, 0);
if(dev->telnetd_pid != -1)
os_kill_process(dev->telnetd_pid, 0);
dev->helper_pid = -1;
}
static void free_port(void)
{
struct list_head *ele;
struct port_list *port;
list_for_each(ele, &ports){
port = list_entry(ele, struct port_list, list);
os_close_file(port->fd);
}
}
__uml_exitcall(free_port);
int port_wait(void *data) int port_wait(void *data)
{ {
struct port_dev *dev = data; struct port_dev *dev = data;
struct connection *conn; struct connection *conn;
struct port_list *port = dev->port; struct port_list *port = dev->port;
int fd;
while(1){ while(1){
if(down_interruptible(&port->sem)) return(-ERESTARTSYS); if(down_interruptible(&port->sem))
return(-ERESTARTSYS);
spin_lock(&port->lock); spin_lock(&port->lock);
...@@ -263,21 +246,48 @@ int port_wait(void *data) ...@@ -263,21 +246,48 @@ int port_wait(void *data)
kfree(conn); kfree(conn);
} }
dev->fd = conn->fd; fd = conn->fd;
dev->helper_pid = conn->helper_pid; dev->helper_pid = conn->helper_pid;
dev->telnetd_pid = conn->telnetd_pid; dev->telnetd_pid = conn->telnetd_pid;
kfree(conn); kfree(conn);
return(dev->fd); return(fd);
}
void port_remove_dev(void *d)
{
struct port_dev *dev = d;
if(dev->helper_pid != -1)
os_kill_process(dev->helper_pid, 0);
if(dev->telnetd_pid != -1)
os_kill_process(dev->telnetd_pid, 1);
dev->helper_pid = -1;
dev->telnetd_pid = -1;
} }
void port_kern_free(void *d) void port_kern_free(void *d)
{ {
struct port_dev *dev = d; struct port_dev *dev = d;
port_remove_dev(dev);
kfree(dev); kfree(dev);
} }
static void free_port(void)
{
struct list_head *ele;
struct port_list *port;
list_for_each(ele, &ports){
port = list_entry(ele, struct port_list, list);
free_irq_by_fd(port->fd);
os_close_file(port->fd);
}
}
__uml_exitcall(free_port);
/* /*
* Overrides for Emacs so that we follow Linus's tabbing style. * Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically * Emacs will notice this stuff at the end of the file and automatically
......
...@@ -47,14 +47,28 @@ void *port_init(char *str, int device, struct chan_opts *opts) ...@@ -47,14 +47,28 @@ void *port_init(char *str, int device, struct chan_opts *opts)
return(NULL); return(NULL);
} }
if((kern_data = port_data(port)) == NULL) return(NULL); if((kern_data = port_data(port)) == NULL)
return(NULL);
if((data = um_kmalloc(sizeof(*data))) == NULL)
goto err;
if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL); *data = ((struct port_chan) { .raw = opts->raw,
*data = ((struct port_chan) { raw : opts->raw, .kernel_data = kern_data });
kernel_data : kern_data });
sprintf(data->dev, "%d", port); sprintf(data->dev, "%d", port);
return(data); return(data);
err:
port_kern_free(kern_data);
return(NULL);
}
void port_free(void *d)
{
struct port_chan *data = d;
port_kern_free(data->kernel_data);
kfree(data);
} }
int port_open(int input, int output, int primary, void *d, char **dev_out) int port_open(int input, int output, int primary, void *d, char **dev_out)
...@@ -86,25 +100,17 @@ int port_console_write(int fd, const char *buf, int n, void *d) ...@@ -86,25 +100,17 @@ int port_console_write(int fd, const char *buf, int n, void *d)
return(generic_console_write(fd, buf, n, &data->tt)); return(generic_console_write(fd, buf, n, &data->tt));
} }
void port_free(void *d)
{
struct port_chan *data = d;
port_kern_free(data->kernel_data);
kfree(data);
}
struct chan_ops port_ops = { struct chan_ops port_ops = {
type: "port", .type = "port",
init: port_init, .init = port_init,
open: port_open, .open = port_open,
close: port_close, .close = port_close,
read: generic_read, .read = generic_read,
write: generic_write, .write = generic_write,
console_write: port_console_write, .console_write = port_console_write,
window_size: generic_window_size, .window_size = generic_window_size,
free: port_free, .free = port_free,
winch: 1, .winch = 1,
}; };
int port_listen_fd(int port) int port_listen_fd(int port)
...@@ -113,7 +119,8 @@ int port_listen_fd(int port) ...@@ -113,7 +119,8 @@ int port_listen_fd(int port)
int fd, err; int fd, err;
fd = socket(PF_INET, SOCK_STREAM, 0); fd = socket(PF_INET, SOCK_STREAM, 0);
if(fd == -1) return(-errno); if(fd == -1)
return(-errno);
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
addr.sin_port = htons(port); addr.sin_port = htons(port);
...@@ -163,14 +170,16 @@ int port_connection(int fd, int *socket, int *pid_out) ...@@ -163,14 +170,16 @@ int port_connection(int fd, int *socket, int *pid_out)
return(-errno); return(-errno);
err = os_pipe(socket, 0, 0); err = os_pipe(socket, 0, 0);
if(err) goto out_close; if(err)
goto out_close;
data = ((struct port_pre_exec_data) data = ((struct port_pre_exec_data)
{ sock_fd : new, { .sock_fd = new,
pipe_fd : socket[1] }); .pipe_fd = socket[1] });
err = run_helper(port_pre_exec, &data, argv, NULL); err = run_helper(port_pre_exec, &data, argv, NULL);
if(err < 0) goto out_shutdown; if(err < 0)
goto out_shutdown;
*pid_out = err; *pid_out = err;
return(new); return(new);
......
/* /*
* Copyright (C) 2001 Jeff Dike (jdike@karaya.com) * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
* Licensed under the GPL * Licensed under the GPL
*/ */
...@@ -27,9 +27,9 @@ void *pty_chan_init(char *str, int device, struct chan_opts *opts) ...@@ -27,9 +27,9 @@ void *pty_chan_init(char *str, int device, struct chan_opts *opts)
struct pty_chan *data; struct pty_chan *data;
if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL); if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL);
*data = ((struct pty_chan) { announce : opts->announce, *data = ((struct pty_chan) { .announce = opts->announce,
dev : device, .dev = device,
raw : opts->raw }); .raw = opts->raw });
return(data); return(data);
} }
...@@ -86,34 +86,15 @@ int getmaster(char *line) ...@@ -86,34 +86,15 @@ int getmaster(char *line)
return(-1); return(-1);
} }
struct grantpt_info {
int fd;
int res;
int err;
};
static void grantpt_cb(void *arg)
{
struct grantpt_info *info = arg;
info->res = grantpt(info->fd);
info->err = errno;
}
int pty_open(int input, int output, int primary, void *d, char **dev_out) int pty_open(int input, int output, int primary, void *d, char **dev_out)
{ {
struct pty_chan *data = d; struct pty_chan *data = d;
int fd; int fd;
char dev[sizeof("/dev/ptyxx\0")] = "/dev/ptyxx"; char dev[sizeof("/dev/ptyxx\0")] = "/dev/ptyxx";
struct grantpt_info info;
fd = getmaster(dev); fd = getmaster(dev);
if(fd < 0) return(-errno); if(fd < 0) return(-errno);
info.fd = fd;
initial_thread_cb(grantpt_cb, &info);
unlockpt(fd);
if(data->raw) raw(fd, 0); if(data->raw) raw(fd, 0);
if(data->announce) (*data->announce)(dev, data->dev); if(data->announce) (*data->announce)(dev, data->dev);
...@@ -130,29 +111,29 @@ int pty_console_write(int fd, const char *buf, int n, void *d) ...@@ -130,29 +111,29 @@ int pty_console_write(int fd, const char *buf, int n, void *d)
} }
struct chan_ops pty_ops = { struct chan_ops pty_ops = {
type: "pty", .type = "pty",
init: pty_chan_init, .init = pty_chan_init,
open: pty_open, .open = pty_open,
close: generic_close, .close = generic_close,
read: generic_read, .read = generic_read,
write: generic_write, .write = generic_write,
console_write: pty_console_write, .console_write = pty_console_write,
window_size: generic_window_size, .window_size = generic_window_size,
free: generic_free, .free = generic_free,
winch: 0, .winch = 0,
}; };
struct chan_ops pts_ops = { struct chan_ops pts_ops = {
type: "pts", .type = "pts",
init: pty_chan_init, .init = pty_chan_init,
open: pts_open, .open = pts_open,
close: generic_close, .close = generic_close,
read: generic_read, .read = generic_read,
write: generic_write, .write = generic_write,
console_write: pty_console_write, .console_write = pty_console_write,
window_size: generic_window_size, .window_size = generic_window_size,
free: generic_free, .free = generic_free,
winch: 0, .winch = 0,
}; };
/* /*
......
...@@ -22,15 +22,15 @@ void slip_init(struct net_device *dev, void *data) ...@@ -22,15 +22,15 @@ void slip_init(struct net_device *dev, void *data)
private = dev->priv; private = dev->priv;
spri = (struct slip_data *) private->user; spri = (struct slip_data *) private->user;
*spri = ((struct slip_data) *spri = ((struct slip_data)
{ name : { '\0' }, { .name = { '\0' },
addr: NULL, .addr = NULL,
gate_addr : init->gate_addr, .gate_addr = init->gate_addr,
slave : -1, .slave = -1,
ibuf : { '\0' }, .ibuf = { '\0' },
obuf : { '\0' }, .obuf = { '\0' },
pos : 0, .pos = 0,
esc : 0, .esc = 0,
dev : dev }); .dev = dev });
dev->init = NULL; dev->init = NULL;
dev->hard_header_len = 0; dev->hard_header_len = 0;
...@@ -61,10 +61,10 @@ static int slip_write(int fd, struct sk_buff **skb, ...@@ -61,10 +61,10 @@ static int slip_write(int fd, struct sk_buff **skb,
} }
struct net_kern_info slip_kern_info = { struct net_kern_info slip_kern_info = {
init: slip_init, .init = slip_init,
protocol: slip_protocol, .protocol = slip_protocol,
read: slip_read, .read = slip_read,
write: slip_write, .write = slip_write,
}; };
static int slip_setup(char *str, char **mac_out, void *data) static int slip_setup(char *str, char **mac_out, void *data)
...@@ -72,7 +72,7 @@ static int slip_setup(char *str, char **mac_out, void *data) ...@@ -72,7 +72,7 @@ static int slip_setup(char *str, char **mac_out, void *data)
struct slip_init *init = data; struct slip_init *init = data;
*init = ((struct slip_init) *init = ((struct slip_init)
{ gate_addr : NULL }); { .gate_addr = NULL });
if(str[0] != '\0') if(str[0] != '\0')
init->gate_addr = str; init->gate_addr = str;
...@@ -80,13 +80,13 @@ static int slip_setup(char *str, char **mac_out, void *data) ...@@ -80,13 +80,13 @@ static int slip_setup(char *str, char **mac_out, void *data)
} }
static struct transport slip_transport = { static struct transport slip_transport = {
list : LIST_HEAD_INIT(slip_transport.list), .list = LIST_HEAD_INIT(slip_transport.list),
name : "slip", .name = "slip",
setup : slip_setup, .setup = slip_setup,
user : &slip_user_info, .user = &slip_user_info,
kern : &slip_kern_info, .kern = &slip_kern_info,
private_size : sizeof(struct slip_data), .private_size = sizeof(struct slip_data),
setup_size : sizeof(struct slip_init), .setup_size = sizeof(struct slip_init),
}; };
static int register_slip(void) static int register_slip(void)
......
...@@ -257,14 +257,14 @@ static void slip_del_addr(unsigned char *addr, unsigned char *netmask, ...@@ -257,14 +257,14 @@ static void slip_del_addr(unsigned char *addr, unsigned char *netmask,
} }
struct net_user_info slip_user_info = { struct net_user_info slip_user_info = {
init: slip_user_init, .init = slip_user_init,
open: slip_open, .open = slip_open,
close: slip_close, .close = slip_close,
remove: NULL, .remove = NULL,
set_mtu: slip_set_mtu, .set_mtu = slip_set_mtu,
add_address: slip_add_addr, .add_address = slip_add_addr,
delete_address: slip_del_addr, .delete_address = slip_del_addr,
max_packet: BUF_SIZE .max_packet = BUF_SIZE
}; };
/* /*
......
...@@ -22,14 +22,14 @@ void slirp_init(struct net_device *dev, void *data) ...@@ -22,14 +22,14 @@ void slirp_init(struct net_device *dev, void *data)
private = dev->priv; private = dev->priv;
spri = (struct slirp_data *) private->user; spri = (struct slirp_data *) private->user;
*spri = ((struct slirp_data) *spri = ((struct slirp_data)
{ argw : init->argw, { .argw = init->argw,
pid : -1, .pid = -1,
slave : -1, .slave = -1,
ibuf : { '\0' }, .ibuf = { '\0' },
obuf : { '\0' }, .obuf = { '\0' },
pos : 0, .pos = 0,
esc : 0, .esc = 0,
dev : dev }); .dev = dev });
dev->init = NULL; dev->init = NULL;
dev->hard_header_len = 0; dev->hard_header_len = 0;
...@@ -64,10 +64,10 @@ static int slirp_write(int fd, struct sk_buff **skb, ...@@ -64,10 +64,10 @@ static int slirp_write(int fd, struct sk_buff **skb,
} }
struct net_kern_info slirp_kern_info = { struct net_kern_info slirp_kern_info = {
init: slirp_init, .init = slirp_init,
protocol: slirp_protocol, .protocol = slirp_protocol,
read: slirp_read, .read = slirp_read,
write: slirp_write, .write = slirp_write,
}; };
static int slirp_setup(char *str, char **mac_out, void *data) static int slirp_setup(char *str, char **mac_out, void *data)
...@@ -103,13 +103,13 @@ static int slirp_setup(char *str, char **mac_out, void *data) ...@@ -103,13 +103,13 @@ static int slirp_setup(char *str, char **mac_out, void *data)
} }
static struct transport slirp_transport = { static struct transport slirp_transport = {
list : LIST_HEAD_INIT(slirp_transport.list), .list = LIST_HEAD_INIT(slirp_transport.list),
name : "slirp", .name = "slirp",
setup : slirp_setup, .setup = slirp_setup,
user : &slirp_user_info, .user = &slirp_user_info,
kern : &slirp_kern_info, .kern = &slirp_kern_info,
private_size : sizeof(struct slirp_data), .private_size = sizeof(struct slirp_data),
setup_size : sizeof(struct slirp_init), .setup_size = sizeof(struct slirp_init),
}; };
static int register_slirp(void) static int register_slirp(void)
......
...@@ -180,14 +180,14 @@ static int slirp_set_mtu(int mtu, void *data) ...@@ -180,14 +180,14 @@ static int slirp_set_mtu(int mtu, void *data)
} }
struct net_user_info slirp_user_info = { struct net_user_info slirp_user_info = {
init: slirp_user_init, .init = slirp_user_init,
open: slirp_open, .open = slirp_open,
close: slirp_close, .close = slirp_close,
remove: NULL, .remove = NULL,
set_mtu: slirp_set_mtu, .set_mtu = slirp_set_mtu,
add_address: NULL, .add_address = NULL,
delete_address: NULL, .delete_address = NULL,
max_packet: BUF_SIZE .max_packet = BUF_SIZE
}; };
/* /*
......
...@@ -41,11 +41,11 @@ void ssl_announce(char *dev_name, int dev) ...@@ -41,11 +41,11 @@ void ssl_announce(char *dev_name, int dev)
} }
static struct chan_opts opts = { static struct chan_opts opts = {
announce: ssl_announce, .announce = ssl_announce,
xterm_title: "Serial Line #%d", .xterm_title = "Serial Line #%d",
raw: 1, .raw = 1,
tramp_stack : 0, .tramp_stack = 0,
in_kernel : 1, .in_kernel = 1,
}; };
static int ssl_config(char *str); static int ssl_config(char *str);
...@@ -53,23 +53,23 @@ static int ssl_get_config(char *dev, char *str, int size, char **error_out); ...@@ -53,23 +53,23 @@ static int ssl_get_config(char *dev, char *str, int size, char **error_out);
static int ssl_remove(char *str); static int ssl_remove(char *str);
static struct line_driver driver = { static struct line_driver driver = {
name : "UML serial line", .name = "UML serial line",
devfs_name : "tts/%d", .devfs_name = "tts/%d",
major : TTYAUX_MAJOR, .major = TTYAUX_MAJOR,
minor_start : 64, .minor_start = 64,
type : TTY_DRIVER_TYPE_SERIAL, .type = TTY_DRIVER_TYPE_SERIAL,
subtype : 0, .subtype = 0,
read_irq : SSL_IRQ, .read_irq = SSL_IRQ,
read_irq_name : "ssl", .read_irq_name = "ssl",
write_irq : SSL_WRITE_IRQ, .write_irq = SSL_WRITE_IRQ,
write_irq_name : "ssl-write", .write_irq_name = "ssl-write",
symlink_from : "serial", .symlink_from = "serial",
symlink_to : "tts", .symlink_to = "tts",
mc : { .mc = {
name : "ssl", .name = "ssl",
config : ssl_config, .config = ssl_config,
get_config : ssl_get_config, .get_config = ssl_get_config,
remove : ssl_remove, .remove = ssl_remove,
}, },
}; };
...@@ -191,21 +191,21 @@ void ssl_hangup(struct tty_struct *tty) ...@@ -191,21 +191,21 @@ void ssl_hangup(struct tty_struct *tty)
} }
static struct tty_driver ssl_driver = { static struct tty_driver ssl_driver = {
refcount : &ssl_refcount, .refcount = &ssl_refcount,
open : ssl_open, .open = ssl_open,
close : ssl_close, .close = ssl_close,
write : ssl_write, .write = ssl_write,
put_char : ssl_put_char, .put_char = ssl_put_char,
flush_chars : ssl_flush_chars, .flush_chars = ssl_flush_chars,
chars_in_buffer : ssl_chars_in_buffer, .chars_in_buffer = ssl_chars_in_buffer,
flush_buffer : ssl_flush_buffer, .flush_buffer = ssl_flush_buffer,
ioctl : ssl_ioctl, .ioctl = ssl_ioctl,
throttle : ssl_throttle, .throttle = ssl_throttle,
unthrottle : ssl_unthrottle, .unthrottle = ssl_unthrottle,
set_termios : ssl_set_termios, .set_termios = ssl_set_termios,
stop : ssl_stop, .stop = ssl_stop,
start : ssl_start, .start = ssl_start,
hangup : ssl_hangup .hangup = ssl_hangup
}; };
/* Changed by ssl_init and referenced by ssl_exit, which are both serialized /* Changed by ssl_init and referenced by ssl_exit, which are both serialized
......
...@@ -42,28 +42,28 @@ static struct tty_driver console_driver; ...@@ -42,28 +42,28 @@ static struct tty_driver console_driver;
static int console_refcount = 0; static int console_refcount = 0;
static struct chan_ops init_console_ops = { static struct chan_ops init_console_ops = {
type: "you shouldn't see this", .type = "you shouldn't see this",
init : NULL, .init = NULL,
open : NULL, .open = NULL,
close : NULL, .close = NULL,
read : NULL, .read = NULL,
write : NULL, .write = NULL,
console_write : generic_write, .console_write = generic_write,
window_size : NULL, .window_size = NULL,
free : NULL, .free = NULL,
winch: 0, .winch = 0,
}; };
static struct chan init_console_chan = { static struct chan init_console_chan = {
list : { }, .list = { },
primary : 1, .primary = 1,
input : 0, .input = 0,
output : 1, .output = 1,
opened : 1, .opened = 1,
fd : 1, .fd = 1,
pri : INIT_STATIC, .pri = INIT_STATIC,
ops : &init_console_ops, .ops = &init_console_ops,
data : NULL .data = NULL
}; };
void stdio_announce(char *dev_name, int dev) void stdio_announce(char *dev_name, int dev)
...@@ -73,11 +73,11 @@ void stdio_announce(char *dev_name, int dev) ...@@ -73,11 +73,11 @@ void stdio_announce(char *dev_name, int dev)
} }
static struct chan_opts opts = { static struct chan_opts opts = {
announce: stdio_announce, .announce = stdio_announce,
xterm_title: "Virtual Console #%d", .xterm_title = "Virtual Console #%d",
raw: 1, .raw = 1,
tramp_stack : 0, .tramp_stack = 0,
in_kernel : 1, .in_kernel = 1,
}; };
static int con_config(char *str); static int con_config(char *str);
...@@ -85,23 +85,23 @@ static int con_get_config(char *dev, char *str, int size, char **error_out); ...@@ -85,23 +85,23 @@ static int con_get_config(char *dev, char *str, int size, char **error_out);
static int con_remove(char *str); static int con_remove(char *str);
static struct line_driver driver = { static struct line_driver driver = {
name : "UML console", .name = "UML console",
devfs_name : "vc/%d", .devfs_name = "vc/%d",
major : TTY_MAJOR, .major = TTY_MAJOR,
minor_start : 0, .minor_start = 0,
type : TTY_DRIVER_TYPE_CONSOLE, .type = TTY_DRIVER_TYPE_CONSOLE,
subtype : SYSTEM_TYPE_CONSOLE, .subtype = SYSTEM_TYPE_CONSOLE,
read_irq : CONSOLE_IRQ, .read_irq = CONSOLE_IRQ,
read_irq_name : "console", .read_irq_name = "console",
write_irq : CONSOLE_WRITE_IRQ, .write_irq = CONSOLE_WRITE_IRQ,
write_irq_name : "console-write", .write_irq_name = "console-write",
symlink_from : "ttys", .symlink_from = "ttys",
symlink_to : "vc", .symlink_to = "vc",
mc : { .mc = {
name : "con", .name = "con",
config : con_config, .config = con_config,
get_config : con_get_config, .get_config = con_get_config,
remove : con_remove, .remove = con_remove,
}, },
}; };
...@@ -192,12 +192,12 @@ static void console_write(struct console *console, const char *string, ...@@ -192,12 +192,12 @@ static void console_write(struct console *console, const char *string,
} }
static struct tty_driver console_driver = { static struct tty_driver console_driver = {
refcount : &console_refcount, .refcount = &console_refcount,
open : con_open, .open = con_open,
close : con_close, .close = con_close,
write : con_write, .write = con_write,
chars_in_buffer : chars_in_buffer, .chars_in_buffer = chars_in_buffer,
set_termios : set_termios .set_termios = set_termios
}; };
static kdev_t console_device(struct console *c) static kdev_t console_device(struct console *c)
......
...@@ -32,8 +32,8 @@ void *tty_chan_init(char *str, int device, struct chan_opts *opts) ...@@ -32,8 +32,8 @@ void *tty_chan_init(char *str, int device, struct chan_opts *opts)
if((data = um_kmalloc(sizeof(*data))) == NULL) if((data = um_kmalloc(sizeof(*data))) == NULL)
return(NULL); return(NULL);
*data = ((struct tty_chan) { dev : str, *data = ((struct tty_chan) { .dev = str,
raw : opts->raw }); .raw = opts->raw });
return(data); return(data);
} }
...@@ -62,16 +62,16 @@ int tty_console_write(int fd, const char *buf, int n, void *d) ...@@ -62,16 +62,16 @@ int tty_console_write(int fd, const char *buf, int n, void *d)
} }
struct chan_ops tty_ops = { struct chan_ops tty_ops = {
type: "tty", .type = "tty",
init: tty_chan_init, .init = tty_chan_init,
open: tty_open, .open = tty_open,
close: generic_close, .close = generic_close,
read: generic_read, .read = generic_read,
write: generic_write, .write = generic_write,
console_write: tty_console_write, .console_write = tty_console_write,
window_size: generic_window_size, .window_size = generic_window_size,
free: generic_free, .free = generic_free,
winch: 0, .winch = 0,
}; };
/* /*
......
...@@ -77,9 +77,11 @@ static struct gendisk *ubd_gendisk[MAX_DEV]; ...@@ -77,9 +77,11 @@ static struct gendisk *ubd_gendisk[MAX_DEV];
static struct gendisk *fake_gendisk[MAX_DEV]; static struct gendisk *fake_gendisk[MAX_DEV];
#ifdef CONFIG_BLK_DEV_UBD_SYNC #ifdef CONFIG_BLK_DEV_UBD_SYNC
#define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 1, .c = 0 }) #define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 1, .c = 0, \
.cl = 1 })
#else #else
#define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 0, .c = 0 }) #define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 0, .c = 0, \
.cl = 1 })
#endif #endif
/* Not protected - changed only in ubd_setup_common and then only to /* Not protected - changed only in ubd_setup_common and then only to
...@@ -177,6 +179,8 @@ static void make_ide_entries(char *dev_name) ...@@ -177,6 +179,8 @@ static void make_ide_entries(char *dev_name)
if(proc_ide_root == NULL) make_proc_ide(); if(proc_ide_root == NULL) make_proc_ide();
dir = proc_mkdir(dev_name, proc_ide); dir = proc_mkdir(dev_name, proc_ide);
if(!dir) return;
ent = create_proc_entry("media", S_IFREG|S_IRUGO, dir); ent = create_proc_entry("media", S_IFREG|S_IRUGO, dir);
if(!ent) return; if(!ent) return;
ent->nlink = 1; ent->nlink = 1;
...@@ -405,7 +409,8 @@ static int io_pid = -1; ...@@ -405,7 +409,8 @@ static int io_pid = -1;
void kill_io_thread(void) void kill_io_thread(void)
{ {
if(io_pid != -1) kill(io_pid, SIGKILL); if(io_pid != -1)
os_kill_process(io_pid, 1);
} }
__uml_exitcall(kill_io_thread); __uml_exitcall(kill_io_thread);
...@@ -892,9 +897,9 @@ static int ubd_ioctl(struct inode * inode, struct file * file, ...@@ -892,9 +897,9 @@ static int ubd_ioctl(struct inode * inode, struct file * file,
struct ubd *dev = inode->i_bdev->bd_disk->private_data; struct ubd *dev = inode->i_bdev->bd_disk->private_data;
int err; int err;
struct hd_driveid ubd_id = { struct hd_driveid ubd_id = {
.cyls = 0, .cyls = 0,
.heads = 128, .heads = 128,
.sectors = 32, .sectors = 32,
}; };
switch (cmd) { switch (cmd) {
......
...@@ -37,13 +37,13 @@ void *xterm_init(char *str, int device, struct chan_opts *opts) ...@@ -37,13 +37,13 @@ void *xterm_init(char *str, int device, struct chan_opts *opts)
struct xterm_chan *data; struct xterm_chan *data;
if((data = malloc(sizeof(*data))) == NULL) return(NULL); if((data = malloc(sizeof(*data))) == NULL) return(NULL);
*data = ((struct xterm_chan) { pid : -1, *data = ((struct xterm_chan) { .pid = -1,
helper_pid : -1, .helper_pid = -1,
device : device, .device = device,
title : opts->xterm_title, .title = opts->xterm_title,
raw : opts->raw, .raw = opts->raw,
stack : opts->tramp_stack, .stack = opts->tramp_stack,
direct_rcv : !opts->in_kernel } ); .direct_rcv = !opts->in_kernel } );
return(data); return(data);
} }
...@@ -137,7 +137,7 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out) ...@@ -137,7 +137,7 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
} }
if(new < 0){ if(new < 0){
printk("xterm_open : os_rcv_fd failed, errno = %d\n", -new); printk("xterm_open : os_rcv_fd failed, errno = %d\n", -new);
return(new); goto out;
} }
tcgetattr(new, &data->tt); tcgetattr(new, &data->tt);
...@@ -145,6 +145,8 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out) ...@@ -145,6 +145,8 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
data->pid = pid; data->pid = pid;
*dev_out = NULL; *dev_out = NULL;
out:
unlink(file);
return(new); return(new);
} }
...@@ -152,9 +154,11 @@ void xterm_close(int fd, void *d) ...@@ -152,9 +154,11 @@ void xterm_close(int fd, void *d)
{ {
struct xterm_chan *data = d; struct xterm_chan *data = d;
if(data->pid != -1) kill(data->pid, SIGKILL); if(data->pid != -1)
os_kill_process(data->pid, 1);
data->pid = -1; data->pid = -1;
if(data->helper_pid != -1) kill(data->helper_pid, SIGKILL); if(data->helper_pid != -1)
os_kill_process(data->helper_pid, 0);
data->helper_pid = -1; data->helper_pid = -1;
close(fd); close(fd);
} }
...@@ -172,16 +176,16 @@ int xterm_console_write(int fd, const char *buf, int n, void *d) ...@@ -172,16 +176,16 @@ int xterm_console_write(int fd, const char *buf, int n, void *d)
} }
struct chan_ops xterm_ops = { struct chan_ops xterm_ops = {
type: "xterm", .type = "xterm",
init: xterm_init, .init = xterm_init,
open: xterm_open, .open = xterm_open,
close: xterm_close, .close = xterm_close,
read: generic_read, .read = generic_read,
write: generic_write, .write = generic_write,
console_write: xterm_console_write, .console_write = xterm_console_write,
window_size: generic_window_size, .window_size = generic_window_size,
free: xterm_free, .free = xterm_free,
winch: 1, .winch = 1,
}; };
/* /*
......
...@@ -39,21 +39,21 @@ int xterm_fd(int socket, int *pid_out) ...@@ -39,21 +39,21 @@ int xterm_fd(int socket, int *pid_out)
data = kmalloc(sizeof(*data), GFP_KERNEL); data = kmalloc(sizeof(*data), GFP_KERNEL);
if(data == NULL){ if(data == NULL){
printk(KERN_ERR "xterm_fd - failed to allocate semaphore\n"); printk(KERN_ERR "xterm_fd : failed to allocate xterm_wait\n");
return(-ENOMEM); return(-ENOMEM);
} }
*data = ((struct xterm_wait) *data = ((struct xterm_wait)
{ sem : __SEMAPHORE_INITIALIZER(data->sem, 0), { .sem = __SEMAPHORE_INITIALIZER(data->sem, 0),
fd : socket, .fd = socket,
pid : -1, .pid = -1,
new_fd : -1 }); .new_fd = -1 });
err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt, err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM,
"xterm", data); "xterm", data);
if(err){ if(err){
printk(KERN_ERR "Failed to get IRQ for xterm, err = %d\n", printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, "
err); "err = %d\n", err);
return(err); return(err);
} }
down(&data->sem); down(&data->sem);
......
...@@ -8,13 +8,13 @@ ...@@ -8,13 +8,13 @@
#include "uml-config.h" #include "uml-config.h"
#if defined(CONFIG_MODE_TT) && defined(CONFIG_MODE_SKAS) #if defined(UML_CONFIG_MODE_TT) && defined(UML_CONFIG_MODE_SKAS)
#define CHOOSE_MODE(tt, skas) (mode_tt ? (tt) : (skas)) #define CHOOSE_MODE(tt, skas) (mode_tt ? (tt) : (skas))
#elif defined(CONFIG_MODE_SKAS) #elif defined(UML_CONFIG_MODE_SKAS)
#define CHOOSE_MODE(tt, skas) (skas) #define CHOOSE_MODE(tt, skas) (skas)
#elif defined(CONFIG_MODE_TT) #elif defined(UML_CONFIG_MODE_TT)
#define CHOOSE_MODE(tt, skas) (tt) #define CHOOSE_MODE(tt, skas) (tt)
#endif #endif
......
...@@ -15,12 +15,12 @@ struct frame_common { ...@@ -15,12 +15,12 @@ struct frame_common {
int sr_index; int sr_index;
int sr_relative; int sr_relative;
int sp_index; int sp_index;
struct arch_frame_data arch;
}; };
struct sc_frame { struct sc_frame {
struct frame_common common; struct frame_common common;
int sc_index; int sc_index;
struct arch_frame_data arch;
}; };
extern struct sc_frame signal_frame_sc; extern struct sc_frame signal_frame_sc;
...@@ -31,6 +31,8 @@ struct si_frame { ...@@ -31,6 +31,8 @@ struct si_frame {
struct frame_common common; struct frame_common common;
int sip_index; int sip_index;
int si_index; int si_index;
int ucp_index;
int uc_index;
}; };
extern struct si_frame signal_frame_si; extern struct si_frame signal_frame_si;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
enum { IRQ_READ, IRQ_WRITE }; enum { IRQ_READ, IRQ_WRITE };
extern void sigio_handler(int sig, struct uml_pt_regs *regs); extern void sigio_handler(int sig, union uml_pt_regs *regs);
extern int activate_fd(int irq, int fd, int type, void *dev_id); extern int activate_fd(int irq, int fd, int type, void *dev_id);
extern void free_irq_by_irq_and_dev(int irq, void *dev_id); extern void free_irq_by_irq_and_dev(int irq, void *dev_id);
extern void free_irq_by_fd(int fd); extern void free_irq_by_fd(int fd);
......
...@@ -47,7 +47,7 @@ extern void free_stack(unsigned long stack, int order); ...@@ -47,7 +47,7 @@ extern void free_stack(unsigned long stack, int order);
extern void add_input_request(int op, void (*proc)(int), void *arg); extern void add_input_request(int op, void (*proc)(int), void *arg);
extern int sys_execve(char *file, char **argv, char **env); extern int sys_execve(char *file, char **argv, char **env);
extern char *current_cmd(void); extern char *current_cmd(void);
extern void timer_handler(int sig, struct uml_pt_regs *regs); extern void timer_handler(int sig, union uml_pt_regs *regs);
extern int set_signals(int enable); extern int set_signals(int enable);
extern void force_sigbus(void); extern void force_sigbus(void);
extern int pid_to_processor_id(int pid); extern int pid_to_processor_id(int pid);
...@@ -64,7 +64,7 @@ extern void *syscall_sp(void *t); ...@@ -64,7 +64,7 @@ extern void *syscall_sp(void *t);
extern void syscall_trace(void); extern void syscall_trace(void);
extern int hz(void); extern int hz(void);
extern void idle_timer(void); extern void idle_timer(void);
extern unsigned int do_IRQ(int irq, struct uml_pt_regs *regs); extern unsigned int do_IRQ(int irq, union uml_pt_regs *regs);
extern int external_pid(void *t); extern int external_pid(void *t);
extern int pid_to_processor_id(int pid); extern int pid_to_processor_id(int pid);
extern void boot_timer_handler(int sig); extern void boot_timer_handler(int sig);
...@@ -77,10 +77,10 @@ extern int init_ptrace_proxy(int idle_pid, int startup, int stop); ...@@ -77,10 +77,10 @@ extern int init_ptrace_proxy(int idle_pid, int startup, int stop);
extern int init_parent_proxy(int pid); extern int init_parent_proxy(int pid);
extern int singlestepping(void *t); extern int singlestepping(void *t);
extern void check_stack_overflow(void *ptr); extern void check_stack_overflow(void *ptr);
extern void relay_signal(int sig, struct uml_pt_regs *regs); extern void relay_signal(int sig, union uml_pt_regs *regs);
extern void not_implemented(void); extern void not_implemented(void);
extern int user_context(unsigned long sp); extern int user_context(unsigned long sp);
extern void timer_irq(struct uml_pt_regs *regs); extern void timer_irq(union uml_pt_regs *regs);
extern void unprotect_stack(unsigned long stack); extern void unprotect_stack(unsigned long stack);
extern void do_uml_exitcalls(void); extern void do_uml_exitcalls(void);
extern int attach_debugger(int idle_pid, int pid, int stop); extern int attach_debugger(int idle_pid, int pid, int stop);
...@@ -101,7 +101,7 @@ extern void *get_init_task(void); ...@@ -101,7 +101,7 @@ extern void *get_init_task(void);
extern int clear_user_proc(void *buf, int size); extern int clear_user_proc(void *buf, int size);
extern int copy_to_user_proc(void *to, void *from, int size); extern int copy_to_user_proc(void *to, void *from, int size);
extern int copy_from_user_proc(void *to, void *from, int size); extern int copy_from_user_proc(void *to, void *from, int size);
extern void bus_handler(int sig, struct uml_pt_regs *regs); extern void bus_handler(int sig, union uml_pt_regs *regs);
extern long execute_syscall(void *r); extern long execute_syscall(void *r);
extern int smp_sigio_handler(void); extern int smp_sigio_handler(void);
extern void *get_current(void); extern void *get_current(void);
......
...@@ -7,30 +7,35 @@ ...@@ -7,30 +7,35 @@
#ifndef __MCONSOLE_H__ #ifndef __MCONSOLE_H__
#define __MCONSOLE_H__ #define __MCONSOLE_H__
#ifndef __KERNEL__
#include <stdint.h>
#define u32 uint32_t
#endif
#define MCONSOLE_MAGIC (0xcafebabe) #define MCONSOLE_MAGIC (0xcafebabe)
#define MCONSOLE_MAX_DATA (512) #define MCONSOLE_MAX_DATA (512)
#define MCONSOLE_VERSION 2 #define MCONSOLE_VERSION 2
struct mconsole_request { struct mconsole_request {
unsigned long magic; u32 magic;
int version; u32 version;
int len; u32 len;
char data[MCONSOLE_MAX_DATA]; char data[MCONSOLE_MAX_DATA];
}; };
struct mconsole_reply { struct mconsole_reply {
int err; u32 err;
int more; u32 more;
int len; u32 len;
char data[MCONSOLE_MAX_DATA]; char data[MCONSOLE_MAX_DATA];
}; };
struct mconsole_notify { struct mconsole_notify {
unsigned long magic; u32 magic;
int version; u32 version;
enum { MCONSOLE_SOCKET, MCONSOLE_PANIC, MCONSOLE_HANG, enum { MCONSOLE_SOCKET, MCONSOLE_PANIC, MCONSOLE_HANG,
MCONSOLE_USER_NOTIFY } type; MCONSOLE_USER_NOTIFY } type;
int len; u32 len;
char data[MCONSOLE_MAX_DATA]; char data[MCONSOLE_MAX_DATA];
}; };
......
...@@ -8,11 +8,11 @@ ...@@ -8,11 +8,11 @@
#include "uml-config.h" #include "uml-config.h"
#ifdef CONFIG_MODE_TT #ifdef UML_CONFIG_MODE_TT
#include "../kernel/tt/include/mode.h" #include "../kernel/tt/include/mode.h"
#endif #endif
#ifdef CONFIG_MODE_SKAS #ifdef UML_CONFIG_MODE_SKAS
#include "../kernel/skas/include/mode.h" #include "../kernel/skas/include/mode.h"
#endif #endif
......
...@@ -25,9 +25,11 @@ struct openflags { ...@@ -25,9 +25,11 @@ struct openflags {
unsigned int t : 1; /* O_TRUNC */ unsigned int t : 1; /* O_TRUNC */
unsigned int a : 1; /* O_APPEND */ unsigned int a : 1; /* O_APPEND */
unsigned int e : 1; /* O_EXCL */ unsigned int e : 1; /* O_EXCL */
unsigned int cl : 1; /* FD_CLOEXEC */
}; };
#define OPENFLAGS() ((struct openflags) { r : 0, w : 0, c : 0, s : 0 }) #define OPENFLAGS() ((struct openflags) { .r = 0, .w = 0, .s = 0, .c = 0, \
.t = 0, .a = 0, .e = 0, .cl = 0 })
static inline struct openflags of_read(struct openflags flags) static inline struct openflags of_read(struct openflags flags)
{ {
...@@ -83,9 +85,16 @@ static inline struct openflags of_excl(struct openflags flags) ...@@ -83,9 +85,16 @@ static inline struct openflags of_excl(struct openflags flags)
return(flags); return(flags);
} }
static inline struct openflags of_cloexec(struct openflags flags)
{
flags.cl = 1;
return(flags);
}
extern int os_seek_file(int fd, __u64 offset); extern int os_seek_file(int fd, __u64 offset);
extern int os_open_file(char *file, struct openflags flags, int mode); extern int os_open_file(char *file, struct openflags flags, int mode);
extern int os_read_file(int fd, char *buf, int len); extern int os_read_file(int fd, void *buf, int len);
extern int os_write_file(int fd, void *buf, int count);
extern int os_file_size(char *file, long long *size_out); extern int os_file_size(char *file, long long *size_out);
extern int os_pipe(int *fd, int stream, int close_on_exec); extern int os_pipe(int *fd, int stream, int close_on_exec);
extern int os_set_fd_async(int fd, int owner); extern int os_set_fd_async(int fd, int owner);
...@@ -98,7 +107,6 @@ extern int create_unix_socket(char *file, int len); ...@@ -98,7 +107,6 @@ extern int create_unix_socket(char *file, int len);
extern int os_connect_socket(char *name); extern int os_connect_socket(char *name);
extern int os_file_type(char *file); extern int os_file_type(char *file);
extern int os_file_mode(char *file, struct openflags *mode_out); extern int os_file_mode(char *file, struct openflags *mode_out);
extern int os_write_file(int fd, char *buf, int count);
extern unsigned long os_process_pc(int pid); extern unsigned long os_process_pc(int pid);
extern int os_process_parent(int pid); extern int os_process_parent(int pid);
......
/* /*
* Copyright (C) 2001 Jeff Dike (jdike@karaya.com) * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
* Licensed under the GPL * Licensed under the GPL
*/ */
#ifndef __SIGNAL_KERN_H__ #ifndef __SIGNAL_KERN_H__
#define __SIGNAL_KERN_H__ #define __SIGNAL_KERN_H__
#include "sysdep/ptrace.h"
extern void signal_deliverer(int sig);
extern int probe_stack(unsigned long sp, int delta);
extern int have_signals(void *t); extern int have_signals(void *t);
#endif #endif
......
...@@ -7,7 +7,8 @@ ...@@ -7,7 +7,8 @@
#define __FRAME_I386_H #define __FRAME_I386_H
struct arch_frame_data_raw { struct arch_frame_data_raw {
unsigned long sc_end; unsigned long fp_start;
unsigned long sr;
}; };
struct arch_frame_data { struct arch_frame_data {
......
...@@ -16,6 +16,15 @@ static inline void *sp_to_sc(unsigned long sp) ...@@ -16,6 +16,15 @@ static inline void *sp_to_sc(unsigned long sp)
return((void *) sp); return((void *) sp);
} }
static inline void *sp_to_uc(unsigned long sp)
{
unsigned long uc;
uc = sp + signal_frame_si.uc_index -
signal_frame_si.common.sp_index - 4;
return((void *) uc);
}
static inline void *sp_to_rt_sc(unsigned long sp) static inline void *sp_to_rt_sc(unsigned long sp)
{ {
unsigned long sc; unsigned long sc;
...@@ -42,7 +51,7 @@ static inline void *sp_to_rt_mask(unsigned long sp) ...@@ -42,7 +51,7 @@ static inline void *sp_to_rt_mask(unsigned long sp)
mask = sp - signal_frame_si.common.sp_index + mask = sp - signal_frame_si.common.sp_index +
signal_frame_si.common.len + signal_frame_si.common.len +
sc_size(&signal_frame_sc.arch) - 4; sc_size(&signal_frame_si.common.arch) - 4;
return((void *) mask); return((void *) mask);
} }
......
...@@ -18,26 +18,35 @@ ...@@ -18,26 +18,35 @@
* setup_arch_frame uses that data to figure out what * setup_arch_frame uses that data to figure out what
* arch_frame_data.fpstate_size should be. It really has no idea, since it's * arch_frame_data.fpstate_size should be. It really has no idea, since it's
* not allowed to do sizeof(struct fpstate) but it's safe to consider that it's * not allowed to do sizeof(struct fpstate) but it's safe to consider that it's
* everything from the end of the sgcontext up to the top of the stack. So, * everything from the end of the sigcontext up to the top of the stack. So,
* it masks off the page number to get the offset within the page and subtracts * it masks off the page number to get the offset within the page and subtracts
* that from the page size, and that's how big the fpstate struct will be * that from the page size, and that's how big the fpstate struct will be
* considered to be. * considered to be.
*/ */
static inline void setup_arch_frame_raw(struct arch_frame_data_raw *data, static inline void setup_arch_frame_raw(struct arch_frame_data_raw *data,
struct sigcontext *sc) void *end, unsigned long srp)
{ {
data->sc_end = (unsigned long) sc; unsigned long sr = *((unsigned long *) srp);
data->sc_end += sizeof(*sc);
data->fp_start = (unsigned long) end;
if((sr & PAGE_MASK) == ((unsigned long) end & PAGE_MASK))
data->sr = sr;
else data->sr = 0;
} }
static inline void setup_arch_frame(struct arch_frame_data_raw *in, static inline void setup_arch_frame(struct arch_frame_data_raw *in,
struct arch_frame_data *out) struct arch_frame_data *out)
{ {
unsigned long fpstate_start = in->sc_end; unsigned long fpstate_start = in->fp_start;
fpstate_start &= ~PAGE_MASK; if(in->sr == 0){
out->fpstate_size = PAGE_SIZE - fpstate_start; fpstate_start &= ~PAGE_MASK;
out->fpstate_size = PAGE_SIZE - fpstate_start;
}
else {
out->fpstate_size = in->sr - fpstate_start;
}
} }
/* This figures out where on the stack the SA_RESTORER function address /* This figures out where on the stack the SA_RESTORER function address
......
...@@ -8,78 +8,100 @@ ...@@ -8,78 +8,100 @@
#include "uml-config.h" #include "uml-config.h"
#ifdef CONFIG_MODE_TT #ifdef UML_CONFIG_MODE_TT
#include "ptrace-tt.h" #include "ptrace-tt.h"
#endif #endif
#ifdef CONFIG_MODE_SKAS #ifdef UML_CONFIG_MODE_SKAS
#include "ptrace-skas.h" #include "ptrace-skas.h"
#endif #endif
#include "choose-mode.h" #include "choose-mode.h"
struct uml_pt_regs { union uml_pt_regs {
unsigned long args[6]; #ifdef UML_CONFIG_MODE_TT
long syscall; struct tt_regs {
int is_user; long syscall;
union { void *sc;
#ifdef CONFIG_MODE_TT } tt;
void *tt;
#endif #endif
#ifdef CONFIG_MODE_SKAS #ifdef UML_CONFIG_MODE_SKAS
struct { struct skas_regs {
unsigned long regs[HOST_FRAME_SIZE]; unsigned long regs[HOST_FRAME_SIZE];
unsigned long fp[HOST_FP_SIZE]; unsigned long fp[HOST_FP_SIZE];
unsigned long xfp[HOST_XFP_SIZE]; unsigned long xfp[HOST_XFP_SIZE];
unsigned long fault_addr; unsigned long fault_addr;
unsigned long fault_type; unsigned long fault_type;
unsigned long trap_type; unsigned long trap_type;
} skas; long syscall;
int is_user;
} skas;
#endif #endif
} mode;
}; };
#define EMPTY_UML_PT_REGS { \ #define EMPTY_UML_PT_REGS { }
syscall : -1, \
args : { [0 ... 5] = 0 }, \
is_user : 0 }
extern int mode_tt; extern int mode_tt;
#define UPT_SC(r) ((r)->tt.sc)
#define UPT_IP(r) \ #define UPT_IP(r) \
CHOOSE_MODE(SC_IP((r)->mode.tt), REGS_IP((r)->mode.skas.regs)) CHOOSE_MODE(SC_IP(UPT_SC(r)), REGS_IP((r)->skas.regs))
#define UPT_SP(r) \ #define UPT_SP(r) \
CHOOSE_MODE(SC_SP((r)->mode.tt), REGS_SP((r)->mode.skas.regs)) CHOOSE_MODE(SC_SP(UPT_SC(r)), REGS_SP((r)->skas.regs))
#define UPT_EFLAGS(r) \ #define UPT_EFLAGS(r) \
CHOOSE_MODE(SC_EFLAGS((r)->mode.tt), REGS_EFLAGS((r)->mode.skas.regs)) CHOOSE_MODE(SC_EFLAGS(UPT_SC(r)), REGS_EFLAGS((r)->skas.regs))
#define UPT_EAX(r) \ #define UPT_EAX(r) \
CHOOSE_MODE(SC_EAX((r)->mode.tt), REGS_EAX((r)->mode.skas.regs)) CHOOSE_MODE(SC_EAX(UPT_SC(r)), REGS_EAX((r)->skas.regs))
#define UPT_EBX(r) \ #define UPT_EBX(r) \
CHOOSE_MODE(SC_EBX((r)->mode.tt), REGS_EBX((r)->mode.skas.regs)) CHOOSE_MODE(SC_EBX(UPT_SC(r)), REGS_EBX((r)->skas.regs))
#define UPT_ECX(r) \ #define UPT_ECX(r) \
CHOOSE_MODE(SC_ECX((r)->mode.tt), REGS_ECX((r)->mode.skas.regs)) CHOOSE_MODE(SC_ECX(UPT_SC(r)), REGS_ECX((r)->skas.regs))
#define UPT_EDX(r) \ #define UPT_EDX(r) \
CHOOSE_MODE(SC_EDX((r)->mode.tt), REGS_EDX((r)->mode.skas.regs)) CHOOSE_MODE(SC_EDX(UPT_SC(r)), REGS_EDX((r)->skas.regs))
#define UPT_ESI(r) \ #define UPT_ESI(r) \
CHOOSE_MODE(SC_ESI((r)->mode.tt), REGS_ESI((r)->mode.skas.regs)) CHOOSE_MODE(SC_ESI(UPT_SC(r)), REGS_ESI((r)->skas.regs))
#define UPT_EDI(r) \ #define UPT_EDI(r) \
CHOOSE_MODE(SC_EDI((r)->mode.tt), REGS_EDI((r)->mode.skas.regs)) CHOOSE_MODE(SC_EDI(UPT_SC(r)), REGS_EDI((r)->skas.regs))
#define UPT_EBP(r) \ #define UPT_EBP(r) \
CHOOSE_MODE(SC_EBP((r)->mode.tt), REGS_EBP((r)->mode.skas.regs)) CHOOSE_MODE(SC_EBP(UPT_SC(r)), REGS_EBP((r)->skas.regs))
#define UPT_ORIG_EAX(r) ((r)->syscall) #define UPT_ORIG_EAX(r) \
CHOOSE_MODE((r)->tt.syscall, (r)->skas.syscall)
#define UPT_CS(r) \ #define UPT_CS(r) \
CHOOSE_MODE(SC_CS((r)->mode.tt), REGS_CS((r)->mode.skas.regs)) CHOOSE_MODE(SC_CS(UPT_SC(r)), REGS_CS((r)->skas.regs))
#define UPT_SS(r) \ #define UPT_SS(r) \
CHOOSE_MODE(SC_SS((r)->mode.tt), REGS_SS((r)->mode.skas.regs)) CHOOSE_MODE(SC_SS(UPT_SC(r)), REGS_SS((r)->skas.regs))
#define UPT_DS(r) \ #define UPT_DS(r) \
CHOOSE_MODE(SC_DS((r)->mode.tt), REGS_DS((r)->mode.skas.regs)) CHOOSE_MODE(SC_DS(UPT_SC(r)), REGS_DS((r)->skas.regs))
#define UPT_ES(r) \ #define UPT_ES(r) \
CHOOSE_MODE(SC_ES((r)->mode.tt), REGS_ES((r)->mode.skas.regs)) CHOOSE_MODE(SC_ES(UPT_SC(r)), REGS_ES((r)->skas.regs))
#define UPT_FS(r) \ #define UPT_FS(r) \
CHOOSE_MODE(SC_FS((r)->mode.tt), REGS_FS((r)->mode.skas.regs)) CHOOSE_MODE(SC_FS(UPT_SC(r)), REGS_FS((r)->skas.regs))
#define UPT_GS(r) \ #define UPT_GS(r) \
CHOOSE_MODE(SC_GS((r)->mode.tt), REGS_GS((r)->mode.skas.regs)) CHOOSE_MODE(SC_GS(UPT_SC(r)), REGS_GS((r)->skas.regs))
#define UPT_SC(r) ((r)->mode.tt)
#define UPT_SYSCALL_ARG1(r) UPT_EBX(r)
#define UPT_SYSCALL_ARG2(r) UPT_ECX(r)
#define UPT_SYSCALL_ARG3(r) UPT_EDX(r)
#define UPT_SYSCALL_ARG4(r) UPT_ESI(r)
#define UPT_SYSCALL_ARG5(r) UPT_EDI(r)
#define UPT_SYSCALL_ARG6(r) UPT_EBP(r)
extern int user_context(unsigned long sp);
#define UPT_IS_USER(r) \
CHOOSE_MODE(user_context(UPT_SP(r)), (r)->skas.is_user)
struct syscall_args {
unsigned long args[6];
};
#define SYSCALL_ARGS(r) ((struct syscall_args) \
{ .args = { UPT_SYSCALL_ARG1(r), \
UPT_SYSCALL_ARG2(r), \
UPT_SYSCALL_ARG3(r), \
UPT_SYSCALL_ARG4(r), \
UPT_SYSCALL_ARG5(r), \
UPT_SYSCALL_ARG6(r) } } )
#define UPT_REG(regs, reg) \ #define UPT_REG(regs, reg) \
({ unsigned long val; \ ({ unsigned long val; \
...@@ -136,28 +158,26 @@ extern int mode_tt; ...@@ -136,28 +158,26 @@ extern int mode_tt;
} while (0) } while (0)
#define UPT_SET_SYSCALL_RETURN(r, res) \ #define UPT_SET_SYSCALL_RETURN(r, res) \
CHOOSE_MODE(SC_SET_SYSCALL_RETURN((r)->mode.tt, (res)), \ CHOOSE_MODE(SC_SET_SYSCALL_RETURN(UPT_SC(r), (res)), \
REGS_SET_SYSCALL_RETURN((r)->mode.skas.regs, (res))) REGS_SET_SYSCALL_RETURN((r)->skas.regs, (res)))
#define UPT_RESTART_SYSCALL(r) \ #define UPT_RESTART_SYSCALL(r) \
CHOOSE_MODE(SC_RESTART_SYSCALL((r)->mode.tt), \ CHOOSE_MODE(SC_RESTART_SYSCALL(UPT_SC(r)), \
REGS_RESTART_SYSCALL((r)->mode.skas.regs)) REGS_RESTART_SYSCALL((r)->skas.regs))
#define UPT_ORIG_SYSCALL(r) UPT_EAX(r) #define UPT_ORIG_SYSCALL(r) UPT_EAX(r)
#define UPT_SYSCALL_NR(r) ((r)->syscall) #define UPT_SYSCALL_NR(r) UPT_ORIG_EAX(r)
#define UPT_SYSCALL_RET(r) UPT_EAX(r) #define UPT_SYSCALL_RET(r) UPT_EAX(r)
#define UPT_SEGV_IS_FIXABLE(r) \ #define UPT_SEGV_IS_FIXABLE(r) \
CHOOSE_MODE(SC_SEGV_IS_FIXABLE(r->mode.tt), \ CHOOSE_MODE(SC_SEGV_IS_FIXABLE(UPT_SC(r)), \
REGS_SEGV_IS_FIXABLE(&r->mode.skas)) REGS_SEGV_IS_FIXABLE(&r->skas))
#define UPT_FAULT_ADDR(r) \ #define UPT_FAULT_ADDR(r) \
CHOOSE_MODE(SC_FAULT_ADDR(r->mode.tt), \ CHOOSE_MODE(SC_FAULT_ADDR(UPT_SC(r)), REGS_FAULT_ADDR(&r->skas))
REGS_FAULT_ADDR(&r->mode.skas))
#define UPT_FAULT_WRITE(r) \ #define UPT_FAULT_WRITE(r) \
CHOOSE_MODE(SC_FAULT_WRITE(r->mode.tt), \ CHOOSE_MODE(SC_FAULT_WRITE(UPT_SC(r)), REGS_FAULT_WRITE(&r->skas))
REGS_FAULT_WRITE(&r->mode.skas))
#endif #endif
......
...@@ -33,34 +33,6 @@ ...@@ -33,34 +33,6 @@
#define SC_SEGV_IS_FIXABLE(sc) (SEGV_IS_FIXABLE(SC_TRAPNO(sc))) #define SC_SEGV_IS_FIXABLE(sc) (SEGV_IS_FIXABLE(SC_TRAPNO(sc)))
#ifdef CONFIG_MODE_TT
/* XXX struct sigcontext needs declaring by now */
static inline void sc_to_regs(struct uml_pt_regs *regs, struct sigcontext *sc,
unsigned long syscall)
{
regs->syscall = syscall;
regs->args[0] = SC_EBX(sc);
regs->args[1] = SC_ECX(sc);
regs->args[2] = SC_EDX(sc);
regs->args[3] = SC_ESI(sc);
regs->args[4] = SC_EDI(sc);
regs->args[5] = SC_EBP(sc);
}
#endif
#ifdef CONFIG_MODE_SKAS
static inline void host_to_regs(struct uml_pt_regs *regs)
{
regs->syscall = UPT_ORIG_EAX(regs);
regs->args[0] = UPT_EBX(regs);
regs->args[1] = UPT_ECX(regs);
regs->args[2] = UPT_EDX(regs);
regs->args[3] = UPT_ESI(regs);
regs->args[4] = UPT_EDI(regs);
regs->args[5] = UPT_EBP(regs);
}
#endif
extern unsigned long *sc_sigmask(void *sc_ptr); extern unsigned long *sc_sigmask(void *sc_ptr);
extern int sc_get_fpregs(unsigned long buf, void *sc_ptr); extern int sc_get_fpregs(unsigned long buf, void *sc_ptr);
......
...@@ -4,10 +4,12 @@ ...@@ -4,10 +4,12 @@
*/ */
#include "asm/unistd.h" #include "asm/unistd.h"
#include "sysdep/ptrace.h"
typedef long syscall_handler_t(struct pt_regs); typedef long syscall_handler_t(struct pt_regs);
#define EXECUTE_SYSCALL(syscall, regs) (*sys_call_table[syscall])(*regs); #define EXECUTE_SYSCALL(syscall, regs) \
((long (*)(struct syscall_args)) (*sys_call_table[syscall]))(SYSCALL_ARGS(&regs->regs))
extern syscall_handler_t sys_modify_ldt; extern syscall_handler_t sys_modify_ldt;
extern syscall_handler_t old_mmap_i386; extern syscall_handler_t old_mmap_i386;
......
...@@ -11,7 +11,7 @@ extern void switch_timers(int to_real); ...@@ -11,7 +11,7 @@ extern void switch_timers(int to_real);
extern void set_interval(int timer_type); extern void set_interval(int timer_type);
extern void idle_sleep(int secs); extern void idle_sleep(int secs);
extern void enable_timer(void); extern void enable_timer(void);
extern void time_lock(void); extern unsigned long time_lock(void);
extern void time_unlock(void); extern void time_unlock(unsigned long);
#endif #endif
...@@ -3,8 +3,13 @@ ...@@ -3,8 +3,13 @@
* Licensed under the GPL * Licensed under the GPL
*/ */
#ifndef __UMID_H__
#define __UMID_H__
extern int umid_file_name(char *name, char *buf, int len); extern int umid_file_name(char *name, char *buf, int len);
#endif
/* /*
* Overrides for Emacs so that we follow Linus's tabbing style. * Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically * Emacs will notice this stuff at the end of the file and automatically
......
/*
* Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
* Licensed under the GPL
*/
#ifndef __UML_UACCESS_H__
#define __UML_UACCESS_H__
extern int __do_copy_to_user(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher);
extern unsigned long __do_user_copy(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher,
void (*op)(void *to, const void *from,
int n), int *faulted_out);
void __do_copy(void *to, const void *from, int n);
#endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
...@@ -24,7 +24,7 @@ struct cpu_task { ...@@ -24,7 +24,7 @@ struct cpu_task {
extern struct cpu_task cpu_tasks[]; extern struct cpu_task cpu_tasks[];
struct signal_info { struct signal_info {
void (*handler)(int, struct uml_pt_regs *); void (*handler)(int, union uml_pt_regs *);
int is_irq; int is_irq;
}; };
...@@ -86,7 +86,7 @@ extern void check_sigio(void); ...@@ -86,7 +86,7 @@ extern void check_sigio(void);
extern int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr); extern int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr);
extern void write_sigio_workaround(void); extern void write_sigio_workaround(void);
extern void arch_check_bugs(void); extern void arch_check_bugs(void);
extern int arch_handle_signal(int sig, struct uml_pt_regs *regs); extern int arch_handle_signal(int sig, union uml_pt_regs *regs);
extern int arch_fixup(unsigned long address, void *sc_ptr); extern int arch_fixup(unsigned long address, void *sc_ptr);
extern void forward_pending_sigio(int target); extern void forward_pending_sigio(int target);
extern int can_do_skas(void); extern int can_do_skas(void);
......
...@@ -8,8 +8,8 @@ obj-y = checksum.o config.o exec_kern.o exitcode.o frame_kern.o frame.o \ ...@@ -8,8 +8,8 @@ obj-y = checksum.o config.o exec_kern.o exitcode.o frame_kern.o frame.o \
process.o process_kern.o ptrace.o reboot.o resource.o sigio_user.o \ process.o process_kern.o ptrace.o reboot.o resource.o sigio_user.o \
sigio_kern.o signal_kern.o signal_user.o smp.o syscall_kern.o \ sigio_kern.o signal_kern.o signal_user.o smp.o syscall_kern.o \
syscall_user.o sysrq.o sys_call_table.o tempfile.o time.o \ syscall_user.o sysrq.o sys_call_table.o tempfile.o time.o \
time_kern.o tlb.o trap_kern.o trap_user.o um_arch.o \ time_kern.o tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o \
umid.o user_util.o umid.o user_syms.o user_util.o
obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o
obj-$(CONFIG_GPROF) += gprof_syms.o obj-$(CONFIG_GPROF) += gprof_syms.o
...@@ -21,9 +21,6 @@ obj-$(CONFIG_MODE_SKAS) += skas/ ...@@ -21,9 +21,6 @@ obj-$(CONFIG_MODE_SKAS) += skas/
user-objs-$(CONFIG_TTY_LOG) += tty_log.o user-objs-$(CONFIG_TTY_LOG) += tty_log.o
# user_syms.o not included here because Rules.make has its own ideas about
# building anything in export-objs
USER_OBJS := $(filter %_user.o,$(obj-y)) $(user-objs-y) config.o helper.o \ USER_OBJS := $(filter %_user.o,$(obj-y)) $(user-objs-y) config.o helper.o \
process.o tempfile.o time.o tty_log.o umid.o user_util.o user_syms.o process.o tempfile.o time.o tty_log.o umid.o user_util.o user_syms.o
USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
...@@ -42,7 +39,7 @@ CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \ ...@@ -42,7 +39,7 @@ CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \
CFLAGS_frame.o := $(patsubst -fomit-frame-pointer,,$(USER_CFLAGS)) CFLAGS_frame.o := $(patsubst -fomit-frame-pointer,,$(USER_CFLAGS))
$(USER_OBJS) : %.o: %.c $(USER_OBJS) : %.o: %.c
$(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $<
# This has to be separate because it needs be compiled with frame pointers # This has to be separate because it needs be compiled with frame pointers
# regardless of how the rest of the kernel is built. # regardless of how the rest of the kernel is built.
......
...@@ -78,7 +78,8 @@ static int capture_stack(int (*child)(void *arg), void *arg, void *sp, ...@@ -78,7 +78,8 @@ static int capture_stack(int (*child)(void *arg), void *arg, void *sp,
/* It has outlived its usefulness, so continue it so it can exit */ /* It has outlived its usefulness, so continue it so it can exit */
if(ptrace(PTRACE_CONT, pid, 0, 0) < 0){ if(ptrace(PTRACE_CONT, pid, 0, 0) < 0){
printf("capture_stack : mmap failed - errno = %d\n", errno); printf("capture_stack : PTRACE_CONT failed - errno = %d\n",
errno);
exit(1); exit(1);
} }
if(waitpid(pid, &status, 0) < 0){ if(waitpid(pid, &status, 0) < 0){
...@@ -110,6 +111,7 @@ struct common_raw { ...@@ -110,6 +111,7 @@ struct common_raw {
unsigned long sig; unsigned long sig;
unsigned long sr; unsigned long sr;
unsigned long sp; unsigned long sp;
struct arch_frame_data_raw arch;
}; };
#define SA_RESTORER (0x04000000) #define SA_RESTORER (0x04000000)
...@@ -173,7 +175,6 @@ struct sc_frame_raw { ...@@ -173,7 +175,6 @@ struct sc_frame_raw {
struct common_raw common; struct common_raw common;
unsigned long sc; unsigned long sc;
int restorer; int restorer;
struct arch_frame_data_raw arch;
}; };
/* Changed only during early boot */ /* Changed only during early boot */
...@@ -185,7 +186,8 @@ static void sc_handler(int sig, struct sigcontext sc) ...@@ -185,7 +186,8 @@ static void sc_handler(int sig, struct sigcontext sc)
raw_sc->common.sr = frame_restorer(); raw_sc->common.sr = frame_restorer();
raw_sc->common.sp = frame_sp(); raw_sc->common.sp = frame_sp();
raw_sc->sc = (unsigned long) &sc; raw_sc->sc = (unsigned long) &sc;
setup_arch_frame_raw(&raw_sc->arch, &sc); setup_arch_frame_raw(&raw_sc->common.arch, &sc + 1, raw_sc->common.sr);
os_stop_process(os_getpid()); os_stop_process(os_getpid());
kill(getpid(), SIGKILL); kill(getpid(), SIGKILL);
} }
...@@ -205,18 +207,25 @@ struct si_frame_raw { ...@@ -205,18 +207,25 @@ struct si_frame_raw {
struct common_raw common; struct common_raw common;
unsigned long sip; unsigned long sip;
unsigned long si; unsigned long si;
unsigned long ucp;
unsigned long uc;
}; };
/* Changed only during early boot */ /* Changed only during early boot */
static struct si_frame_raw *raw_si = NULL; static struct si_frame_raw *raw_si = NULL;
static void si_handler(int sig, siginfo_t *si) static void si_handler(int sig, siginfo_t *si, struct ucontext *ucontext)
{ {
raw_si->common.sig = (unsigned long) &sig; raw_si->common.sig = (unsigned long) &sig;
raw_si->common.sr = frame_restorer(); raw_si->common.sr = frame_restorer();
raw_si->common.sp = frame_sp(); raw_si->common.sp = frame_sp();
raw_si->sip = (unsigned long) &si; raw_si->sip = (unsigned long) &si;
raw_si->si = (unsigned long) si; raw_si->si = (unsigned long) si;
raw_si->ucp = (unsigned long) &ucontext;
raw_si->uc = (unsigned long) ucontext;
setup_arch_frame_raw(&raw_si->common.arch,
ucontext->uc_mcontext.fpregs, raw_si->common.sr);
os_stop_process(os_getpid()); os_stop_process(os_getpid());
kill(getpid(), SIGKILL); kill(getpid(), SIGKILL);
} }
...@@ -292,7 +301,7 @@ void capture_signal_stack(void) ...@@ -292,7 +301,7 @@ void capture_signal_stack(void)
&signal_frame_sc.common); &signal_frame_sc.common);
signal_frame_sc.sc_index = raw_sc.sc - base; signal_frame_sc.sc_index = raw_sc.sc - base;
setup_arch_frame(&raw_sc.arch, &signal_frame_sc.arch); setup_arch_frame(&raw_sc.common.arch, &signal_frame_sc.common.arch);
/* Ditto for the sigcontext, sigrestorer layout */ /* Ditto for the sigcontext, sigrestorer layout */
raw_sc.restorer = 1; raw_sc.restorer = 1;
...@@ -300,6 +309,7 @@ void capture_signal_stack(void) ...@@ -300,6 +309,7 @@ void capture_signal_stack(void)
(void *) top, sigstack, PAGE_SIZE, (void *) top, sigstack, PAGE_SIZE,
&signal_frame_sc_sr.common); &signal_frame_sc_sr.common);
signal_frame_sc_sr.sc_index = raw_sc.sc - base; signal_frame_sc_sr.sc_index = raw_sc.sc - base;
setup_arch_frame(&raw_sc.common.arch, &signal_frame_sc_sr.common.arch);
/* And the siginfo layout */ /* And the siginfo layout */
...@@ -308,6 +318,9 @@ void capture_signal_stack(void) ...@@ -308,6 +318,9 @@ void capture_signal_stack(void)
&signal_frame_si.common); &signal_frame_si.common);
signal_frame_si.sip_index = raw_si.sip - base; signal_frame_si.sip_index = raw_si.sip - base;
signal_frame_si.si_index = raw_si.si - base; signal_frame_si.si_index = raw_si.si - base;
signal_frame_si.ucp_index = raw_si.ucp - base;
signal_frame_si.uc_index = raw_si.uc - base;
setup_arch_frame(&raw_si.common.arch, &signal_frame_si.common.arch);
if((munmap(stack, PAGE_SIZE) < 0) || if((munmap(stack, PAGE_SIZE) < 0) ||
(munmap(sigstack, PAGE_SIZE) < 0)){ (munmap(sigstack, PAGE_SIZE) < 0)){
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "asm/ptrace.h" #include "asm/ptrace.h"
#include "asm/uaccess.h" #include "asm/uaccess.h"
#include "asm/signal.h" #include "asm/signal.h"
#include "asm/uaccess.h"
#include "asm/ucontext.h"
#include "frame_kern.h" #include "frame_kern.h"
#include "sigcontext.h" #include "sigcontext.h"
#include "sysdep/ptrace.h" #include "sysdep/ptrace.h"
...@@ -27,48 +29,62 @@ static int copy_restorer(void (*restorer)(void), unsigned long start, ...@@ -27,48 +29,62 @@ static int copy_restorer(void (*restorer)(void), unsigned long start,
sizeof(restorer))); sizeof(restorer)));
} }
static int copy_sc_to_user(void *to, struct pt_regs *from) static int copy_sc_to_user(void *to, void *fp, struct pt_regs *from,
struct arch_frame_data *arch)
{ {
return(CHOOSE_MODE(copy_sc_to_user_tt(to, from->regs.mode.tt, return(CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs),
&signal_frame_sc_sr.arch), arch),
copy_sc_to_user_skas(to, &from->regs, copy_sc_to_user_skas(to, fp, &from->regs,
current->thread.cr2, current->thread.cr2,
current->thread.err))); current->thread.err)));
} }
static int copy_ucontext_to_user(struct ucontext *uc, void *fp, sigset_t *set,
unsigned long sp)
{
int err = 0;
err |= put_user(current->sas_ss_sp, &uc->uc_stack.ss_sp);
err |= put_user(sas_ss_flags(sp), &uc->uc_stack.ss_flags);
err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size);
err |= copy_sc_to_user(&uc->uc_mcontext, fp, &current->thread.regs,
&signal_frame_si.common.arch);
err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set));
return(err);
}
int setup_signal_stack_si(unsigned long stack_top, int sig, int setup_signal_stack_si(unsigned long stack_top, int sig,
unsigned long handler, void (*restorer)(void), unsigned long handler, void (*restorer)(void),
struct pt_regs *regs, siginfo_t *info, struct pt_regs *regs, siginfo_t *info,
sigset_t *mask) sigset_t *mask)
{ {
unsigned long start, sc, sigs; unsigned long start;
void *sip; void *sip, *ucp, *fp;
int sig_size = _NSIG_WORDS * sizeof(unsigned long);
start = stack_top - signal_frame_si.common.len - start = stack_top - signal_frame_si.common.len;
sc_size(&signal_frame_sc.arch) - sig_size;
sip = (void *) (start + signal_frame_si.si_index); sip = (void *) (start + signal_frame_si.si_index);
sc = start + signal_frame_si.common.len; ucp = (void *) (start + signal_frame_si.uc_index);
sigs = sc + sc_size(&signal_frame_sc.arch); fp = (void *) (((unsigned long) ucp) + sizeof(struct ucontext));
if(restorer == NULL) if(restorer == NULL)
panic("setup_signal_stack_si - no restorer"); panic("setup_signal_stack_si - no restorer");
if(copy_sc_to_user((void *) sc, regs) || if(copy_to_user((void *) start, signal_frame_si.common.data,
copy_to_user((void *) start, signal_frame_si.common.data,
signal_frame_si.common.len) || signal_frame_si.common.len) ||
copy_to_user((void *) (start + signal_frame_si.common.sig_index), copy_to_user((void *) (start + signal_frame_si.common.sig_index),
&sig, sizeof(sig)) || &sig, sizeof(sig)) ||
copy_siginfo_to_user(sip, info) || copy_siginfo_to_user(sip, info) ||
copy_to_user((void *) (start + signal_frame_si.sip_index), &sip, copy_to_user((void *) (start + signal_frame_si.sip_index), &sip,
sizeof(sip)) || sizeof(sip)) ||
copy_to_user((void *) sigs, mask, sig_size) || copy_ucontext_to_user(ucp, fp, mask, PT_REGS_SP(regs)) ||
copy_to_user((void *) (start + signal_frame_si.ucp_index), &ucp,
sizeof(ucp)) ||
copy_restorer(restorer, start, signal_frame_si.common.sr_index, copy_restorer(restorer, start, signal_frame_si.common.sr_index,
signal_frame_si.common.sr_relative)) signal_frame_si.common.sr_relative))
return(1); return(1);
PT_REGS_IP(regs) = handler; PT_REGS_IP(regs) = handler;
PT_REGS_SP(regs) = start + signal_frame_sc.common.sp_index; PT_REGS_SP(regs) = start + signal_frame_si.common.sp_index;
return(0); return(0);
} }
...@@ -96,7 +112,8 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig, ...@@ -96,7 +112,8 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig,
if(copy_to_user((void *) start, frame->data, frame->len) || if(copy_to_user((void *) start, frame->data, frame->len) ||
copy_to_user((void *) (start + frame->sig_index), &sig, copy_to_user((void *) (start + frame->sig_index), &sig,
sizeof(sig)) || sizeof(sig)) ||
copy_sc_to_user(user_sc, regs) || copy_sc_to_user(user_sc, NULL, regs,
&signal_frame_sc.common.arch) ||
copy_to_user(sc_sigmask(user_sc), mask, sizeof(mask->sig[0])) || copy_to_user(sc_sigmask(user_sc), mask, sizeof(mask->sig[0])) ||
copy_to_user((void *) sigs, &mask->sig[1], sig_size) || copy_to_user((void *) sigs, &mask->sig[1], sig_size) ||
copy_restorer(restorer, start, frame->sr_index, frame->sr_relative)) copy_restorer(restorer, start, frame->sr_index, frame->sr_relative))
......
...@@ -271,7 +271,7 @@ void enable_irq(unsigned int irq) ...@@ -271,7 +271,7 @@ void enable_irq(unsigned int irq)
* SMP cross-CPU interrupts have their own specific * SMP cross-CPU interrupts have their own specific
* handlers). * handlers).
*/ */
unsigned int do_IRQ(int irq, struct uml_pt_regs *regs) unsigned int do_IRQ(int irq, union uml_pt_regs *regs)
{ {
/* /*
* 0 return value means that this irq is already being * 0 return value means that this irq is already being
......
...@@ -42,7 +42,7 @@ static int pollfds_size = 0; ...@@ -42,7 +42,7 @@ static int pollfds_size = 0;
extern int io_count, intr_count; extern int io_count, intr_count;
void sigio_handler(int sig, struct uml_pt_regs *regs) void sigio_handler(int sig, union uml_pt_regs *regs)
{ {
struct irq_fd *irq_fd, *next; struct irq_fd *irq_fd, *next;
int i, n; int i, n;
...@@ -128,15 +128,15 @@ int activate_fd(int irq, int fd, int type, void *dev_id) ...@@ -128,15 +128,15 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
if(type == IRQ_READ) events = POLLIN | POLLPRI; if(type == IRQ_READ) events = POLLIN | POLLPRI;
else events = POLLOUT; else events = POLLOUT;
*new_fd = ((struct irq_fd) { next : NULL, *new_fd = ((struct irq_fd) { .next = NULL,
id : dev_id, .id = dev_id,
fd : fd, .fd = fd,
type : type, .type = type,
irq : irq, .irq = irq,
pid : pid, .pid = pid,
events : events, .events = events,
current_events: 0, .current_events = 0,
freed : 0 } ); .freed = 0 } );
/* Critical section - locked by a spinlock because this stuff can /* Critical section - locked by a spinlock because this stuff can
* be changed from interrupt handlers. The stuff above is done * be changed from interrupt handlers. The stuff above is done
...@@ -191,9 +191,9 @@ int activate_fd(int irq, int fd, int type, void *dev_id) ...@@ -191,9 +191,9 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
if(type == IRQ_WRITE) if(type == IRQ_WRITE)
fd = -1; fd = -1;
pollfds[pollfds_num] = ((struct pollfd) { fd : fd, pollfds[pollfds_num] = ((struct pollfd) { .fd = fd,
events : events, .events = events,
revents : 0 }); .revents = 0 });
pollfds_num++; pollfds_num++;
*last_irq_ptr = new_fd; *last_irq_ptr = new_fd;
...@@ -265,8 +265,8 @@ static int same_irq_and_dev(struct irq_fd *irq, void *d) ...@@ -265,8 +265,8 @@ static int same_irq_and_dev(struct irq_fd *irq, void *d)
void free_irq_by_irq_and_dev(int irq, void *dev) void free_irq_by_irq_and_dev(int irq, void *dev)
{ {
struct irq_and_dev data = ((struct irq_and_dev) { irq : irq, struct irq_and_dev data = ((struct irq_and_dev) { .irq = irq,
dev : dev }); .dev = dev });
free_irq_by_cb(same_irq_and_dev, &data); free_irq_by_cb(same_irq_and_dev, &data);
} }
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "asm/processor.h" #include "asm/processor.h"
#include "asm/unistd.h" #include "asm/unistd.h"
#include "asm/pgalloc.h" #include "asm/pgalloc.h"
#include "asm/pgtable.h"
#include "asm/page.h" #include "asm/page.h"
#include "asm/tlbflush.h" #include "asm/tlbflush.h"
#include "kern_util.h" #include "kern_util.h"
...@@ -42,7 +43,11 @@ EXPORT_SYMBOL(page_to_phys); ...@@ -42,7 +43,11 @@ EXPORT_SYMBOL(page_to_phys);
EXPORT_SYMBOL(phys_to_page); EXPORT_SYMBOL(phys_to_page);
EXPORT_SYMBOL(high_physmem); EXPORT_SYMBOL(high_physmem);
EXPORT_SYMBOL(empty_zero_page); EXPORT_SYMBOL(empty_zero_page);
EXPORT_SYMBOL(um_virt_to_phys);
EXPORT_SYMBOL(mode_tt);
EXPORT_SYMBOL(handle_page_fault);
EXPORT_SYMBOL(os_getpid);
EXPORT_SYMBOL(os_open_file); EXPORT_SYMBOL(os_open_file);
EXPORT_SYMBOL(os_read_file); EXPORT_SYMBOL(os_read_file);
EXPORT_SYMBOL(os_write_file); EXPORT_SYMBOL(os_write_file);
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "init.h" #include "init.h"
#include "os.h" #include "os.h"
#include "mode_kern.h" #include "mode_kern.h"
#include "uml_uaccess.h"
/* Changed during early boot */ /* Changed during early boot */
pgd_t swapper_pg_dir[1024]; pgd_t swapper_pg_dir[1024];
...@@ -231,11 +232,11 @@ static int setup_one_range(int fd, char *driver, unsigned long start, ...@@ -231,11 +232,11 @@ static int setup_one_range(int fd, char *driver, unsigned long start,
panic("Failed to allocating mem_region"); panic("Failed to allocating mem_region");
} }
*region = ((struct mem_region) { driver : driver, *region = ((struct mem_region) { .driver = driver,
start_pfn : pfn, .start_pfn = pfn,
start : start, .start = start,
len : len, .len = len,
fd : fd } ); .fd = fd } );
regions[i] = region; regions[i] = region;
out: out:
up(&regions_sem); up(&regions_sem);
...@@ -414,8 +415,28 @@ __uml_setup("mem=", uml_mem_setup, ...@@ -414,8 +415,28 @@ __uml_setup("mem=", uml_mem_setup,
struct page *arch_validate(struct page *page, int mask, int order) struct page *arch_validate(struct page *page, int mask, int order)
{ {
return(CHOOSE_MODE_PROC(arch_validate_tt, arch_validate_skas, page, unsigned long addr, zero = 0;
mask, order)); int i;
again:
if(page == NULL) return(page);
if(PageHighMem(page)) return(page);
addr = (unsigned long) page_address(page);
for(i = 0; i < (1 << order); i++){
current->thread.fault_addr = (void *) addr;
if(__do_copy_to_user((void *) addr, &zero,
sizeof(zero),
&current->thread.fault_addr,
&current->thread.fault_catcher)){
if(!(mask & __GFP_WAIT)) return(NULL);
else break;
}
addr += PAGE_SIZE;
}
if(i == (1 << order)) return(page);
page = alloc_pages(mask, order);
goto again;
} }
DECLARE_MUTEX(vm_reserved_sem); DECLARE_MUTEX(vm_reserved_sem);
...@@ -423,15 +444,15 @@ static struct list_head vm_reserved = LIST_HEAD_INIT(vm_reserved); ...@@ -423,15 +444,15 @@ static struct list_head vm_reserved = LIST_HEAD_INIT(vm_reserved);
/* Static structures, linked in to the list in early boot */ /* Static structures, linked in to the list in early boot */
static struct vm_reserved head = { static struct vm_reserved head = {
list : LIST_HEAD_INIT(head.list), .list = LIST_HEAD_INIT(head.list),
start : 0, .start = 0,
end : 0xffffffff .end = 0xffffffff
}; };
static struct vm_reserved tail = { static struct vm_reserved tail = {
list : LIST_HEAD_INIT(tail.list), .list = LIST_HEAD_INIT(tail.list),
start : 0, .start = 0,
end : 0xffffffff .end = 0xffffffff
}; };
void set_usable_vm(unsigned long start, unsigned long end) void set_usable_vm(unsigned long start, unsigned long end)
...@@ -467,9 +488,9 @@ int reserve_vm(unsigned long start, unsigned long end, void *e) ...@@ -467,9 +488,9 @@ int reserve_vm(unsigned long start, unsigned long end, void *e)
goto out; goto out;
} }
*entry = ((struct vm_reserved) *entry = ((struct vm_reserved)
{ list : LIST_HEAD_INIT(entry->list), { .list = LIST_HEAD_INIT(entry->list),
start : start, .start = start,
end : end }); .end = end });
list_add(&entry->list, &prev->list); list_add(&entry->list, &prev->list);
err = 0; err = 0;
out: out:
...@@ -539,9 +560,9 @@ struct iomem { ...@@ -539,9 +560,9 @@ struct iomem {
*/ */
struct iomem iomem_regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] = struct iomem iomem_regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] =
{ name : NULL, { .name = NULL,
fd : -1, .fd = -1,
size : 0 } }; .size = 0 } };
int num_iomem_regions = 0; int num_iomem_regions = 0;
...@@ -551,9 +572,9 @@ void add_iomem(char *name, int fd, unsigned long size) ...@@ -551,9 +572,9 @@ void add_iomem(char *name, int fd, unsigned long size)
return; return;
size = (size + PAGE_SIZE - 1) & PAGE_MASK; size = (size + PAGE_SIZE - 1) & PAGE_MASK;
iomem_regions[num_iomem_regions++] = iomem_regions[num_iomem_regions++] =
((struct iomem) { name : name, ((struct iomem) { .name = name,
fd : fd, .fd = fd,
size : size } ); .size = size } );
} }
int setup_iomem(void) int setup_iomem(void)
......
...@@ -169,8 +169,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -169,8 +169,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
void initial_thread_cb(void (*proc)(void *), void *arg) void initial_thread_cb(void (*proc)(void *), void *arg)
{ {
int save_kmalloc_ok = kmalloc_ok;
kmalloc_ok = 0;
CHOOSE_MODE_PROC(initial_thread_cb_tt, initial_thread_cb_skas, proc, CHOOSE_MODE_PROC(initial_thread_cb_tt, initial_thread_cb_skas, proc,
arg); arg);
kmalloc_ok = save_kmalloc_ok;
} }
unsigned long stack_sp(unsigned long page) unsigned long stack_sp(unsigned long page)
......
...@@ -52,7 +52,7 @@ void __init check_one_sigio(void (*proc)(int, int)) ...@@ -52,7 +52,7 @@ void __init check_one_sigio(void (*proc)(int, int))
{ {
struct sigaction old, new; struct sigaction old, new;
struct termios tt; struct termios tt;
struct openpty_arg pty = { master : -1, slave : -1 }; struct openpty_arg pty = { .master = -1, .slave = -1 };
int master, slave, flags; int master, slave, flags;
initial_thread_cb(openpty_cb, &pty); initial_thread_cb(openpty_cb, &pty);
...@@ -111,6 +111,7 @@ static void tty_output(int master, int slave) ...@@ -111,6 +111,7 @@ static void tty_output(int master, int slave)
printk("Checking that host ptys support output SIGIO..."); printk("Checking that host ptys support output SIGIO...");
memset(buf, 0, sizeof(buf));
while(write(master, buf, sizeof(buf)) > 0) ; while(write(master, buf, sizeof(buf)) > 0) ;
if(errno != EAGAIN) if(errno != EAGAIN)
panic("check_sigio : write failed, errno = %d\n", errno); panic("check_sigio : write failed, errno = %d\n", errno);
...@@ -170,15 +171,15 @@ struct pollfds { ...@@ -170,15 +171,15 @@ struct pollfds {
* synchronizes with it. * synchronizes with it.
*/ */
struct pollfds current_poll = { struct pollfds current_poll = {
poll : NULL, .poll = NULL,
size : 0, .size = 0,
used : 0 .used = 0
}; };
struct pollfds next_poll = { struct pollfds next_poll = {
poll : NULL, .poll = NULL,
size : 0, .size = 0,
used : 0 .used = 0
}; };
static int write_sigio_thread(void *unused) static int write_sigio_thread(void *unused)
...@@ -267,7 +268,8 @@ static void update_thread(void) ...@@ -267,7 +268,8 @@ static void update_thread(void)
return; return;
fail: fail:
sigio_lock(); sigio_lock();
if(write_sigio_pid != -1) kill(write_sigio_pid, SIGKILL); if(write_sigio_pid != -1)
os_kill_process(write_sigio_pid, 1);
write_sigio_pid = -1; write_sigio_pid = -1;
close(sigio_private[0]); close(sigio_private[0]);
close(sigio_private[1]); close(sigio_private[1]);
...@@ -298,9 +300,9 @@ int add_sigio_fd(int fd, int read) ...@@ -298,9 +300,9 @@ int add_sigio_fd(int fd, int read)
if(read) events = POLLIN; if(read) events = POLLIN;
else events = POLLOUT; else events = POLLOUT;
next_poll.poll[n - 1] = ((struct pollfd) { fd : fd, next_poll.poll[n - 1] = ((struct pollfd) { .fd = fd,
events : events, .events = events,
revents : 0 }); .revents = 0 });
update_thread(); update_thread();
out: out:
sigio_unlock(); sigio_unlock();
...@@ -348,12 +350,12 @@ static int setup_initial_poll(int fd) ...@@ -348,12 +350,12 @@ static int setup_initial_poll(int fd)
printk("setup_initial_poll : failed to allocate poll\n"); printk("setup_initial_poll : failed to allocate poll\n");
return(-1); return(-1);
} }
*p = ((struct pollfd) { fd : fd, *p = ((struct pollfd) { .fd = fd,
events : POLLIN, .events = POLLIN,
revents : 0 }); .revents = 0 });
current_poll = ((struct pollfds) { poll : p, current_poll = ((struct pollfds) { .poll = p,
used : 1, .used = 1,
size : 1 }); .size = 1 });
return(0); return(0);
} }
...@@ -394,7 +396,7 @@ void write_sigio_workaround(void) ...@@ -394,7 +396,7 @@ void write_sigio_workaround(void)
return; return;
out_kill: out_kill:
kill(write_sigio_pid, SIGKILL); os_kill_process(write_sigio_pid, 1);
write_sigio_pid = -1; write_sigio_pid = -1;
out_close2: out_close2:
close(sigio_private[0]); close(sigio_private[0]);
...@@ -420,7 +422,8 @@ int read_sigio_fd(int fd) ...@@ -420,7 +422,8 @@ int read_sigio_fd(int fd)
static void sigio_cleanup(void) static void sigio_cleanup(void)
{ {
if(write_sigio_pid != -1) kill(write_sigio_pid, SIGKILL); if(write_sigio_pid != -1)
os_kill_process(write_sigio_pid, 1);
} }
__uml_exitcall(sigio_cleanup); __uml_exitcall(sigio_cleanup);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "asm/uaccess.h" #include "asm/uaccess.h"
#include "asm/unistd.h" #include "asm/unistd.h"
#include "user_util.h" #include "user_util.h"
#include "asm/ucontext.h"
#include "kern_util.h" #include "kern_util.h"
#include "signal_kern.h" #include "signal_kern.h"
#include "signal_user.h" #include "signal_user.h"
...@@ -29,18 +30,6 @@ ...@@ -29,18 +30,6 @@
EXPORT_SYMBOL(block_signals); EXPORT_SYMBOL(block_signals);
EXPORT_SYMBOL(unblock_signals); EXPORT_SYMBOL(unblock_signals);
int probe_stack(unsigned long sp, int delta)
{
int n;
if((get_user(n, (int *) sp) != 0) ||
(put_user(n, (int *) sp) != 0) ||
(get_user(n, (int *) (sp - delta)) != 0) ||
(put_user(n, (int *) (sp - delta)) != 0))
return(-EFAULT);
return(0);
}
static void force_segv(int sig) static void force_segv(int sig)
{ {
if(sig == SIGSEGV){ if(sig == SIGSEGV){
...@@ -237,20 +226,20 @@ int sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize) ...@@ -237,20 +226,20 @@ int sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize)
} }
} }
static int copy_sc_from_user(struct pt_regs *to, void *from) static int copy_sc_from_user(struct pt_regs *to, void *from,
struct arch_frame_data *arch)
{ {
int ret; int ret;
ret = CHOOSE_MODE(copy_sc_from_user_tt(to->regs.mode.tt, from, ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from, arch),
&signal_frame_sc.arch),
copy_sc_from_user_skas(&to->regs, from)); copy_sc_from_user_skas(&to->regs, from));
return(ret); return(ret);
} }
int sys_sigreturn(struct pt_regs regs) int sys_sigreturn(struct pt_regs regs)
{ {
void *sc = sp_to_sc(PT_REGS_SP(&regs)); void *sc = sp_to_sc(PT_REGS_SP(&current->thread.regs));
void *mask = sp_to_mask(PT_REGS_SP(&regs)); void *mask = sp_to_mask(PT_REGS_SP(&current->thread.regs));
int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long); int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long);
spin_lock_irq(&current->sig->siglock); spin_lock_irq(&current->sig->siglock);
...@@ -260,22 +249,25 @@ int sys_sigreturn(struct pt_regs regs) ...@@ -260,22 +249,25 @@ int sys_sigreturn(struct pt_regs regs)
sigdelsetmask(&current->blocked, ~_BLOCKABLE); sigdelsetmask(&current->blocked, ~_BLOCKABLE);
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sig->siglock); spin_unlock_irq(&current->sig->siglock);
copy_sc_from_user(&current->thread.regs, sc); copy_sc_from_user(&current->thread.regs, sc,
&signal_frame_sc.common.arch);
return(PT_REGS_SYSCALL_RET(&current->thread.regs)); return(PT_REGS_SYSCALL_RET(&current->thread.regs));
} }
int sys_rt_sigreturn(struct pt_regs regs) int sys_rt_sigreturn(struct pt_regs regs)
{ {
void *sc = sp_to_rt_sc(PT_REGS_SP(&regs)); struct ucontext *uc = sp_to_uc(PT_REGS_SP(&current->thread.regs));
void *mask = sp_to_rt_mask(PT_REGS_SP(&regs)); void *fp;
int sig_size = _NSIG_WORDS * sizeof(unsigned long); int sig_size = _NSIG_WORDS * sizeof(unsigned long);
spin_lock_irq(&current->sig->siglock); spin_lock_irq(&current->sig->siglock);
copy_from_user(&current->blocked, mask, sig_size); copy_from_user(&current->blocked, &uc->uc_sigmask, sig_size);
sigdelsetmask(&current->blocked, ~_BLOCKABLE); sigdelsetmask(&current->blocked, ~_BLOCKABLE);
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sig->siglock); spin_unlock_irq(&current->sig->siglock);
copy_sc_from_user(&current->thread.regs, sc); fp = (void *) (((unsigned long) uc) + sizeof(struct ucontext));
copy_sc_from_user(&current->thread.regs, &uc->uc_mcontext,
&signal_frame_si.common.arch);
return(PT_REGS_SYSCALL_RET(&current->thread.regs)); return(PT_REGS_SYSCALL_RET(&current->thread.regs));
} }
......
...@@ -12,10 +12,11 @@ extern unsigned long exec_fpx_regs[]; ...@@ -12,10 +12,11 @@ extern unsigned long exec_fpx_regs[];
extern int have_fpx_regs; extern int have_fpx_regs;
extern void user_time_init_skas(void); extern void user_time_init_skas(void);
extern int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr); extern int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr);
extern int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs, extern int copy_sc_to_user_skas(void *to_ptr, void *fp,
union uml_pt_regs *regs,
unsigned long fault_addr, int fault_type); unsigned long fault_addr, int fault_type);
extern void sig_handler_common_skas(int sig, struct sigcontext *sc); extern void sig_handler_common_skas(int sig, void *sc_ptr);
extern void halt_skas(void); extern void halt_skas(void);
extern void reboot_skas(void); extern void reboot_skas(void);
extern void kill_off_processes_skas(void); extern void kill_off_processes_skas(void);
......
...@@ -34,11 +34,10 @@ extern void before_mem_skas(unsigned long unused); ...@@ -34,11 +34,10 @@ extern void before_mem_skas(unsigned long unused);
extern unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out, extern unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out,
unsigned long *task_size_out); unsigned long *task_size_out);
extern int start_uml_skas(void); extern int start_uml_skas(void);
extern struct page *arch_validate_skas(struct page *page, int mask, int order);
extern int external_pid_skas(struct task_struct *task); extern int external_pid_skas(struct task_struct *task);
extern int thread_pid_skas(struct task_struct *task); extern int thread_pid_skas(struct task_struct *task);
#define kmem_end_skas (host_task_size) #define kmem_end_skas (host_task_size - 1024 * 1024)
#endif #endif
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include "uml-config.h" #include "uml-config.h"
#ifdef CONFIG_MODE_SKAS #ifdef UML_CONFIG_MODE_SKAS
#include "skas_ptregs.h" #include "skas_ptregs.h"
......
...@@ -17,21 +17,21 @@ extern void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, ...@@ -17,21 +17,21 @@ extern void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr,
extern int start_idle_thread(void *stack, void *switch_buf_ptr, extern int start_idle_thread(void *stack, void *switch_buf_ptr,
void **fork_buf_ptr); void **fork_buf_ptr);
extern int user_thread(unsigned long stack, int flags); extern int user_thread(unsigned long stack, int flags);
extern void userspace(struct uml_pt_regs *regs); extern void userspace(union uml_pt_regs *regs);
extern void new_thread_proc(void *stack, void (*handler)(int sig)); extern void new_thread_proc(void *stack, void (*handler)(int sig));
extern void remove_sigstack(void); extern void remove_sigstack(void);
extern void new_thread_handler(int sig); extern void new_thread_handler(int sig);
extern void handle_syscall(struct uml_pt_regs *regs); extern void handle_syscall(union uml_pt_regs *regs);
extern void map(int fd, unsigned long virt, unsigned long phys, extern void map(int fd, unsigned long virt, unsigned long phys,
unsigned long len, int r, int w, int x); unsigned long len, int r, int w, int x);
extern int unmap(int fd, void *addr, int len); extern int unmap(int fd, void *addr, int len);
extern int protect(int fd, unsigned long addr, unsigned long len, extern int protect(int fd, unsigned long addr, unsigned long len,
int r, int w, int x, int must_succeed); int r, int w, int x, int must_succeed);
extern void user_signal(int sig, struct uml_pt_regs *regs); extern void user_signal(int sig, union uml_pt_regs *regs);
extern int singlestepping_skas(void); extern int singlestepping_skas(void);
extern int new_mm(int from); extern int new_mm(int from);
extern void save_registers(struct uml_pt_regs *regs); extern void save_registers(union uml_pt_regs *regs);
extern void restore_registers(struct uml_pt_regs *regs); extern void restore_registers(union uml_pt_regs *regs);
extern void start_userspace(void); extern void start_userspace(void);
extern void init_registers(int pid); extern void init_registers(int pid);
......
...@@ -27,9 +27,6 @@ static inline int verify_area_skas(int type, const void * addr, ...@@ -27,9 +27,6 @@ static inline int verify_area_skas(int type, const void * addr,
return(access_ok_skas(type, addr, size) ? 0 : -EFAULT); return(access_ok_skas(type, addr, size) ? 0 : -EFAULT);
} }
extern void *um_virt_to_phys(struct task_struct *task, unsigned long virt,
pte_t *pte_out);
static inline unsigned long maybe_map(unsigned long virt, int is_write) static inline unsigned long maybe_map(unsigned long virt, int is_write)
{ {
pte_t pte; pte_t pte;
......
...@@ -18,11 +18,6 @@ unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out, ...@@ -18,11 +18,6 @@ unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out,
return(((unsigned long) set_task_sizes_skas) & ~0xffffff); return(((unsigned long) set_task_sizes_skas) & ~0xffffff);
} }
struct page *arch_validate_skas(struct page *page, int mask, int order)
{
return(page);
}
/* /*
* Overrides for Emacs so that we follow Linus's tabbing style. * Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically * Emacs will notice this stuff at the end of the file and automatically
......
...@@ -33,7 +33,7 @@ void map(int fd, unsigned long virt, unsigned long phys, unsigned long len, ...@@ -33,7 +33,7 @@ void map(int fd, unsigned long virt, unsigned long phys, unsigned long len,
.fd = region->fd, .fd = region->fd,
.offset = phys_offset(phys) .offset = phys_offset(phys)
} } } ); } } } );
n = os_write_file(fd, (char *) &map, sizeof(map)); n = os_write_file(fd, &map, sizeof(map));
if(n != sizeof(map)) if(n != sizeof(map))
printk("map : /proc/mm map failed, errno = %d\n", errno); printk("map : /proc/mm map failed, errno = %d\n", errno);
} }
...@@ -48,7 +48,7 @@ int unmap(int fd, void *addr, int len) ...@@ -48,7 +48,7 @@ int unmap(int fd, void *addr, int len)
{ .munmap = { .munmap =
{ .addr = (unsigned long) addr, { .addr = (unsigned long) addr,
.len = len } } } ); .len = len } } } );
n = os_write_file(fd, (char *) &unmap, sizeof(unmap)); n = os_write_file(fd, &unmap, sizeof(unmap));
if((n != 0) && (n != sizeof(unmap))) if((n != 0) && (n != sizeof(unmap)))
return(-errno); return(-errno);
return(0); return(0);
...@@ -70,7 +70,7 @@ int protect(int fd, unsigned long addr, unsigned long len, int r, int w, ...@@ -70,7 +70,7 @@ int protect(int fd, unsigned long addr, unsigned long len, int r, int w,
.len = len, .len = len,
.prot = prot } } } ); .prot = prot } } } );
n = os_write_file(fd, (char *) &protect, sizeof(protect)); n = os_write_file(fd, &protect, sizeof(protect));
if((n != 0) && (n != sizeof(protect))){ if((n != 0) && (n != sizeof(protect))){
if(must_succeed) if(must_succeed)
panic("protect failed, errno = %d", errno); panic("protect failed, errno = %d", errno);
......
...@@ -20,10 +20,10 @@ ...@@ -20,10 +20,10 @@
#include "user_util.h" #include "user_util.h"
#include "kern_util.h" #include "kern_util.h"
#include "skas.h" #include "skas.h"
#include "skas_ptrace.h"
#include "sysdep/sigcontext.h" #include "sysdep/sigcontext.h"
#include "os.h" #include "os.h"
#include "proc_mm.h" #include "proc_mm.h"
#include "skas_ptrace.h"
unsigned long exec_regs[FRAME_SIZE]; unsigned long exec_regs[FRAME_SIZE];
unsigned long exec_fp_regs[HOST_FP_SIZE]; unsigned long exec_fp_regs[HOST_FP_SIZE];
...@@ -39,14 +39,15 @@ static void handle_segv(int pid) ...@@ -39,14 +39,15 @@ static void handle_segv(int pid)
if(err) if(err)
panic("handle_segv - PTRACE_FAULTINFO failed, errno = %d\n", panic("handle_segv - PTRACE_FAULTINFO failed, errno = %d\n",
errno); errno);
segv(fault.addr, 0, FAULT_WRITE(fault.is_write), 1, NULL); segv(fault.addr, 0, FAULT_WRITE(fault.is_write), 1, NULL);
} }
static void handle_trap(int pid, struct uml_pt_regs *regs) static void handle_trap(int pid, union uml_pt_regs *regs)
{ {
int err, syscall_nr, status; int err, syscall_nr, status;
syscall_nr = PT_SYSCALL_NR(regs->mode.skas.regs); syscall_nr = PT_SYSCALL_NR(regs->skas.regs);
if(syscall_nr < 1){ if(syscall_nr < 1){
relay_signal(SIGTRAP, regs); relay_signal(SIGTRAP, regs);
return; return;
...@@ -79,6 +80,7 @@ static int userspace_tramp(void *arg) ...@@ -79,6 +80,7 @@ static int userspace_tramp(void *arg)
enable_timer(); enable_timer();
ptrace(PTRACE_TRACEME, 0, 0, 0); ptrace(PTRACE_TRACEME, 0, 0, 0);
os_stop_process(os_getpid()); os_stop_process(os_getpid());
return(0);
} }
void start_userspace(void) void start_userspace(void)
...@@ -115,7 +117,7 @@ void start_userspace(void) ...@@ -115,7 +117,7 @@ void start_userspace(void)
userspace_pid = pid; userspace_pid = pid;
} }
void userspace(struct uml_pt_regs *regs) void userspace(union uml_pt_regs *regs)
{ {
int err, status, op; int err, status, op;
...@@ -131,7 +133,7 @@ void userspace(struct uml_pt_regs *regs) ...@@ -131,7 +133,7 @@ void userspace(struct uml_pt_regs *regs)
panic("userspace - waitpid failed, errno = %d\n", panic("userspace - waitpid failed, errno = %d\n",
errno); errno);
regs->is_user = 1; regs->skas.is_user = 1;
save_registers(regs); save_registers(regs);
if(WIFSTOPPED(status)){ if(WIFSTOPPED(status)){
...@@ -191,28 +193,28 @@ void thread_wait(void *sw, void *fb) ...@@ -191,28 +193,28 @@ void thread_wait(void *sw, void *fb)
longjmp(*fork_buf, 1); longjmp(*fork_buf, 1);
} }
static int move_registers(int int_op, int fp_op, struct uml_pt_regs *regs, static int move_registers(int int_op, int fp_op, union uml_pt_regs *regs,
unsigned long *fp_regs) unsigned long *fp_regs)
{ {
if(ptrace(int_op, userspace_pid, 0, regs->mode.skas.regs) < 0) if(ptrace(int_op, userspace_pid, 0, regs->skas.regs) < 0)
return(-errno); return(-errno);
if(ptrace(fp_op, userspace_pid, 0, fp_regs) < 0) if(ptrace(fp_op, userspace_pid, 0, fp_regs) < 0)
return(-errno); return(-errno);
return(0); return(0);
} }
void save_registers(struct uml_pt_regs *regs) void save_registers(union uml_pt_regs *regs)
{ {
unsigned long *fp_regs; unsigned long *fp_regs;
int err, fp_op; int err, fp_op;
if(have_fpx_regs){ if(have_fpx_regs){
fp_op = PTRACE_GETFPXREGS; fp_op = PTRACE_GETFPXREGS;
fp_regs = regs->mode.skas.xfp; fp_regs = regs->skas.xfp;
} }
else { else {
fp_op = PTRACE_GETFPREGS; fp_op = PTRACE_GETFPREGS;
fp_regs = regs->mode.skas.fp; fp_regs = regs->skas.fp;
} }
err = move_registers(PTRACE_GETREGS, fp_op, regs, fp_regs); err = move_registers(PTRACE_GETREGS, fp_op, regs, fp_regs);
...@@ -221,18 +223,18 @@ void save_registers(struct uml_pt_regs *regs) ...@@ -221,18 +223,18 @@ void save_registers(struct uml_pt_regs *regs)
err); err);
} }
void restore_registers(struct uml_pt_regs *regs) void restore_registers(union uml_pt_regs *regs)
{ {
unsigned long *fp_regs; unsigned long *fp_regs;
int err, fp_op; int err, fp_op;
if(have_fpx_regs){ if(have_fpx_regs){
fp_op = PTRACE_SETFPXREGS; fp_op = PTRACE_SETFPXREGS;
fp_regs = regs->mode.skas.xfp; fp_regs = regs->skas.xfp;
} }
else { else {
fp_op = PTRACE_SETFPREGS; fp_op = PTRACE_SETFPREGS;
fp_regs = regs->mode.skas.fp; fp_regs = regs->skas.fp;
} }
err = move_registers(PTRACE_SETREGS, fp_op, regs, fp_regs); err = move_registers(PTRACE_SETREGS, fp_op, regs, fp_regs);
...@@ -272,10 +274,14 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr) ...@@ -272,10 +274,14 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr)
(*cb_proc)(cb_arg); (*cb_proc)(cb_arg);
longjmp(*cb_back, 1); longjmp(*cb_back, 1);
} }
else if(n == 3) else if(n == 3){
kmalloc_ok = 0;
return(0); return(0);
else if(n == 4) }
else if(n == 4){
kmalloc_ok = 0;
return(1); return(1);
}
longjmp(**switch_buf, 1); longjmp(**switch_buf, 1);
} }
...@@ -296,8 +302,11 @@ void initial_thread_cb_skas(void (*proc)(void *), void *arg) ...@@ -296,8 +302,11 @@ void initial_thread_cb_skas(void (*proc)(void *), void *arg)
cb_proc = proc; cb_proc = proc;
cb_arg = arg; cb_arg = arg;
cb_back = &here; cb_back = &here;
block_signals();
if(setjmp(here) == 0) if(setjmp(here) == 0)
longjmp(initial_jmpbuf, 2); longjmp(initial_jmpbuf, 2);
unblock_signals();
cb_proc = NULL; cb_proc = NULL;
cb_arg = NULL; cb_arg = NULL;
...@@ -328,7 +337,7 @@ int new_mm(int from) ...@@ -328,7 +337,7 @@ int new_mm(int from)
copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS, copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS,
.u = .u =
{ .copy_segments = from } } ); { .copy_segments = from } } );
n = os_write_file(fd, (char *) &copy, sizeof(copy)); n = os_write_file(fd, &copy, sizeof(copy));
if(n != sizeof(copy)) if(n != sizeof(copy))
printk("new_mm : /proc/mm copy_segments failed, " printk("new_mm : /proc/mm copy_segments failed, "
"errno = %d\n", errno); "errno = %d\n", errno);
......
...@@ -68,8 +68,7 @@ void new_thread_handler(int sig) ...@@ -68,8 +68,7 @@ void new_thread_handler(int sig)
n = run_kernel_thread(fn, arg, &current->thread.exec_buf); n = run_kernel_thread(fn, arg, &current->thread.exec_buf);
if(n == 1) if(n == 1)
userspace(&current->thread.regs.regs); userspace(&current->thread.regs.regs);
else if(n == 2) else do_exit(0);
do_exit(0);
} }
void new_thread_proc(void *stack, void (*handler)(int sig)) void new_thread_proc(void *stack, void (*handler)(int sig))
...@@ -109,21 +108,21 @@ int copy_thread_skas(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -109,21 +108,21 @@ int copy_thread_skas(int nr, unsigned long clone_flags, unsigned long sp,
void (*handler)(int); void (*handler)(int);
if(current->thread.forking){ if(current->thread.forking){
memcpy(&p->thread.regs.regs.mode.skas, memcpy(&p->thread.regs.regs.skas,
&current->thread.regs.regs.mode.skas, &current->thread.regs.regs.skas,
sizeof(p->thread.regs.regs.mode.skas)); sizeof(p->thread.regs.regs.skas));
REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.mode.skas.regs, 0); REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.skas.regs, 0);
if(sp != 0) REGS_SP(p->thread.regs.regs.mode.skas.regs) = sp; if(sp != 0) REGS_SP(p->thread.regs.regs.skas.regs) = sp;
handler = fork_handler; handler = fork_handler;
} }
else { else {
memcpy(p->thread.regs.regs.mode.skas.regs, exec_regs, memcpy(p->thread.regs.regs.skas.regs, exec_regs,
sizeof(p->thread.regs.regs.mode.skas.regs)); sizeof(p->thread.regs.regs.skas.regs));
memcpy(p->thread.regs.regs.mode.skas.fp, exec_fp_regs, memcpy(p->thread.regs.regs.skas.fp, exec_fp_regs,
sizeof(p->thread.regs.regs.mode.skas.fp)); sizeof(p->thread.regs.regs.skas.fp));
memcpy(p->thread.regs.regs.mode.skas.xfp, exec_fpx_regs, memcpy(p->thread.regs.regs.skas.xfp, exec_fpx_regs,
sizeof(p->thread.regs.regs.mode.skas.xfp)); sizeof(p->thread.regs.regs.skas.xfp));
p->thread.request.u.thread = current->thread.request.u.thread; p->thread.request.u.thread = current->thread.request.u.thread;
handler = new_thread_handler; handler = new_thread_handler;
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
extern int userspace_pid; extern int userspace_pid;
int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr) int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr)
{ {
struct sigcontext sc, *from = from_ptr; struct sigcontext sc, *from = from_ptr;
unsigned long fpregs[FP_FRAME_SIZE]; unsigned long fpregs[FP_FRAME_SIZE];
...@@ -26,26 +26,26 @@ int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr) ...@@ -26,26 +26,26 @@ int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr)
if(err) if(err)
return(err); return(err);
regs->mode.skas.regs[GS] = sc.gs; regs->skas.regs[GS] = sc.gs;
regs->mode.skas.regs[FS] = sc.fs; regs->skas.regs[FS] = sc.fs;
regs->mode.skas.regs[ES] = sc.es; regs->skas.regs[ES] = sc.es;
regs->mode.skas.regs[DS] = sc.ds; regs->skas.regs[DS] = sc.ds;
regs->mode.skas.regs[EDI] = sc.edi; regs->skas.regs[EDI] = sc.edi;
regs->mode.skas.regs[ESI] = sc.esi; regs->skas.regs[ESI] = sc.esi;
regs->mode.skas.regs[EBP] = sc.ebp; regs->skas.regs[EBP] = sc.ebp;
regs->mode.skas.regs[UESP] = sc.esp; regs->skas.regs[UESP] = sc.esp;
regs->mode.skas.regs[EBX] = sc.ebx; regs->skas.regs[EBX] = sc.ebx;
regs->mode.skas.regs[EDX] = sc.edx; regs->skas.regs[EDX] = sc.edx;
regs->mode.skas.regs[ECX] = sc.ecx; regs->skas.regs[ECX] = sc.ecx;
regs->mode.skas.regs[EAX] = sc.eax; regs->skas.regs[EAX] = sc.eax;
regs->mode.skas.regs[EIP] = sc.eip; regs->skas.regs[EIP] = sc.eip;
regs->mode.skas.regs[CS] = sc.cs; regs->skas.regs[CS] = sc.cs;
regs->mode.skas.regs[EFL] = sc.eflags; regs->skas.regs[EFL] = sc.eflags;
regs->mode.skas.regs[UESP] = sc.esp_at_signal; regs->skas.regs[UESP] = sc.esp_at_signal;
regs->mode.skas.regs[SS] = sc.ss; regs->skas.regs[SS] = sc.ss;
regs->mode.skas.fault_addr = sc.cr2; regs->skas.fault_addr = sc.cr2;
regs->mode.skas.fault_type = FAULT_WRITE(sc.err); regs->skas.fault_type = FAULT_WRITE(sc.err);
regs->mode.skas.trap_type = sc.trapno; regs->skas.trap_type = sc.trapno;
err = ptrace(PTRACE_SETFPREGS, userspace_pid, 0, fpregs); err = ptrace(PTRACE_SETFPREGS, userspace_pid, 0, fpregs);
if(err < 0){ if(err < 0){
...@@ -57,7 +57,7 @@ int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr) ...@@ -57,7 +57,7 @@ int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr)
return(0); return(0);
} }
int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs, int copy_sc_to_user_skas(void *to_ptr, void *fp, union uml_pt_regs *regs,
unsigned long fault_addr, int fault_type) unsigned long fault_addr, int fault_type)
{ {
struct sigcontext sc, *to = to_ptr; struct sigcontext sc, *to = to_ptr;
...@@ -65,26 +65,26 @@ int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs, ...@@ -65,26 +65,26 @@ int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs,
unsigned long fpregs[FP_FRAME_SIZE]; unsigned long fpregs[FP_FRAME_SIZE];
int err; int err;
sc.gs = regs->mode.skas.regs[GS]; sc.gs = regs->skas.regs[GS];
sc.fs = regs->mode.skas.regs[FS]; sc.fs = regs->skas.regs[FS];
sc.es = regs->mode.skas.regs[ES]; sc.es = regs->skas.regs[ES];
sc.ds = regs->mode.skas.regs[DS]; sc.ds = regs->skas.regs[DS];
sc.edi = regs->mode.skas.regs[EDI]; sc.edi = regs->skas.regs[EDI];
sc.esi = regs->mode.skas.regs[ESI]; sc.esi = regs->skas.regs[ESI];
sc.ebp = regs->mode.skas.regs[EBP]; sc.ebp = regs->skas.regs[EBP];
sc.esp = regs->mode.skas.regs[UESP]; sc.esp = regs->skas.regs[UESP];
sc.ebx = regs->mode.skas.regs[EBX]; sc.ebx = regs->skas.regs[EBX];
sc.edx = regs->mode.skas.regs[EDX]; sc.edx = regs->skas.regs[EDX];
sc.ecx = regs->mode.skas.regs[ECX]; sc.ecx = regs->skas.regs[ECX];
sc.eax = regs->mode.skas.regs[EAX]; sc.eax = regs->skas.regs[EAX];
sc.eip = regs->mode.skas.regs[EIP]; sc.eip = regs->skas.regs[EIP];
sc.cs = regs->mode.skas.regs[CS]; sc.cs = regs->skas.regs[CS];
sc.eflags = regs->mode.skas.regs[EFL]; sc.eflags = regs->skas.regs[EFL];
sc.esp_at_signal = regs->mode.skas.regs[UESP]; sc.esp_at_signal = regs->skas.regs[UESP];
sc.ss = regs->mode.skas.regs[SS]; sc.ss = regs->skas.regs[SS];
sc.cr2 = fault_addr; sc.cr2 = fault_addr;
sc.err = TO_SC_ERR(fault_type); sc.err = TO_SC_ERR(fault_type);
sc.trapno = regs->mode.skas.trap_type; sc.trapno = regs->skas.trap_type;
err = ptrace(PTRACE_GETFPREGS, userspace_pid, 0, fpregs); err = ptrace(PTRACE_GETFPREGS, userspace_pid, 0, fpregs);
if(err < 0){ if(err < 0){
...@@ -92,7 +92,8 @@ int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs, ...@@ -92,7 +92,8 @@ int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs,
"errno = %d\n", errno); "errno = %d\n", errno);
return(1); return(1);
} }
to_fp = (struct _fpstate *)((unsigned long) to + sizeof(*to)); to_fp = (struct _fpstate *)
(fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to)));
sc.fpstate = to_fp; sc.fpstate = to_fp;
if(err) if(err)
......
...@@ -21,7 +21,7 @@ long execute_syscall_skas(void *r) ...@@ -21,7 +21,7 @@ long execute_syscall_skas(void *r)
current->thread.nsyscalls++; current->thread.nsyscalls++;
nsyscalls++; nsyscalls++;
syscall = regs->regs.syscall; syscall = UPT_SYSCALL_NR(&regs->regs);
if((syscall >= NR_syscalls) || (syscall < 0)) if((syscall >= NR_syscalls) || (syscall < 0))
res = -ENOSYS; res = -ENOSYS;
......
...@@ -15,18 +15,17 @@ ...@@ -15,18 +15,17 @@
#define ERESTARTNOINTR 513 #define ERESTARTNOINTR 513
#define ERESTARTNOHAND 514 #define ERESTARTNOHAND 514
void handle_syscall(struct uml_pt_regs *regs) void handle_syscall(union uml_pt_regs *regs)
{ {
long result; long result;
int index; int index;
host_to_regs(regs);
index = record_syscall_start(UPT_SYSCALL_NR(regs)); index = record_syscall_start(UPT_SYSCALL_NR(regs));
syscall_trace(); syscall_trace();
result = execute_syscall(regs); result = execute_syscall(regs);
REGS_SET_SYSCALL_RETURN(regs->mode.skas.regs, result); REGS_SET_SYSCALL_RETURN(regs->skas.regs, result);
if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) || if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) ||
(result == -ERESTARTNOINTR)) (result == -ERESTARTNOINTR))
do_signal(result); do_signal(result);
......
...@@ -99,7 +99,6 @@ void flush_tlb_kernel_range_skas(unsigned long start, unsigned long end) ...@@ -99,7 +99,6 @@ void flush_tlb_kernel_range_skas(unsigned long start, unsigned long end)
protect_memory(addr, PAGE_SIZE, 1, 1, 1, 1); protect_memory(addr, PAGE_SIZE, 1, 1, 1, 1);
} }
addr += PAGE_SIZE; addr += PAGE_SIZE;
} }
else { else {
if(pmd_newpage(*pmd)){ if(pmd_newpage(*pmd)){
...@@ -134,9 +133,8 @@ void flush_tlb_range_skas(struct vm_area_struct *vma, unsigned long start, ...@@ -134,9 +133,8 @@ void flush_tlb_range_skas(struct vm_area_struct *vma, unsigned long start,
void flush_tlb_mm_skas(struct mm_struct *mm) void flush_tlb_mm_skas(struct mm_struct *mm)
{ {
if(mm == NULL) flush_tlb_kernel_vm_skas();
flush_tlb_kernel_vm_skas(); fix_range(mm, 0, host_task_size, 0);
else fix_range(mm, 0, host_task_size, 0);
} }
void force_flush_all_skas(void) void force_flush_all_skas(void)
......
...@@ -13,41 +13,40 @@ ...@@ -13,41 +13,40 @@
#include "task.h" #include "task.h"
#include "sigcontext.h" #include "sigcontext.h"
void sig_handler_common_skas(int sig, struct sigcontext *sc) void sig_handler_common_skas(int sig, void *sc_ptr)
{ {
struct uml_pt_regs save_regs, *r; struct sigcontext *sc = sc_ptr;
struct skas_regs *r;
struct signal_info *info; struct signal_info *info;
int save_errno = errno; int save_errno = errno;
r = (struct uml_pt_regs *) TASK_REGS(get_current()); r = &TASK_REGS(get_current())->skas;
save_regs = *r;
r->is_user = 0; r->is_user = 0;
r->mode.skas.fault_addr = SC_FAULT_ADDR(sc); r->fault_addr = SC_FAULT_ADDR(sc);
r->mode.skas.fault_type = SC_FAULT_TYPE(sc); r->fault_type = SC_FAULT_TYPE(sc);
r->mode.skas.trap_type = SC_TRAP_TYPE(sc); r->trap_type = SC_TRAP_TYPE(sc);
change_sig(SIGUSR1, 1); change_sig(SIGUSR1, 1);
info = &sig_info[sig]; info = &sig_info[sig];
if(!info->is_irq) unblock_signals(); if(!info->is_irq) unblock_signals();
(*info->handler)(sig, r); (*info->handler)(sig, (union uml_pt_regs *) r);
*r = save_regs;
errno = save_errno; errno = save_errno;
} }
extern int missed_ticks[]; extern int missed_ticks[];
void user_signal(int sig, struct uml_pt_regs *regs) void user_signal(int sig, union uml_pt_regs *regs)
{ {
struct signal_info *info; struct signal_info *info;
if(sig == SIGVTALRM) if(sig == SIGVTALRM)
missed_ticks[cpu()]++; missed_ticks[cpu()]++;
regs->is_user = 1; regs->skas.is_user = 1;
regs->mode.skas.fault_addr = 0; regs->skas.fault_addr = 0;
regs->mode.skas.fault_type = 0; regs->skas.fault_type = 0;
regs->mode.skas.trap_type = 0; regs->skas.trap_type = 0;
info = &sig_info[sig]; info = &sig_info[sig];
(*info->handler)(sig, regs); (*info->handler)(sig, regs);
......
...@@ -23,20 +23,19 @@ static void __init find_tempdir(void) ...@@ -23,20 +23,19 @@ static void __init find_tempdir(void)
if(tempdir != NULL) return; /* We've already been called */ if(tempdir != NULL) return; /* We've already been called */
for(i = 0; dirs[i]; i++){ for(i = 0; dirs[i]; i++){
dir = getenv(dirs[i]); dir = getenv(dirs[i]);
if(dir != NULL) break; if((dir != NULL) && (*dir != '\0'))
break;
} }
if(dir == NULL) dir = "/tmp"; if((dir == NULL) || (*dir == '\0'))
else if(*dir == '\0') dir = NULL; dir = "/tmp";
if(dir != NULL) { tempdir = malloc(strlen(dir) + 2);
tempdir = malloc(strlen(dir) + 2); if(tempdir == NULL){
if(tempdir == NULL){ fprintf(stderr, "Failed to malloc tempdir, "
fprintf(stderr, "Failed to malloc tempdir, " "errno = %d\n", errno);
"errno = %d\n", errno); return;
return;
}
strcpy(tempdir, dir);
strcat(tempdir, "/");
} }
strcpy(tempdir, dir);
strcat(tempdir, "/");
} }
int make_tempfile(const char *template, char **out_tempname, int do_unlink) int make_tempfile(const char *template, char **out_tempname, int do_unlink)
......
...@@ -86,20 +86,23 @@ struct timeval local_offset = { 0, 0 }; ...@@ -86,20 +86,23 @@ struct timeval local_offset = { 0, 0 };
void do_gettimeofday(struct timeval *tv) void do_gettimeofday(struct timeval *tv)
{ {
time_lock(); unsigned long flags;
flags = time_lock();
gettimeofday(tv, NULL); gettimeofday(tv, NULL);
timeradd(tv, &local_offset, tv); timeradd(tv, &local_offset, tv);
time_unlock(); time_unlock(flags);
} }
void do_settimeofday(struct timeval *tv) void do_settimeofday(struct timeval *tv)
{ {
struct timeval now; struct timeval now;
unsigned long flags;
time_lock(); flags = time_lock();
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
timersub(tv, &now, &local_offset); timersub(tv, &now, &local_offset);
time_unlock(); time_unlock(flags);
} }
void idle_sleep(int secs) void idle_sleep(int secs)
...@@ -108,7 +111,7 @@ void idle_sleep(int secs) ...@@ -108,7 +111,7 @@ void idle_sleep(int secs)
ts.tv_sec = secs; ts.tv_sec = secs;
ts.tv_nsec = 0; ts.tv_nsec = 0;
nanosleep(&ts, &ts); nanosleep(&ts, NULL);
} }
/* /*
......
...@@ -37,7 +37,7 @@ int timer_irq_inited = 0; ...@@ -37,7 +37,7 @@ int timer_irq_inited = 0;
*/ */
int __attribute__ ((__section__ (".unprotected"))) missed_ticks[NR_CPUS]; int __attribute__ ((__section__ (".unprotected"))) missed_ticks[NR_CPUS];
void timer_irq(struct uml_pt_regs *regs) void timer_irq(union uml_pt_regs *regs)
{ {
int cpu = current->thread_info->cpu, ticks = missed_ticks[cpu]; int cpu = current->thread_info->cpu, ticks = missed_ticks[cpu];
...@@ -50,7 +50,9 @@ void boot_timer_handler(int sig) ...@@ -50,7 +50,9 @@ void boot_timer_handler(int sig)
{ {
struct pt_regs regs; struct pt_regs regs;
regs.regs.is_user = 0; CHOOSE_MODE((void)
(UPT_SC(&regs.regs) = (struct sigcontext *) (&sig + 1)),
(void) (regs.regs.skas.is_user = 0));
do_timer(&regs); do_timer(&regs);
} }
...@@ -118,7 +120,7 @@ void __const_udelay(um_udelay_t usecs) ...@@ -118,7 +120,7 @@ void __const_udelay(um_udelay_t usecs)
for(i=0;i<n;i++) ; for(i=0;i<n;i++) ;
} }
void timer_handler(int sig, struct uml_pt_regs *regs) void timer_handler(int sig, union uml_pt_regs *regs)
{ {
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
update_process_times(user_context(UPT_SP(regs))); update_process_times(user_context(UPT_SP(regs)));
...@@ -129,14 +131,16 @@ void timer_handler(int sig, struct uml_pt_regs *regs) ...@@ -129,14 +131,16 @@ void timer_handler(int sig, struct uml_pt_regs *regs)
static spinlock_t timer_spinlock = SPIN_LOCK_UNLOCKED; static spinlock_t timer_spinlock = SPIN_LOCK_UNLOCKED;
void time_lock(void) unsigned long time_lock(void)
{ {
spin_lock(&timer_spinlock); unsigned long flags;
spin_lock_irqsave(&timer_spinlock, flags);
return(flags);
} }
void time_unlock(void) void time_unlock(unsigned long flags)
{ {
spin_unlock(&timer_spinlock); spin_unlock_irqrestore(&timer_spinlock, flags);
} }
int __init timer_init(void) int __init timer_init(void)
......
...@@ -109,7 +109,8 @@ unsigned long segv(unsigned long address, unsigned long ip, int is_write, ...@@ -109,7 +109,8 @@ unsigned long segv(unsigned long address, unsigned long ip, int is_write,
flush_tlb_kernel_vm(); flush_tlb_kernel_vm();
return(0); return(0);
} }
if(current->mm == NULL) panic("Segfault with no mm"); if(current->mm == NULL)
panic("Segfault with no mm");
err = handle_page_fault(address, ip, is_write, is_user, &si.si_code); err = handle_page_fault(address, ip, is_write, is_user, &si.si_code);
catcher = current->thread.fault_catcher; catcher = current->thread.fault_catcher;
...@@ -164,14 +165,15 @@ void bad_segv(unsigned long address, unsigned long ip, int is_write) ...@@ -164,14 +165,15 @@ void bad_segv(unsigned long address, unsigned long ip, int is_write)
force_sig_info(SIGSEGV, &si, current); force_sig_info(SIGSEGV, &si, current);
} }
void relay_signal(int sig, struct uml_pt_regs *regs) void relay_signal(int sig, union uml_pt_regs *regs)
{ {
if(arch_handle_signal(sig, regs)) return; if(arch_handle_signal(sig, regs)) return;
if(!regs->is_user) panic("Kernel mode signal %d", sig); if(!UPT_IS_USER(regs))
panic("Kernel mode signal %d", sig);
force_sig(sig, current); force_sig(sig, current);
} }
void bus_handler(int sig, struct uml_pt_regs *regs) void bus_handler(int sig, union uml_pt_regs *regs)
{ {
if(current->thread.fault_catcher != NULL) if(current->thread.fault_catcher != NULL)
do_longjmp(current->thread.fault_catcher, 1); do_longjmp(current->thread.fault_catcher, 1);
......
...@@ -48,11 +48,11 @@ struct { ...@@ -48,11 +48,11 @@ struct {
int is_user; int is_user;
} segfault_record[1024]; } segfault_record[1024];
void segv_handler(int sig, struct uml_pt_regs *regs) void segv_handler(int sig, union uml_pt_regs *regs)
{ {
int index, max; int index, max;
if(regs->is_user && !UPT_SEGV_IS_FIXABLE(regs)){ if(UPT_IS_USER(regs) && !UPT_SEGV_IS_FIXABLE(regs)){
bad_segv(UPT_FAULT_ADDR(regs), UPT_IP(regs), bad_segv(UPT_FAULT_ADDR(regs), UPT_IP(regs),
UPT_FAULT_WRITE(regs)); UPT_FAULT_WRITE(regs));
return; return;
...@@ -65,35 +65,35 @@ void segv_handler(int sig, struct uml_pt_regs *regs) ...@@ -65,35 +65,35 @@ void segv_handler(int sig, struct uml_pt_regs *regs)
segfault_record[index].pid = os_getpid(); segfault_record[index].pid = os_getpid();
segfault_record[index].is_write = UPT_FAULT_WRITE(regs); segfault_record[index].is_write = UPT_FAULT_WRITE(regs);
segfault_record[index].sp = UPT_SP(regs); segfault_record[index].sp = UPT_SP(regs);
segfault_record[index].is_user = regs->is_user; segfault_record[index].is_user = UPT_IS_USER(regs);
segv(UPT_FAULT_ADDR(regs), UPT_IP(regs), UPT_FAULT_WRITE(regs), segv(UPT_FAULT_ADDR(regs), UPT_IP(regs), UPT_FAULT_WRITE(regs),
regs->is_user, regs); UPT_IS_USER(regs), regs);
} }
void usr2_handler(int sig, struct uml_pt_regs *regs) void usr2_handler(int sig, union uml_pt_regs *regs)
{ {
CHOOSE_MODE(syscall_handler_tt(sig, regs), (void) 0); CHOOSE_MODE(syscall_handler_tt(sig, regs), (void) 0);
} }
struct signal_info sig_info[] = { struct signal_info sig_info[] = {
[ SIGTRAP ] { handler : relay_signal, [ SIGTRAP ] { .handler = relay_signal,
is_irq : 0 }, .is_irq = 0 },
[ SIGFPE ] { handler : relay_signal, [ SIGFPE ] { .handler = relay_signal,
is_irq : 0 }, .is_irq = 0 },
[ SIGILL ] { handler : relay_signal, [ SIGILL ] { .handler = relay_signal,
is_irq : 0 }, .is_irq = 0 },
[ SIGBUS ] { handler : bus_handler, [ SIGBUS ] { .handler = bus_handler,
is_irq : 0 }, .is_irq = 0 },
[ SIGSEGV] { handler : segv_handler, [ SIGSEGV] { .handler = segv_handler,
is_irq : 0 }, .is_irq = 0 },
[ SIGIO ] { handler : sigio_handler, [ SIGIO ] { .handler = sigio_handler,
is_irq : 1 }, .is_irq = 1 },
[ SIGVTALRM ] { handler : timer_handler, [ SIGVTALRM ] { .handler = timer_handler,
is_irq : 1 }, .is_irq = 1 },
[ SIGALRM ] { handler : timer_handler, [ SIGALRM ] { .handler = timer_handler,
is_irq : 1 }, .is_irq = 1 },
[ SIGUSR2 ] { handler : usr2_handler, [ SIGUSR2 ] { .handler = usr2_handler,
is_irq : 0 }, .is_irq = 0 },
}; };
void sig_handler(int sig, struct sigcontext sc) void sig_handler(int sig, struct sigcontext sc)
......
...@@ -44,7 +44,7 @@ int cont(int pid) ...@@ -44,7 +44,7 @@ int cont(int pid)
return(ptrace(PTRACE_CONT, pid, 0, 0)); return(ptrace(PTRACE_CONT, pid, 0, 0));
} }
#ifdef CONFIG_PT_PROXY #ifdef UML_CONFIG_PT_PROXY
int debugger_signal(int status, pid_t pid) int debugger_signal(int status, pid_t pid)
{ {
...@@ -62,11 +62,11 @@ static void gdb_announce(char *dev_name, int dev) ...@@ -62,11 +62,11 @@ static void gdb_announce(char *dev_name, int dev)
} }
static struct chan_opts opts = { static struct chan_opts opts = {
announce : gdb_announce, .announce = gdb_announce,
xterm_title : "UML kernel debugger", .xterm_title = "UML kernel debugger",
raw : 0, .raw = 0,
tramp_stack : 0, .tramp_stack = 0,
in_kernel : 0, .in_kernel = 0,
}; };
/* Accessed by the tracing thread, which automatically serializes access */ /* Accessed by the tracing thread, which automatically serializes access */
...@@ -74,16 +74,16 @@ static void *xterm_data; ...@@ -74,16 +74,16 @@ static void *xterm_data;
static int xterm_fd; static int xterm_fd;
extern void *xterm_init(char *, int, struct chan_opts *); extern void *xterm_init(char *, int, struct chan_opts *);
extern int xterm_open(int, int, int, void *); extern int xterm_open(int, int, int, void *, char **);
extern void xterm_close(int, void *); extern void xterm_close(int, void *);
int open_gdb_chan(void) int open_gdb_chan(void)
{ {
char stack[UM_KERN_PAGE_SIZE]; char stack[UM_KERN_PAGE_SIZE], *dummy;
opts.tramp_stack = (unsigned long) stack; opts.tramp_stack = (unsigned long) stack;
xterm_data = xterm_init("", 0, &opts); xterm_data = xterm_init("", 0, &opts);
xterm_fd = xterm_open(1, 1, 1, xterm_data); xterm_fd = xterm_open(1, 1, 1, xterm_data, &dummy);
return(xterm_fd); return(xterm_fd);
} }
......
...@@ -13,9 +13,9 @@ extern int gdb_config(char *str); ...@@ -13,9 +13,9 @@ extern int gdb_config(char *str);
extern int gdb_remove(char *unused); extern int gdb_remove(char *unused);
static struct mc_device gdb_mc = { static struct mc_device gdb_mc = {
name: "gdb", .name = "gdb",
config: gdb_config, .config = gdb_config,
remove: gdb_remove, .remove = gdb_remove,
}; };
int gdb_mc_init(void) int gdb_mc_init(void)
......
...@@ -13,9 +13,10 @@ extern int tracing_pid; ...@@ -13,9 +13,10 @@ extern int tracing_pid;
extern int tracer(int (*init_proc)(void *), void *sp); extern int tracer(int (*init_proc)(void *), void *sp);
extern void user_time_init_tt(void); extern void user_time_init_tt(void);
extern int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data); extern int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data);
extern int copy_sc_to_user_tt(void *to_ptr, void *from_ptr, void *data); extern int copy_sc_to_user_tt(void *to_ptr, void *fp, void *from_ptr,
extern void sig_handler_common_tt(int sig, struct sigcontext *sc); void *data);
extern void syscall_handler_tt(int sig, struct uml_pt_regs *regs); extern void sig_handler_common_tt(int sig, void *sc);
extern void syscall_handler_tt(int sig, union uml_pt_regs *regs);
extern void reboot_tt(void); extern void reboot_tt(void);
extern void halt_tt(void); extern void halt_tt(void);
extern int is_tracer_winch(int pid, int fd, void *data); extern int is_tracer_winch(int pid, int fd, void *data);
......
...@@ -34,7 +34,6 @@ extern void before_mem_tt(unsigned long brk_start); ...@@ -34,7 +34,6 @@ extern void before_mem_tt(unsigned long brk_start);
extern unsigned long set_task_sizes_tt(int arg, unsigned long *host_size_out, extern unsigned long set_task_sizes_tt(int arg, unsigned long *host_size_out,
unsigned long *task_size_out); unsigned long *task_size_out);
extern int start_uml_tt(void); extern int start_uml_tt(void);
extern struct page *arch_validate_tt(struct page *page, int mask, int order);
extern int external_pid_tt(struct task_struct *task); extern int external_pid_tt(struct task_struct *task);
extern int thread_pid_tt(struct task_struct *task); extern int thread_pid_tt(struct task_struct *task);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include "uml-config.h" #include "uml-config.h"
#ifdef CONFIG_MODE_TT #ifdef UML_CONFIG_MODE_TT
#include "sysdep/sc.h" #include "sysdep/sc.h"
#endif #endif
......
...@@ -26,10 +26,11 @@ extern void set_tracing(void *t, int tracing); ...@@ -26,10 +26,11 @@ extern void set_tracing(void *t, int tracing);
extern int is_tracing(void *task); extern int is_tracing(void *task);
extern int singlestepping_tt(void *t); extern int singlestepping_tt(void *t);
extern void clear_singlestep(void *t); extern void clear_singlestep(void *t);
extern void syscall_handler(int sig, struct uml_pt_regs *regs); extern void syscall_handler(int sig, union uml_pt_regs *regs);
extern void exit_kernel(int pid, void *task); extern void exit_kernel(int pid, void *task);
extern int do_syscall(void *task, int pid); extern int do_syscall(void *task, int pid);
extern int is_valid_pid(int pid); extern int is_valid_pid(int pid);
extern void remap_data(void *segment_start, void *segment_end, int w);
#endif #endif
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "asm/errno.h" #include "asm/errno.h"
#include "asm/current.h" #include "asm/current.h"
#include "asm/a.out.h" #include "asm/a.out.h"
#include "uml_uaccess.h"
#define ABOVE_KMEM (16 * 1024 * 1024) #define ABOVE_KMEM (16 * 1024 * 1024)
...@@ -51,9 +52,6 @@ static inline int copy_from_user_tt(void *to, const void *from, int n) ...@@ -51,9 +52,6 @@ static inline int copy_from_user_tt(void *to, const void *from, int n)
&current->thread.fault_catcher) : n); &current->thread.fault_catcher) : n);
} }
extern int __do_copy_to_user(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher);
static inline int copy_to_user_tt(void *to, const void *from, int n) static inline int copy_to_user_tt(void *to, const void *from, int n)
{ {
return(access_ok_tt(VERIFY_WRITE, to, n) ? return(access_ok_tt(VERIFY_WRITE, to, n) ?
......
...@@ -39,32 +39,6 @@ unsigned long set_task_sizes_tt(int arg, unsigned long *host_size_out, ...@@ -39,32 +39,6 @@ unsigned long set_task_sizes_tt(int arg, unsigned long *host_size_out,
return(START); return(START);
} }
struct page *arch_validate_tt(struct page *page, int mask, int order)
{
unsigned long addr, zero = 0;
int i;
again:
if(page == NULL) return(page);
if(PageHighMem(page)) return(page);
addr = (unsigned long) page_address(page);
for(i = 0; i < (1 << order); i++){
current->thread.fault_addr = (void *) addr;
if(__do_copy_to_user((void *) addr, &zero,
sizeof(zero),
&current->thread.fault_addr,
&current->thread.fault_catcher)){
if(!(mask & __GFP_WAIT)) return(NULL);
else break;
}
addr += PAGE_SIZE;
}
if(i == (1 << order)) return(page);
page = alloc_pages(mask, order);
goto again;
}
/* /*
* Overrides for Emacs so that we follow Linus's tabbing style. * Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically * Emacs will notice this stuff at the end of the file and automatically
......
...@@ -26,7 +26,7 @@ void remap_data(void *segment_start, void *segment_end, int w) ...@@ -26,7 +26,7 @@ void remap_data(void *segment_start, void *segment_end, int w)
(unsigned long) segment_start; (unsigned long) segment_start;
data = create_mem_file(size); data = create_mem_file(size);
if((addr = mmap(NULL, size, PROT_WRITE | PROT_READ, if((addr = mmap(NULL, size, PROT_WRITE | PROT_READ,
MAP_SHARED, data, 0)) < 0){ MAP_SHARED, data, 0)) == MAP_FAILED){
perror("mapping new data segment"); perror("mapping new data segment");
exit(1); exit(1);
} }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "linux/sched.h" #include "linux/sched.h"
#include "linux/signal.h" #include "linux/signal.h"
#include "linux/kernel.h" #include "linux/kernel.h"
#include "linux/interrupt.h"
#include "asm/system.h" #include "asm/system.h"
#include "asm/pgalloc.h" #include "asm/pgalloc.h"
#include "asm/ptrace.h" #include "asm/ptrace.h"
...@@ -111,7 +112,7 @@ void exit_thread_tt(void) ...@@ -111,7 +112,7 @@ void exit_thread_tt(void)
close(current->thread.mode.tt.switch_pipe[1]); close(current->thread.mode.tt.switch_pipe[1]);
} }
extern void schedule_tail(struct task_struct *prev); void schedule_tail(task_t *prev);
static void new_thread_handler(int sig) static void new_thread_handler(int sig)
{ {
...@@ -120,13 +121,13 @@ static void new_thread_handler(int sig) ...@@ -120,13 +121,13 @@ static void new_thread_handler(int sig)
fn = current->thread.request.u.thread.proc; fn = current->thread.request.u.thread.proc;
arg = current->thread.request.u.thread.arg; arg = current->thread.request.u.thread.arg;
current->thread.regs.regs.mode.tt = (void *) (&sig + 1); UPT_SC(&current->thread.regs.regs) = (void *) (&sig + 1);
suspend_new_thread(current->thread.mode.tt.switch_pipe[0]); suspend_new_thread(current->thread.mode.tt.switch_pipe[0]);
block_signals(); block_signals();
init_new_thread_signals(1); init_new_thread_signals(1);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
schedule_tail(NULL); schedule_tail(current->thread.prev_sched);
#endif #endif
enable_timer(); enable_timer();
free_page(current->thread.temp_stack); free_page(current->thread.temp_stack);
...@@ -160,7 +161,7 @@ static int new_thread_proc(void *stack) ...@@ -160,7 +161,7 @@ static int new_thread_proc(void *stack)
void finish_fork_handler(int sig) void finish_fork_handler(int sig)
{ {
current->thread.regs.regs.mode.tt = (void *) (&sig + 1); UPT_SC(&current->thread.regs.regs) = (void *) (&sig + 1);
suspend_new_thread(current->thread.mode.tt.switch_pipe[0]); suspend_new_thread(current->thread.mode.tt.switch_pipe[0]);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
...@@ -168,6 +169,7 @@ void finish_fork_handler(int sig) ...@@ -168,6 +169,7 @@ void finish_fork_handler(int sig)
#endif #endif
enable_timer(); enable_timer();
change_sig(SIGVTALRM, 1); change_sig(SIGVTALRM, 1);
local_irq_enable();
force_flush_all(); force_flush_all();
if(current->mm != current->parent->mm) if(current->mm != current->parent->mm)
protect_memory(uml_reserved, high_physmem - uml_reserved, 1, protect_memory(uml_reserved, high_physmem - uml_reserved, 1,
...@@ -187,6 +189,7 @@ int fork_tramp(void *stack) ...@@ -187,6 +189,7 @@ int fork_tramp(void *stack)
{ {
int sig = sigusr1; int sig = sigusr1;
local_irq_disable();
init_new_thread_stack(stack, finish_fork_handler); init_new_thread_stack(stack, finish_fork_handler);
kill(os_getpid(), sig); kill(os_getpid(), sig);
...@@ -232,10 +235,10 @@ int copy_thread_tt(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -232,10 +235,10 @@ int copy_thread_tt(int nr, unsigned long clone_flags, unsigned long sp,
} }
if(current->thread.forking){ if(current->thread.forking){
sc_to_sc(p->thread.regs.regs.mode.tt, sc_to_sc(UPT_SC(&p->thread.regs.regs),
current->thread.regs.regs.mode.tt); UPT_SC(&current->thread.regs.regs));
SC_SET_SYSCALL_RETURN(p->thread.regs.regs.mode.tt, 0); SC_SET_SYSCALL_RETURN(UPT_SC(&p->thread.regs.regs), 0);
if(sp != 0) SC_SP(p->thread.regs.regs.mode.tt) = sp; if(sp != 0) SC_SP(UPT_SC(&p->thread.regs.regs)) = sp;
} }
p->thread.mode.tt.extern_pid = new_pid; p->thread.mode.tt.extern_pid = new_pid;
......
...@@ -129,14 +129,14 @@ static int parent_syscall(debugger_state *debugger, int pid); ...@@ -129,14 +129,14 @@ static int parent_syscall(debugger_state *debugger, int pid);
int init_parent_proxy(int pid) int init_parent_proxy(int pid)
{ {
parent = ((debugger_state) { pid : pid, parent = ((debugger_state) { .pid = pid,
wait_options : 0, .wait_options = 0,
wait_status_ptr : NULL, .wait_status_ptr = NULL,
waiting : 0, .waiting = 0,
real_wait : 0, .real_wait = 0,
expecting_child : 0, .expecting_child = 0,
handle_trace : parent_syscall, .handle_trace = parent_syscall,
debugee : NULL } ); .debugee = NULL } );
return(0); return(0);
} }
......
...@@ -29,14 +29,15 @@ int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data) ...@@ -29,14 +29,15 @@ int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data)
return(err); return(err);
} }
int copy_sc_to_user_tt(void *to_ptr, void *from_ptr, void *data) int copy_sc_to_user_tt(void *to_ptr, void *fp, void *from_ptr, void *data)
{ {
struct arch_frame_data *arch = data; struct arch_frame_data *arch = data;
struct sigcontext *to = to_ptr, *from = from_ptr; struct sigcontext *to = to_ptr, *from = from_ptr;
struct _fpstate *to_fp, *from_fp; struct _fpstate *to_fp, *from_fp;
int err; int err;
to_fp = (struct _fpstate *)((unsigned long) to + sizeof(*to)); to_fp = (struct _fpstate *)
(fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to)));
from_fp = from->fpstate; from_fp = from->fpstate;
err = copy_to_user_proc(to, from, sizeof(*to)); err = copy_to_user_proc(to, from, sizeof(*to));
if(from_fp != NULL){ if(from_fp != NULL){
......
...@@ -20,29 +20,32 @@ static inline int check_area(void *ptr, int size) ...@@ -20,29 +20,32 @@ static inline int check_area(void *ptr, int size)
static int check_readlink(struct pt_regs *regs) static int check_readlink(struct pt_regs *regs)
{ {
return(check_area((void *) regs->regs.args[1], regs->regs.args[2])); return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs),
UPT_SYSCALL_ARG2(&regs->regs)));
} }
static int check_utime(struct pt_regs *regs) static int check_utime(struct pt_regs *regs)
{ {
return(check_area((void *) regs->regs.args[1], return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs),
sizeof(struct utimbuf))); sizeof(struct utimbuf)));
} }
static int check_oldstat(struct pt_regs *regs) static int check_oldstat(struct pt_regs *regs)
{ {
return(check_area((void *) regs->regs.args[1], return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs),
sizeof(struct __old_kernel_stat))); sizeof(struct __old_kernel_stat)));
} }
static int check_stat(struct pt_regs *regs) static int check_stat(struct pt_regs *regs)
{ {
return(check_area((void *) regs->regs.args[1], sizeof(struct stat))); return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs),
sizeof(struct stat)));
} }
static int check_stat64(struct pt_regs *regs) static int check_stat64(struct pt_regs *regs)
{ {
return(check_area((void *) regs->regs.args[1], sizeof(struct stat64))); return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs),
sizeof(struct stat64)));
} }
struct bogus { struct bogus {
...@@ -90,7 +93,7 @@ struct bogus this_is_bogus[256] = { ...@@ -90,7 +93,7 @@ struct bogus this_is_bogus[256] = {
static int check_bogosity(struct pt_regs *regs) static int check_bogosity(struct pt_regs *regs)
{ {
struct bogus *bogon = &this_is_bogus[regs->regs.syscall]; struct bogus *bogon = &this_is_bogus[UPT_SYSCALL_NR(&regs->regs)];
if(!bogon->kernel_ds) return(0); if(!bogon->kernel_ds) return(0);
if(bogon->check_params && (*bogon->check_params)(regs)) if(bogon->check_params && (*bogon->check_params)(regs))
...@@ -109,7 +112,7 @@ long execute_syscall_tt(void *r) ...@@ -109,7 +112,7 @@ long execute_syscall_tt(void *r)
current->thread.nsyscalls++; current->thread.nsyscalls++;
nsyscalls++; nsyscalls++;
syscall = regs->regs.syscall; syscall = UPT_SYSCALL_NR(&regs->regs);
if((syscall >= NR_syscalls) || (syscall < 0)) if((syscall >= NR_syscalls) || (syscall < 0))
res = -ENOSYS; res = -ENOSYS;
......
...@@ -22,15 +22,14 @@ ...@@ -22,15 +22,14 @@
#define ERESTARTNOINTR 513 #define ERESTARTNOINTR 513
#define ERESTARTNOHAND 514 #define ERESTARTNOHAND 514
void syscall_handler_tt(int sig, struct uml_pt_regs *regs) void syscall_handler_tt(int sig, union uml_pt_regs *regs)
{ {
void *sc; void *sc;
long result; long result;
int index, syscall; int index, syscall;
syscall = regs->syscall; syscall = UPT_SYSCALL_NR(regs);
sc = regs->mode.tt; sc = UPT_SC(regs);
sc_to_regs(regs, sc, syscall);
SC_START_SYSCALL(sc); SC_START_SYSCALL(sc);
index = record_syscall_start(syscall); index = record_syscall_start(syscall);
...@@ -40,7 +39,7 @@ void syscall_handler_tt(int sig, struct uml_pt_regs *regs) ...@@ -40,7 +39,7 @@ void syscall_handler_tt(int sig, struct uml_pt_regs *regs)
/* regs->sc may have changed while the system call ran (there may /* regs->sc may have changed while the system call ran (there may
* have been an interrupt or segfault), so it needs to be refreshed. * have been an interrupt or segfault), so it needs to be refreshed.
*/ */
regs->mode.tt = sc; UPT_SC(regs) = sc;
SC_SET_SYSCALL_RETURN(sc, result); SC_SET_SYSCALL_RETURN(sc, result);
if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) || if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) ||
...@@ -54,7 +53,7 @@ void syscall_handler_tt(int sig, struct uml_pt_regs *regs) ...@@ -54,7 +53,7 @@ void syscall_handler_tt(int sig, struct uml_pt_regs *regs)
int do_syscall(void *task, int pid) int do_syscall(void *task, int pid)
{ {
unsigned long proc_regs[FRAME_SIZE]; unsigned long proc_regs[FRAME_SIZE];
struct uml_pt_regs *regs; union uml_pt_regs *regs;
int syscall; int syscall;
if(ptrace_getregs(pid, proc_regs) < 0) if(ptrace_getregs(pid, proc_regs) < 0)
......
...@@ -14,26 +14,27 @@ ...@@ -14,26 +14,27 @@
#include "task.h" #include "task.h"
#include "tt.h" #include "tt.h"
void sig_handler_common_tt(int sig, struct sigcontext *sc) void sig_handler_common_tt(int sig, void *sc_ptr)
{ {
struct uml_pt_regs save_regs, *r; struct sigcontext *sc = sc_ptr;
struct tt_regs save_regs, *r;
struct signal_info *info; struct signal_info *info;
int save_errno = errno, is_user; int save_errno = errno, is_user;
unprotect_kernel_mem(); unprotect_kernel_mem();
r = (struct uml_pt_regs *) TASK_REGS(get_current()); r = &TASK_REGS(get_current())->tt;
save_regs = *r; save_regs = *r;
is_user = user_context(SC_SP(sc)); is_user = user_context(SC_SP(sc));
r->is_user = is_user; r->sc = sc;
r->mode.tt = sc; if(sig != SIGUSR2)
if(sig != SIGUSR2) r->syscall = -1; r->syscall = -1;
change_sig(SIGUSR1, 1); change_sig(SIGUSR1, 1);
info = &sig_info[sig]; info = &sig_info[sig];
if(!info->is_irq) unblock_signals(); if(!info->is_irq) unblock_signals();
(*info->handler)(sig, r); (*info->handler)(sig, (union uml_pt_regs *) r);
if(is_user){ if(is_user){
interrupt_end(); interrupt_end();
......
...@@ -7,34 +7,7 @@ ...@@ -7,34 +7,7 @@
#include <setjmp.h> #include <setjmp.h>
#include <string.h> #include <string.h>
#include "user_util.h" #include "user_util.h"
#include "uml_uaccess.h"
static unsigned long __do_user_copy(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher,
void (*op)(void *to, const void *from,
int n), int *faulted_out)
{
unsigned long *faddrp = (unsigned long *) fault_addr, ret;
jmp_buf jbuf;
*fault_catcher = &jbuf;
if(setjmp(jbuf) == 0){
(*op)(to, from, n);
ret = 0;
*faulted_out = 0;
}
else {
ret = *faddrp;
*faulted_out = 1;
}
*fault_addr = NULL;
*fault_catcher = NULL;
return ret;
}
static void __do_copy(void *to, const void *from, int n)
{
memcpy(to, from, n);
}
int __do_copy_from_user(void *to, const void *from, int n, int __do_copy_from_user(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher) void **fault_addr, void **fault_catcher)
...@@ -48,19 +21,6 @@ int __do_copy_from_user(void *to, const void *from, int n, ...@@ -48,19 +21,6 @@ int __do_copy_from_user(void *to, const void *from, int n,
else return(n - (fault - (unsigned long) from)); else return(n - (fault - (unsigned long) from));
} }
int __do_copy_to_user(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher)
{
unsigned long fault;
int faulted;
fault = __do_user_copy(to, from, n, fault_addr, fault_catcher,
__do_copy, &faulted);
if(!faulted) return(0);
else return(n - (fault - (unsigned long) to));
}
static void __do_strncpy(void *dst, const void *src, int count) static void __do_strncpy(void *dst, const void *src, int count)
{ {
strncpy(dst, src, count); strncpy(dst, src, count);
......
/*
* Copyright (C) 2001 Chris Emerson (cemerson@chiark.greenend.org.uk)
* Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
* Licensed under the GPL
*/
#include <setjmp.h>
#include <string.h>
/* These are here rather than tt/uaccess.c because skas mode needs them in
* order to do SIGBUS recovery when a tmpfs mount runs out of room.
*/
unsigned long __do_user_copy(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher,
void (*op)(void *to, const void *from,
int n), int *faulted_out)
{
unsigned long *faddrp = (unsigned long *) fault_addr, ret;
jmp_buf jbuf;
*fault_catcher = &jbuf;
if(setjmp(jbuf) == 0){
(*op)(to, from, n);
ret = 0;
*faulted_out = 0;
}
else {
ret = *faddrp;
*faulted_out = 1;
}
*fault_addr = NULL;
*fault_catcher = NULL;
return ret;
}
void __do_copy(void *to, const void *from, int n)
{
memcpy(to, from, n);
}
int __do_copy_to_user(void *to, const void *from, int n,
void **fault_addr, void **fault_catcher)
{
unsigned long fault;
int faulted;
fault = __do_user_copy(to, from, n, fault_addr, fault_catcher,
__do_copy, &faulted);
if(!faulted) return(0);
else return(n - (fault - (unsigned long) to));
}
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
...@@ -85,10 +85,10 @@ static void c_stop(struct seq_file *m, void *v) ...@@ -85,10 +85,10 @@ static void c_stop(struct seq_file *m, void *v)
} }
struct seq_operations cpuinfo_op = { struct seq_operations cpuinfo_op = {
start: c_start, .start = c_start,
next: c_next, .next = c_next,
stop: c_stop, .stop = c_stop,
show: show_cpuinfo, .show = show_cpuinfo,
}; };
pte_t * __bad_pagetable(void) pte_t * __bad_pagetable(void)
...@@ -317,6 +317,11 @@ int linux_main(int argc, char **argv) ...@@ -317,6 +317,11 @@ int linux_main(int argc, char **argv)
if(physmem_size > max_physmem){ if(physmem_size > max_physmem){
highmem = physmem_size - max_physmem; highmem = physmem_size - max_physmem;
physmem_size -= highmem; physmem_size -= highmem;
#ifndef CONFIG_HIGHMEM
highmem = 0;
printf("CONFIG_HIGHMEM not enabled - physical memory shrunk "
"to %ld bytes\n", physmem_size);
#endif
} }
high_physmem = uml_physmem + physmem_size; high_physmem = uml_physmem + physmem_size;
...@@ -361,9 +366,9 @@ static int panic_exit(struct notifier_block *self, unsigned long unused1, ...@@ -361,9 +366,9 @@ static int panic_exit(struct notifier_block *self, unsigned long unused1,
} }
static struct notifier_block panic_exit_notifier = { static struct notifier_block panic_exit_notifier = {
notifier_call : panic_exit, .notifier_call = panic_exit,
next : NULL, .next = NULL,
priority : 0 .priority = 0
}; };
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
......
...@@ -35,7 +35,7 @@ static int umid_inited = 0; ...@@ -35,7 +35,7 @@ static int umid_inited = 0;
static int make_umid(void); static int make_umid(void);
static int __init set_umid(char *name, int *add) static int __init set_umid(char *name, int is_random)
{ {
if(umid_inited){ if(umid_inited){
printk("Unique machine name can't be set twice\n"); printk("Unique machine name can't be set twice\n");
...@@ -48,12 +48,17 @@ static int __init set_umid(char *name, int *add) ...@@ -48,12 +48,17 @@ static int __init set_umid(char *name, int *add)
strncpy(umid, name, UMID_LEN - 1); strncpy(umid, name, UMID_LEN - 1);
umid[UMID_LEN - 1] = '\0'; umid[UMID_LEN - 1] = '\0';
umid_is_random = 0; umid_is_random = is_random;
umid_inited = 1; umid_inited = 1;
return 0; return 0;
} }
__uml_setup("umid=", set_umid, static int __init set_umid_arg(char *name, int *add)
{
return(set_umid(name, 0));
}
__uml_setup("umid=", set_umid_arg,
"umid=<name>\n" "umid=<name>\n"
" This is used to assign a unique identity to this UML machine and\n" " This is used to assign a unique identity to this UML machine and\n"
" is used for naming the pid file and management console socket.\n\n" " is used for naming the pid file and management console socket.\n\n"
...@@ -186,7 +191,6 @@ int not_dead_yet(char *dir) ...@@ -186,7 +191,6 @@ int not_dead_yet(char *dir)
} }
if(!dead) return(1); if(!dead) return(1);
return(actually_do_remove(dir)); return(actually_do_remove(dir));
return(0);
} }
static int __init set_uml_dir(char *name, int *add) static int __init set_uml_dir(char *name, int *add)
...@@ -254,7 +258,7 @@ static int __init make_umid(void) ...@@ -254,7 +258,7 @@ static int __init make_umid(void)
strcat(tmp, "XXXXXX"); strcat(tmp, "XXXXXX");
fd = mkstemp(tmp); fd = mkstemp(tmp);
if(fd < 0){ if(fd < 0){
printk("set_umid - mkstemp failed, errno = %d\n", printk("make_umid - mkstemp failed, errno = %d\n",
errno); errno);
return(1); return(1);
} }
...@@ -265,7 +269,7 @@ static int __init make_umid(void) ...@@ -265,7 +269,7 @@ static int __init make_umid(void)
* for directories. * for directories.
*/ */
unlink(tmp); unlink(tmp);
strcpy(umid, &tmp[strlen(uml_dir)]); set_umid(&tmp[strlen(uml_dir)], 1);
} }
sprintf(tmp, "%s%s", uml_dir, umid); sprintf(tmp, "%s%s", uml_dir, umid);
......
...@@ -10,10 +10,7 @@ ...@@ -10,10 +10,7 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "user_util.h" #include "user_util.h"
#include "mem_user.h" #include "mem_user.h"
#include "uml-config.h"
/* XXX All the __CONFIG_* stuff is broken because this file can't include
* config.h
*/
/* Had to steal this from linux/module.h because that file can't be included /* Had to steal this from linux/module.h because that file can't be included
* since this includes various user-level headers. * since this includes various user-level headers.
...@@ -36,7 +33,7 @@ struct module_symbol ...@@ -36,7 +33,7 @@ struct module_symbol
#define EXPORT_SYMBOL(var) error config_must_be_included_before_module #define EXPORT_SYMBOL(var) error config_must_be_included_before_module
#define EXPORT_SYMBOL_NOVERS(var) error config_must_be_included_before_module #define EXPORT_SYMBOL_NOVERS(var) error config_must_be_included_before_module
#elif !defined(__CONFIG_MODULES__) #elif !defined(UML_CONFIG_MODULES)
#define __EXPORT_SYMBOL(sym,str) #define __EXPORT_SYMBOL(sym,str)
#define EXPORT_SYMBOL(var) #define EXPORT_SYMBOL(var)
...@@ -51,7 +48,7 @@ const struct module_symbol __ksymtab_##sym \ ...@@ -51,7 +48,7 @@ const struct module_symbol __ksymtab_##sym \
__attribute__((section("__ksymtab"))) = \ __attribute__((section("__ksymtab"))) = \
{ (unsigned long)&sym, __kstrtab_##sym } { (unsigned long)&sym, __kstrtab_##sym }
#if defined(__MODVERSIONS__) || !defined(__CONFIG_MODVERSIONS__) #if defined(__MODVERSIONS__) || !defined(UML_CONFIG_MODVERSIONS)
#define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(var)) #define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(var))
#else #else
#define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(__VERSIONED_SYMBOL(var))) #define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(__VERSIONED_SYMBOL(var)))
......
...@@ -28,11 +28,11 @@ static void etap_init(struct net_device *dev, void *data) ...@@ -28,11 +28,11 @@ static void etap_init(struct net_device *dev, void *data)
pri = dev->priv; pri = dev->priv;
epri = (struct ethertap_data *) pri->user; epri = (struct ethertap_data *) pri->user;
*epri = ((struct ethertap_data) *epri = ((struct ethertap_data)
{ dev_name : init->dev_name, { .dev_name = init->dev_name,
gate_addr : init->gate_addr, .gate_addr = init->gate_addr,
data_fd : -1, .data_fd = -1,
control_fd : -1, .control_fd = -1,
dev : dev }); .dev = dev });
printk("ethertap backend - %s", epri->dev_name); printk("ethertap backend - %s", epri->dev_name);
if(epri->gate_addr != NULL) if(epri->gate_addr != NULL)
...@@ -69,10 +69,10 @@ static int etap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) ...@@ -69,10 +69,10 @@ static int etap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp)
} }
struct net_kern_info ethertap_kern_info = { struct net_kern_info ethertap_kern_info = {
init: etap_init, .init = etap_init,
protocol: eth_protocol, .protocol = eth_protocol,
read: etap_read, .read = etap_read,
write: etap_write, .write = etap_write,
}; };
int ethertap_setup(char *str, char **mac_out, void *data) int ethertap_setup(char *str, char **mac_out, void *data)
...@@ -80,8 +80,8 @@ int ethertap_setup(char *str, char **mac_out, void *data) ...@@ -80,8 +80,8 @@ int ethertap_setup(char *str, char **mac_out, void *data)
struct ethertap_init *init = data; struct ethertap_init *init = data;
*init = ((struct ethertap_init) *init = ((struct ethertap_init)
{ dev_name : NULL, { .dev_name = NULL,
gate_addr : NULL }); .gate_addr = NULL });
if(tap_setup_common(str, "ethertap", &init->dev_name, mac_out, if(tap_setup_common(str, "ethertap", &init->dev_name, mac_out,
&init->gate_addr)) &init->gate_addr))
return(0); return(0);
...@@ -94,12 +94,12 @@ int ethertap_setup(char *str, char **mac_out, void *data) ...@@ -94,12 +94,12 @@ int ethertap_setup(char *str, char **mac_out, void *data)
} }
static struct transport ethertap_transport = { static struct transport ethertap_transport = {
list : LIST_HEAD_INIT(ethertap_transport.list), .list = LIST_HEAD_INIT(ethertap_transport.list),
name : "ethertap", .name = "ethertap",
setup : ethertap_setup, .setup = ethertap_setup,
user : &ethertap_user_info, .user = &ethertap_user_info,
kern : &ethertap_kern_info, .kern = &ethertap_kern_info,
private_size : sizeof(struct ethertap_data), .private_size = sizeof(struct ethertap_data),
}; };
static int register_ethertap(void) static int register_ethertap(void)
......
...@@ -216,14 +216,14 @@ static void etap_del_addr(unsigned char *addr, unsigned char *netmask, ...@@ -216,14 +216,14 @@ static void etap_del_addr(unsigned char *addr, unsigned char *netmask,
} }
struct net_user_info ethertap_user_info = { struct net_user_info ethertap_user_info = {
init: etap_user_init, .init = etap_user_init,
open: etap_open, .open = etap_open,
close: etap_close, .close = etap_close,
remove: NULL, .remove = NULL,
set_mtu: etap_set_mtu, .set_mtu = etap_set_mtu,
add_address: etap_add_addr, .add_address = etap_add_addr,
delete_address: etap_del_addr, .delete_address = etap_del_addr,
max_packet: MAX_PACKET - ETH_HEADER_ETHERTAP .max_packet = MAX_PACKET - ETH_HEADER_ETHERTAP
}; };
/* /*
......
...@@ -28,11 +28,11 @@ static void tuntap_init(struct net_device *dev, void *data) ...@@ -28,11 +28,11 @@ static void tuntap_init(struct net_device *dev, void *data)
pri = dev->priv; pri = dev->priv;
tpri = (struct tuntap_data *) pri->user; tpri = (struct tuntap_data *) pri->user;
*tpri = ((struct tuntap_data) *tpri = ((struct tuntap_data)
{ dev_name : init->dev_name, { .dev_name = init->dev_name,
fixed_config : (init->dev_name != NULL), .fixed_config = (init->dev_name != NULL),
gate_addr : init->gate_addr, .gate_addr = init->gate_addr,
fd : -1, .fd = -1,
dev : dev }); .dev = dev });
printk("TUN/TAP backend - "); printk("TUN/TAP backend - ");
if(tpri->gate_addr != NULL) if(tpri->gate_addr != NULL)
printk("IP = %s", tpri->gate_addr); printk("IP = %s", tpri->gate_addr);
...@@ -55,10 +55,10 @@ static int tuntap_write(int fd, struct sk_buff **skb, ...@@ -55,10 +55,10 @@ static int tuntap_write(int fd, struct sk_buff **skb,
} }
struct net_kern_info tuntap_kern_info = { struct net_kern_info tuntap_kern_info = {
init: tuntap_init, .init = tuntap_init,
protocol: eth_protocol, .protocol = eth_protocol,
read: tuntap_read, .read = tuntap_read,
write: tuntap_write, .write = tuntap_write,
}; };
int tuntap_setup(char *str, char **mac_out, void *data) int tuntap_setup(char *str, char **mac_out, void *data)
...@@ -66,8 +66,8 @@ int tuntap_setup(char *str, char **mac_out, void *data) ...@@ -66,8 +66,8 @@ int tuntap_setup(char *str, char **mac_out, void *data)
struct tuntap_init *init = data; struct tuntap_init *init = data;
*init = ((struct tuntap_init) *init = ((struct tuntap_init)
{ dev_name : NULL, { .dev_name = NULL,
gate_addr : NULL }); .gate_addr = NULL });
if(tap_setup_common(str, "tuntap", &init->dev_name, mac_out, if(tap_setup_common(str, "tuntap", &init->dev_name, mac_out,
&init->gate_addr)) &init->gate_addr))
return(0); return(0);
...@@ -76,13 +76,13 @@ int tuntap_setup(char *str, char **mac_out, void *data) ...@@ -76,13 +76,13 @@ int tuntap_setup(char *str, char **mac_out, void *data)
} }
static struct transport tuntap_transport = { static struct transport tuntap_transport = {
list : LIST_HEAD_INIT(tuntap_transport.list), .list = LIST_HEAD_INIT(tuntap_transport.list),
name : "tuntap", .name = "tuntap",
setup : tuntap_setup, .setup = tuntap_setup,
user : &tuntap_user_info, .user = &tuntap_user_info,
kern : &tuntap_kern_info, .kern = &tuntap_kern_info,
private_size : sizeof(struct tuntap_data), .private_size = sizeof(struct tuntap_data),
setup_size : sizeof(struct tuntap_init), .setup_size = sizeof(struct tuntap_init),
}; };
static int register_tuntap(void) static int register_tuntap(void)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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