diff options
| author | Dave Kleikamp <shaggy@austin.ibm.com> | 2005-06-20 09:44:00 -0400 |
|---|---|---|
| committer | Dave Kleikamp <shaggy@austin.ibm.com> | 2005-06-20 09:44:00 -0400 |
| commit | d039ba24f135147f60a13bcaa768189a5b773b6e (patch) | |
| tree | 444b7596ab8312b5954d15c3135052a7c09c6fbe /arch/um | |
| parent | 72e3148a6e987974e3e949c5668e5ca812d7c818 (diff) | |
| parent | 8b22c249e7de453961e4d253b19fc2a0bdd65d53 (diff) | |
Merge with /home/shaggy/git/linus-clean/
Diffstat (limited to 'arch/um')
26 files changed, 267 insertions, 309 deletions
diff --git a/arch/um/Kconfig_char b/arch/um/Kconfig_char index 3e50fdb67626..62d87b71179b 100644 --- a/arch/um/Kconfig_char +++ b/arch/um/Kconfig_char | |||
| @@ -204,5 +204,11 @@ config UML_RANDOM | |||
| 204 | http://sourceforge.net/projects/gkernel/). rngd periodically reads | 204 | http://sourceforge.net/projects/gkernel/). rngd periodically reads |
| 205 | /dev/hwrng and injects the entropy into /dev/random. | 205 | /dev/hwrng and injects the entropy into /dev/random. |
| 206 | 206 | ||
| 207 | config MMAPPER | ||
| 208 | tristate "iomem emulation driver" | ||
| 209 | help | ||
| 210 | This driver allows a host file to be used as emulated IO memory inside | ||
| 211 | UML. | ||
| 212 | |||
| 207 | endmenu | 213 | endmenu |
| 208 | 214 | ||
diff --git a/arch/um/drivers/Makefile b/arch/um/drivers/Makefile index 323f72c64cd2..b2de9916c32c 100644 --- a/arch/um/drivers/Makefile +++ b/arch/um/drivers/Makefile | |||
| @@ -22,8 +22,8 @@ obj-y := stdio_console.o fd.o chan_kern.o chan_user.o line.o | |||
| 22 | obj-$(CONFIG_SSL) += ssl.o | 22 | obj-$(CONFIG_SSL) += ssl.o |
| 23 | obj-$(CONFIG_STDERR_CONSOLE) += stderr_console.o | 23 | obj-$(CONFIG_STDERR_CONSOLE) += stderr_console.o |
| 24 | 24 | ||
| 25 | obj-$(CONFIG_UML_NET_SLIP) += slip.o | 25 | obj-$(CONFIG_UML_NET_SLIP) += slip.o slip_common.o |
| 26 | obj-$(CONFIG_UML_NET_SLIRP) += slirp.o | 26 | obj-$(CONFIG_UML_NET_SLIRP) += slirp.o slip_common.o |
| 27 | obj-$(CONFIG_UML_NET_DAEMON) += daemon.o | 27 | obj-$(CONFIG_UML_NET_DAEMON) += daemon.o |
| 28 | obj-$(CONFIG_UML_NET_MCAST) += mcast.o | 28 | obj-$(CONFIG_UML_NET_MCAST) += mcast.o |
| 29 | #obj-$(CONFIG_UML_NET_PCAP) += pcap.o $(PCAP) | 29 | #obj-$(CONFIG_UML_NET_PCAP) += pcap.o $(PCAP) |
| @@ -41,6 +41,6 @@ obj-$(CONFIG_UML_WATCHDOG) += harddog.o | |||
| 41 | obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o | 41 | obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o |
| 42 | obj-$(CONFIG_UML_RANDOM) += random.o | 42 | obj-$(CONFIG_UML_RANDOM) += random.o |
| 43 | 43 | ||
| 44 | USER_OBJS := fd.o null.o pty.o tty.o xterm.o | 44 | USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o |
| 45 | 45 | ||
| 46 | include arch/um/scripts/Makefile.rules | 46 | include arch/um/scripts/Makefile.rules |
diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c index 583b8e137c33..5d3768156c92 100644 --- a/arch/um/drivers/chan_user.c +++ b/arch/um/drivers/chan_user.c | |||
| @@ -143,22 +143,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out) | |||
| 143 | { | 143 | { |
| 144 | struct winch_data data; | 144 | struct winch_data data; |
| 145 | unsigned long stack; | 145 | unsigned long stack; |
| 146 | int fds[2], pid, n, err; | 146 | int fds[2], n, err; |
| 147 | char c; | 147 | char c; |
| 148 | 148 | ||
| 149 | err = os_pipe(fds, 1, 1); | 149 | err = os_pipe(fds, 1, 1); |
| 150 | if(err < 0){ | 150 | if(err < 0){ |
| 151 | printk("winch_tramp : os_pipe failed, err = %d\n", -err); | 151 | printk("winch_tramp : os_pipe failed, err = %d\n", -err); |
| 152 | return(err); | 152 | goto out; |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | data = ((struct winch_data) { .pty_fd = fd, | 155 | data = ((struct winch_data) { .pty_fd = fd, |
| 156 | .pipe_fd = fds[1], | 156 | .pipe_fd = fds[1], |
| 157 | .close_me = fds[0] } ); | 157 | .close_me = fds[0] } ); |
| 158 | pid = run_helper_thread(winch_thread, &data, 0, &stack, 0); | 158 | err = run_helper_thread(winch_thread, &data, 0, &stack, 0); |
| 159 | if(pid < 0){ | 159 | if(err < 0){ |
| 160 | printk("fork of winch_thread failed - errno = %d\n", errno); | 160 | printk("fork of winch_thread failed - errno = %d\n", errno); |
| 161 | return(pid); | 161 | goto out_close; |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | os_close_file(fds[1]); | 164 | os_close_file(fds[1]); |
| @@ -168,14 +168,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out) | |||
| 168 | printk("winch_tramp : failed to read synchronization byte\n"); | 168 | printk("winch_tramp : failed to read synchronization byte\n"); |
| 169 | printk("read failed, err = %d\n", -n); | 169 | printk("read failed, err = %d\n", -n); |
| 170 | printk("fd %d will not support SIGWINCH\n", fd); | 170 | printk("fd %d will not support SIGWINCH\n", fd); |
| 171 | *fd_out = -1; | 171 | err = -EINVAL; |
| 172 | goto out_close1; | ||
| 172 | } | 173 | } |
| 173 | return(pid); | 174 | return err ; |
| 175 | |||
| 176 | out_close: | ||
| 177 | os_close_file(fds[1]); | ||
| 178 | out_close1: | ||
| 179 | os_close_file(fds[0]); | ||
| 180 | out: | ||
| 181 | return err; | ||
| 174 | } | 182 | } |
| 175 | 183 | ||
| 176 | void register_winch(int fd, struct tty_struct *tty) | 184 | void register_winch(int fd, struct tty_struct *tty) |
| 177 | { | 185 | { |
| 178 | int pid, thread, thread_fd; | 186 | int pid, thread, thread_fd = -1; |
| 179 | int count; | 187 | int count; |
| 180 | char c = 1; | 188 | char c = 1; |
| 181 | 189 | ||
| @@ -186,7 +194,7 @@ void register_winch(int fd, struct tty_struct *tty) | |||
| 186 | if(!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd, | 194 | if(!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd, |
| 187 | tty) && (pid == -1)){ | 195 | tty) && (pid == -1)){ |
| 188 | thread = winch_tramp(fd, tty, &thread_fd); | 196 | thread = winch_tramp(fd, tty, &thread_fd); |
| 189 | if(fd != -1){ | 197 | if(thread > 0){ |
| 190 | register_winch_irq(thread_fd, fd, thread, tty); | 198 | register_winch_irq(thread_fd, fd, thread, tty); |
| 191 | 199 | ||
| 192 | count = os_write_file(thread_fd, &c, sizeof(c)); | 200 | count = os_write_file(thread_fd, &c, sizeof(c)); |
diff --git a/arch/um/drivers/mmapper_kern.c b/arch/um/drivers/mmapper_kern.c index a63231dffe05..a37a5ac13c22 100644 --- a/arch/um/drivers/mmapper_kern.c +++ b/arch/um/drivers/mmapper_kern.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | #include <linux/smp_lock.h> | 20 | #include <linux/smp_lock.h> |
| 21 | #include <linux/miscdevice.h> | ||
| 21 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
| 22 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
| 23 | #include <asm/pgtable.h> | 24 | #include <asm/pgtable.h> |
| @@ -117,24 +118,39 @@ static struct file_operations mmapper_fops = { | |||
| 117 | .release = mmapper_release, | 118 | .release = mmapper_release, |
| 118 | }; | 119 | }; |
| 119 | 120 | ||
| 121 | static struct miscdevice mmapper_dev = { | ||
| 122 | .minor = MISC_DYNAMIC_MINOR, | ||
| 123 | .name = "mmapper", | ||
| 124 | .fops = &mmapper_fops | ||
| 125 | }; | ||
| 126 | |||
| 120 | static int __init mmapper_init(void) | 127 | static int __init mmapper_init(void) |
| 121 | { | 128 | { |
| 129 | int err; | ||
| 130 | |||
| 122 | printk(KERN_INFO "Mapper v0.1\n"); | 131 | printk(KERN_INFO "Mapper v0.1\n"); |
| 123 | 132 | ||
| 124 | v_buf = (char *) find_iomem("mmapper", &mmapper_size); | 133 | v_buf = (char *) find_iomem("mmapper", &mmapper_size); |
| 125 | if(mmapper_size == 0){ | 134 | if(mmapper_size == 0){ |
| 126 | printk(KERN_ERR "mmapper_init - find_iomem failed\n"); | 135 | printk(KERN_ERR "mmapper_init - find_iomem failed\n"); |
| 127 | return(0); | 136 | goto out; |
| 128 | } | 137 | } |
| 129 | 138 | ||
| 130 | p_buf = __pa(v_buf); | 139 | err = misc_register(&mmapper_dev); |
| 140 | if(err){ | ||
| 141 | printk(KERN_ERR "mmapper - misc_register failed, err = %d\n", | ||
| 142 | err); | ||
| 143 | goto out; | ||
| 144 | } | ||
| 131 | 145 | ||
| 132 | devfs_mk_cdev(MKDEV(30, 0), S_IFCHR|S_IRUGO|S_IWUGO, "mmapper"); | 146 | p_buf = __pa(v_buf); |
| 133 | return(0); | 147 | out: |
| 148 | return 0; | ||
| 134 | } | 149 | } |
| 135 | 150 | ||
| 136 | static void mmapper_exit(void) | 151 | static void mmapper_exit(void) |
| 137 | { | 152 | { |
| 153 | misc_deregister(&mmapper_dev); | ||
| 138 | } | 154 | } |
| 139 | 155 | ||
| 140 | module_init(mmapper_init); | 156 | module_init(mmapper_init); |
diff --git a/arch/um/drivers/net_user.c b/arch/um/drivers/net_user.c index 47229fe4a813..3730d4f12713 100644 --- a/arch/um/drivers/net_user.c +++ b/arch/um/drivers/net_user.c | |||
| @@ -32,7 +32,7 @@ int tap_open_common(void *dev, char *gate_addr) | |||
| 32 | return(0); | 32 | return(0); |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | void tap_check_ips(char *gate_addr, char *eth_addr) | 35 | void tap_check_ips(char *gate_addr, unsigned char *eth_addr) |
| 36 | { | 36 | { |
| 37 | int tap_addr[4]; | 37 | int tap_addr[4]; |
| 38 | 38 | ||
diff --git a/arch/um/drivers/slip.h b/arch/um/drivers/slip.h index 495f2f1b1420..bb0dab41c2e4 100644 --- a/arch/um/drivers/slip.h +++ b/arch/um/drivers/slip.h | |||
| @@ -1,10 +1,7 @@ | |||
| 1 | #ifndef __UM_SLIP_H | 1 | #ifndef __UM_SLIP_H |
| 2 | #define __UM_SLIP_H | 2 | #define __UM_SLIP_H |
| 3 | 3 | ||
| 4 | #define BUF_SIZE 1500 | 4 | #include "slip_common.h" |
| 5 | /* two bytes each for a (pathological) max packet of escaped chars + * | ||
| 6 | * terminating END char + initial END char */ | ||
| 7 | #define ENC_BUF_SIZE (2 * BUF_SIZE + 2) | ||
| 8 | 5 | ||
| 9 | struct slip_data { | 6 | struct slip_data { |
| 10 | void *dev; | 7 | void *dev; |
| @@ -12,28 +9,12 @@ struct slip_data { | |||
| 12 | char *addr; | 9 | char *addr; |
| 13 | char *gate_addr; | 10 | char *gate_addr; |
| 14 | int slave; | 11 | int slave; |
| 15 | char ibuf[ENC_BUF_SIZE]; | 12 | struct slip_proto slip; |
| 16 | char obuf[ENC_BUF_SIZE]; | ||
| 17 | int more; /* more data: do not read fd until ibuf has been drained */ | ||
| 18 | int pos; | ||
| 19 | int esc; | ||
| 20 | }; | 13 | }; |
| 21 | 14 | ||
| 22 | extern struct net_user_info slip_user_info; | 15 | extern struct net_user_info slip_user_info; |
| 23 | 16 | ||
| 24 | extern int set_umn_addr(int fd, char *addr, char *ptp_addr); | ||
| 25 | extern int slip_user_read(int fd, void *buf, int len, struct slip_data *pri); | 17 | extern int slip_user_read(int fd, void *buf, int len, struct slip_data *pri); |
| 26 | extern int slip_user_write(int fd, void *buf, int len, struct slip_data *pri); | 18 | extern int slip_user_write(int fd, void *buf, int len, struct slip_data *pri); |
| 27 | 19 | ||
| 28 | #endif | 20 | #endif |
| 29 | |||
| 30 | /* | ||
| 31 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 32 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 33 | * adjust the settings for this buffer only. This must remain at the end | ||
| 34 | * of the file. | ||
| 35 | * --------------------------------------------------------------------------- | ||
| 36 | * Local variables: | ||
| 37 | * c-file-style: "linux" | ||
| 38 | * End: | ||
| 39 | */ | ||
diff --git a/arch/um/drivers/slip_common.c b/arch/um/drivers/slip_common.c new file mode 100644 index 000000000000..e89cfc68fc3e --- /dev/null +++ b/arch/um/drivers/slip_common.c | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | #include <string.h> | ||
| 2 | #include "slip_common.h" | ||
| 3 | #include "net_user.h" | ||
| 4 | |||
| 5 | int slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip) | ||
| 6 | { | ||
| 7 | int i, n, size, start; | ||
| 8 | |||
| 9 | if(slip->more > 0){ | ||
| 10 | i = 0; | ||
| 11 | while(i < slip->more){ | ||
| 12 | size = slip_unesc(slip->ibuf[i++], slip->ibuf, | ||
| 13 | &slip->pos, &slip->esc); | ||
| 14 | if(size){ | ||
| 15 | memcpy(buf, slip->ibuf, size); | ||
| 16 | memmove(slip->ibuf, &slip->ibuf[i], | ||
| 17 | slip->more - i); | ||
| 18 | slip->more = slip->more - i; | ||
| 19 | return size; | ||
| 20 | } | ||
| 21 | } | ||
| 22 | slip->more = 0; | ||
| 23 | } | ||
| 24 | |||
| 25 | n = net_read(fd, &slip->ibuf[slip->pos], | ||
| 26 | sizeof(slip->ibuf) - slip->pos); | ||
| 27 | if(n <= 0) | ||
| 28 | return n; | ||
| 29 | |||
| 30 | start = slip->pos; | ||
| 31 | for(i = 0; i < n; i++){ | ||
| 32 | size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos, | ||
| 33 | &slip->esc); | ||
| 34 | if(size){ | ||
| 35 | memcpy(buf, slip->ibuf, size); | ||
| 36 | memmove(slip->ibuf, &slip->ibuf[start+i+1], | ||
| 37 | n - (i + 1)); | ||
| 38 | slip->more = n - (i + 1); | ||
| 39 | return size; | ||
| 40 | } | ||
| 41 | } | ||
| 42 | return 0; | ||
| 43 | } | ||
| 44 | |||
| 45 | int slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip) | ||
| 46 | { | ||
| 47 | int actual, n; | ||
| 48 | |||
| 49 | actual = slip_esc(buf, slip->obuf, len); | ||
| 50 | n = net_write(fd, slip->obuf, actual); | ||
| 51 | if(n < 0) | ||
| 52 | return n; | ||
| 53 | else return len; | ||
| 54 | } | ||
diff --git a/arch/um/drivers/slip_proto.h b/arch/um/drivers/slip_common.h index 7206361ace45..2ae76d8f1be1 100644 --- a/arch/um/drivers/slip_proto.h +++ b/arch/um/drivers/slip_common.h | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | /* | 1 | #ifndef __UM_SLIP_COMMON_H |
| 2 | * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | 2 | #define __UM_SLIP_COMMON_H |
| 3 | * Licensed under the GPL | ||
| 4 | */ | ||
| 5 | 3 | ||
| 6 | #ifndef __UM_SLIP_PROTO_H__ | 4 | #define BUF_SIZE 1500 |
| 7 | #define __UM_SLIP_PROTO_H__ | 5 | /* two bytes each for a (pathological) max packet of escaped chars + * |
| 6 | * terminating END char + initial END char */ | ||
| 7 | #define ENC_BUF_SIZE (2 * BUF_SIZE + 2) | ||
| 8 | 8 | ||
| 9 | /* SLIP protocol characters. */ | 9 | /* SLIP protocol characters. */ |
| 10 | #define SLIP_END 0300 /* indicates end of frame */ | 10 | #define SLIP_END 0300 /* indicates end of frame */ |
| @@ -12,7 +12,8 @@ | |||
| 12 | #define SLIP_ESC_END 0334 /* ESC ESC_END means END 'data' */ | 12 | #define SLIP_ESC_END 0334 /* ESC ESC_END means END 'data' */ |
| 13 | #define SLIP_ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */ | 13 | #define SLIP_ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */ |
| 14 | 14 | ||
| 15 | static inline int slip_unesc(unsigned char c,char *buf,int *pos, int *esc) | 15 | static inline int slip_unesc(unsigned char c, unsigned char *buf, int *pos, |
| 16 | int *esc) | ||
| 16 | { | 17 | { |
| 17 | int ret; | 18 | int ret; |
| 18 | 19 | ||
| @@ -79,15 +80,25 @@ static inline int slip_esc(unsigned char *s, unsigned char *d, int len) | |||
| 79 | return (ptr - d); | 80 | return (ptr - d); |
| 80 | } | 81 | } |
| 81 | 82 | ||
| 82 | #endif | 83 | struct slip_proto { |
| 84 | unsigned char ibuf[ENC_BUF_SIZE]; | ||
| 85 | unsigned char obuf[ENC_BUF_SIZE]; | ||
| 86 | int more; /* more data: do not read fd until ibuf has been drained */ | ||
| 87 | int pos; | ||
| 88 | int esc; | ||
| 89 | }; | ||
| 90 | |||
| 91 | #define SLIP_PROTO_INIT { \ | ||
| 92 | .ibuf = { '\0' }, \ | ||
| 93 | .obuf = { '\0' }, \ | ||
| 94 | .more = 0, \ | ||
| 95 | .pos = 0, \ | ||
| 96 | .esc = 0 \ | ||
| 97 | } | ||
| 83 | 98 | ||
| 84 | /* | 99 | extern int slip_proto_read(int fd, void *buf, int len, |
| 85 | * Overrides for Emacs so that we follow Linus's tabbing style. | 100 | struct slip_proto *slip); |
| 86 | * Emacs will notice this stuff at the end of the file and automatically | 101 | extern int slip_proto_write(int fd, void *buf, int len, |
| 87 | * adjust the settings for this buffer only. This must remain at the end | 102 | struct slip_proto *slip); |
| 88 | * of the file. | 103 | |
| 89 | * --------------------------------------------------------------------------- | 104 | #endif |
| 90 | * Local variables: | ||
| 91 | * c-file-style: "linux" | ||
| 92 | * End: | ||
| 93 | */ | ||
diff --git a/arch/um/drivers/slip_kern.c b/arch/um/drivers/slip_kern.c index 0886eedba213..9a6f5c85f902 100644 --- a/arch/um/drivers/slip_kern.c +++ b/arch/um/drivers/slip_kern.c | |||
| @@ -26,16 +26,16 @@ void slip_init(struct net_device *dev, void *data) | |||
| 26 | .addr = NULL, | 26 | .addr = NULL, |
| 27 | .gate_addr = init->gate_addr, | 27 | .gate_addr = init->gate_addr, |
| 28 | .slave = -1, | 28 | .slave = -1, |
| 29 | .ibuf = { '\0' }, | 29 | .slip = SLIP_PROTO_INIT, |
| 30 | .obuf = { '\0' }, | ||
| 31 | .pos = 0, | ||
| 32 | .esc = 0, | ||
| 33 | .dev = dev }); | 30 | .dev = dev }); |
| 34 | 31 | ||
| 35 | dev->init = NULL; | 32 | dev->init = NULL; |
| 33 | dev->header_cache_update = NULL; | ||
| 34 | dev->hard_header_cache = NULL; | ||
| 35 | dev->hard_header = NULL; | ||
| 36 | dev->hard_header_len = 0; | 36 | dev->hard_header_len = 0; |
| 37 | dev->addr_len = 4; | 37 | dev->addr_len = 0; |
| 38 | dev->type = ARPHRD_ETHER; | 38 | dev->type = ARPHRD_SLIP; |
| 39 | dev->tx_queue_len = 256; | 39 | dev->tx_queue_len = 256; |
| 40 | dev->flags = IFF_NOARP; | 40 | dev->flags = IFF_NOARP; |
| 41 | printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr); | 41 | printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr); |
diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c index d94846b1b4cf..71af444e591f 100644 --- a/arch/um/drivers/slip_user.c +++ b/arch/um/drivers/slip_user.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "user.h" | 13 | #include "user.h" |
| 14 | #include "net_user.h" | 14 | #include "net_user.h" |
| 15 | #include "slip.h" | 15 | #include "slip.h" |
| 16 | #include "slip_proto.h" | 16 | #include "slip_common.h" |
| 17 | #include "helper.h" | 17 | #include "helper.h" |
| 18 | #include "os.h" | 18 | #include "os.h" |
| 19 | 19 | ||
| @@ -77,41 +77,51 @@ static int slip_tramp(char **argv, int fd) | |||
| 77 | err = os_pipe(fds, 1, 0); | 77 | err = os_pipe(fds, 1, 0); |
| 78 | if(err < 0){ | 78 | if(err < 0){ |
| 79 | printk("slip_tramp : pipe failed, err = %d\n", -err); | 79 | printk("slip_tramp : pipe failed, err = %d\n", -err); |
| 80 | return(err); | 80 | goto out; |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | err = 0; | 83 | err = 0; |
| 84 | pe_data.stdin = fd; | 84 | pe_data.stdin = fd; |
| 85 | pe_data.stdout = fds[1]; | 85 | pe_data.stdout = fds[1]; |
| 86 | pe_data.close_me = fds[0]; | 86 | pe_data.close_me = fds[0]; |
| 87 | pid = run_helper(slip_pre_exec, &pe_data, argv, NULL); | 87 | err = run_helper(slip_pre_exec, &pe_data, argv, NULL); |
| 88 | if(err < 0) | ||
| 89 | goto out_close; | ||
| 90 | pid = err; | ||
| 91 | |||
| 92 | output_len = page_size(); | ||
| 93 | output = um_kmalloc(output_len); | ||
| 94 | if(output == NULL){ | ||
| 95 | printk("slip_tramp : failed to allocate output buffer\n"); | ||
| 96 | os_kill_process(pid, 1); | ||
| 97 | err = -ENOMEM; | ||
| 98 | goto out_free; | ||
| 99 | } | ||
| 88 | 100 | ||
| 89 | if(pid < 0) err = pid; | 101 | os_close_file(fds[1]); |
| 90 | else { | 102 | read_output(fds[0], output, output_len); |
| 91 | output_len = page_size(); | 103 | printk("%s", output); |
| 92 | output = um_kmalloc(output_len); | 104 | |
| 93 | if(output == NULL) | 105 | CATCH_EINTR(err = waitpid(pid, &status, 0)); |
| 94 | printk("slip_tramp : failed to allocate output " | 106 | if(err < 0) |
| 95 | "buffer\n"); | 107 | err = errno; |
| 96 | 108 | else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){ | |
| 97 | os_close_file(fds[1]); | 109 | printk("'%s' didn't exit with status 0\n", argv[0]); |
| 98 | read_output(fds[0], output, output_len); | 110 | err = -EINVAL; |
| 99 | if(output != NULL){ | ||
| 100 | printk("%s", output); | ||
| 101 | kfree(output); | ||
| 102 | } | ||
| 103 | CATCH_EINTR(err = waitpid(pid, &status, 0)); | ||
| 104 | if(err < 0) | ||
| 105 | err = errno; | ||
| 106 | else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){ | ||
| 107 | printk("'%s' didn't exit with status 0\n", argv[0]); | ||
| 108 | err = -EINVAL; | ||
| 109 | } | ||
| 110 | } | 111 | } |
| 112 | else err = 0; | ||
| 111 | 113 | ||
| 112 | os_close_file(fds[0]); | 114 | os_close_file(fds[0]); |
| 113 | 115 | ||
| 114 | return(err); | 116 | out_free: |
| 117 | kfree(output); | ||
| 118 | return err; | ||
| 119 | |||
| 120 | out_close: | ||
| 121 | os_close_file(fds[0]); | ||
| 122 | os_close_file(fds[1]); | ||
| 123 | out: | ||
| 124 | return err; | ||
| 115 | } | 125 | } |
| 116 | 126 | ||
| 117 | static int slip_open(void *data) | 127 | static int slip_open(void *data) |
| @@ -123,21 +133,26 @@ static int slip_open(void *data) | |||
| 123 | NULL }; | 133 | NULL }; |
| 124 | int sfd, mfd, err; | 134 | int sfd, mfd, err; |
| 125 | 135 | ||
| 126 | mfd = get_pty(); | 136 | err = get_pty(); |
| 127 | if(mfd < 0){ | 137 | if(err < 0){ |
| 128 | printk("umn : Failed to open pty, err = %d\n", -mfd); | 138 | printk("slip-open : Failed to open pty, err = %d\n", -err); |
| 129 | return(mfd); | 139 | goto out; |
| 130 | } | 140 | } |
| 131 | sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0); | 141 | mfd = err; |
| 132 | if(sfd < 0){ | 142 | |
| 133 | printk("Couldn't open tty for slip line, err = %d\n", -sfd); | 143 | err = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0); |
| 134 | os_close_file(mfd); | 144 | if(err < 0){ |
| 135 | return(sfd); | 145 | printk("Couldn't open tty for slip line, err = %d\n", -err); |
| 146 | goto out_close; | ||
| 136 | } | 147 | } |
| 137 | if(set_up_tty(sfd)) return(-1); | 148 | sfd = err; |
| 149 | |||
| 150 | if(set_up_tty(sfd)) | ||
| 151 | goto out_close2; | ||
| 152 | |||
| 138 | pri->slave = sfd; | 153 | pri->slave = sfd; |
| 139 | pri->pos = 0; | 154 | pri->slip.pos = 0; |
| 140 | pri->esc = 0; | 155 | pri->slip.esc = 0; |
| 141 | if(pri->gate_addr != NULL){ | 156 | if(pri->gate_addr != NULL){ |
| 142 | sprintf(version_buf, "%d", UML_NET_VERSION); | 157 | sprintf(version_buf, "%d", UML_NET_VERSION); |
| 143 | strcpy(gate_buf, pri->gate_addr); | 158 | strcpy(gate_buf, pri->gate_addr); |
| @@ -146,12 +161,12 @@ static int slip_open(void *data) | |||
| 146 | 161 | ||
| 147 | if(err < 0){ | 162 | if(err < 0){ |
| 148 | printk("slip_tramp failed - err = %d\n", -err); | 163 | printk("slip_tramp failed - err = %d\n", -err); |
| 149 | return(err); | 164 | goto out_close2; |
| 150 | } | 165 | } |
| 151 | err = os_get_ifname(pri->slave, pri->name); | 166 | err = os_get_ifname(pri->slave, pri->name); |
| 152 | if(err < 0){ | 167 | if(err < 0){ |
| 153 | printk("get_ifname failed, err = %d\n", -err); | 168 | printk("get_ifname failed, err = %d\n", -err); |
| 154 | return(err); | 169 | goto out_close2; |
| 155 | } | 170 | } |
| 156 | iter_addresses(pri->dev, open_addr, pri->name); | 171 | iter_addresses(pri->dev, open_addr, pri->name); |
| 157 | } | 172 | } |
| @@ -160,10 +175,16 @@ static int slip_open(void *data) | |||
| 160 | if(err < 0){ | 175 | if(err < 0){ |
| 161 | printk("Failed to set slip discipline encapsulation - " | 176 | printk("Failed to set slip discipline encapsulation - " |
| 162 | "err = %d\n", -err); | 177 | "err = %d\n", -err); |
| 163 | return(err); | 178 | goto out_close2; |
| 164 | } | 179 | } |
| 165 | } | 180 | } |
| 166 | return(mfd); | 181 | return(mfd); |
| 182 | out_close2: | ||
| 183 | os_close_file(sfd); | ||
| 184 | out_close: | ||
| 185 | os_close_file(mfd); | ||
| 186 | out: | ||
| 187 | return err; | ||
| 167 | } | 188 | } |
| 168 | 189 | ||
| 169 | static void slip_close(int fd, void *data) | 190 | static void slip_close(int fd, void *data) |
| @@ -190,48 +211,12 @@ static void slip_close(int fd, void *data) | |||
| 190 | 211 | ||
| 191 | int slip_user_read(int fd, void *buf, int len, struct slip_data *pri) | 212 | int slip_user_read(int fd, void *buf, int len, struct slip_data *pri) |
| 192 | { | 213 | { |
| 193 | int i, n, size, start; | 214 | return slip_proto_read(fd, buf, len, &pri->slip); |
| 194 | |||
| 195 | if(pri->more>0) { | ||
| 196 | i = 0; | ||
| 197 | while(i < pri->more) { | ||
| 198 | size = slip_unesc(pri->ibuf[i++], | ||
| 199 | pri->ibuf, &pri->pos, &pri->esc); | ||
| 200 | if(size){ | ||
| 201 | memcpy(buf, pri->ibuf, size); | ||
| 202 | memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); | ||
| 203 | pri->more=pri->more-i; | ||
| 204 | return(size); | ||
| 205 | } | ||
| 206 | } | ||
| 207 | pri->more=0; | ||
| 208 | } | ||
| 209 | |||
| 210 | n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); | ||
| 211 | if(n <= 0) return(n); | ||
| 212 | |||
| 213 | start = pri->pos; | ||
| 214 | for(i = 0; i < n; i++){ | ||
| 215 | size = slip_unesc(pri->ibuf[start + i], | ||
| 216 | pri->ibuf, &pri->pos, &pri->esc); | ||
| 217 | if(size){ | ||
| 218 | memcpy(buf, pri->ibuf, size); | ||
| 219 | memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); | ||
| 220 | pri->more=n-(i+1); | ||
| 221 | return(size); | ||
| 222 | } | ||
| 223 | } | ||
| 224 | return(0); | ||
| 225 | } | 215 | } |
| 226 | 216 | ||
| 227 | int slip_user_write(int fd, void *buf, int len, struct slip_data *pri) | 217 | int slip_user_write(int fd, void *buf, int len, struct slip_data *pri) |
| 228 | { | 218 | { |
| 229 | int actual, n; | 219 | return slip_proto_write(fd, buf, len, &pri->slip); |
| 230 | |||
| 231 | actual = slip_esc(buf, pri->obuf, len); | ||
| 232 | n = net_write(fd, pri->obuf, actual); | ||
| 233 | if(n < 0) return(n); | ||
| 234 | else return(len); | ||
| 235 | } | 220 | } |
| 236 | 221 | ||
| 237 | static int slip_set_mtu(int mtu, void *data) | 222 | static int slip_set_mtu(int mtu, void *data) |
| @@ -267,14 +252,3 @@ struct net_user_info slip_user_info = { | |||
| 267 | .delete_address = slip_del_addr, | 252 | .delete_address = slip_del_addr, |
| 268 | .max_packet = BUF_SIZE | 253 | .max_packet = BUF_SIZE |
| 269 | }; | 254 | }; |
| 270 | |||
| 271 | /* | ||
| 272 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 273 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 274 | * adjust the settings for this buffer only. This must remain at the end | ||
| 275 | * of the file. | ||
| 276 | * --------------------------------------------------------------------------- | ||
| 277 | * Local variables: | ||
| 278 | * c-file-style: "linux" | ||
| 279 | * End: | ||
| 280 | */ | ||
diff --git a/arch/um/drivers/slirp.h b/arch/um/drivers/slirp.h index 04e407d1e44a..6cf88ab580c9 100644 --- a/arch/um/drivers/slirp.h +++ b/arch/um/drivers/slirp.h | |||
| @@ -1,10 +1,7 @@ | |||
| 1 | #ifndef __UM_SLIRP_H | 1 | #ifndef __UM_SLIRP_H |
| 2 | #define __UM_SLIRP_H | 2 | #define __UM_SLIRP_H |
| 3 | 3 | ||
| 4 | #define BUF_SIZE 1500 | 4 | #include "slip_common.h" |
| 5 | /* two bytes each for a (pathological) max packet of escaped chars + * | ||
| 6 | * terminating END char + initial END char */ | ||
| 7 | #define ENC_BUF_SIZE (2 * BUF_SIZE + 2) | ||
| 8 | 5 | ||
| 9 | #define SLIRP_MAX_ARGS 100 | 6 | #define SLIRP_MAX_ARGS 100 |
| 10 | /* | 7 | /* |
| @@ -24,28 +21,13 @@ struct slirp_data { | |||
| 24 | struct arg_list_dummy_wrapper argw; | 21 | struct arg_list_dummy_wrapper argw; |
| 25 | int pid; | 22 | int pid; |
| 26 | int slave; | 23 | int slave; |
| 27 | char ibuf[ENC_BUF_SIZE]; | 24 | struct slip_proto slip; |
| 28 | char obuf[ENC_BUF_SIZE]; | ||
| 29 | int more; /* more data: do not read fd until ibuf has been drained */ | ||
| 30 | int pos; | ||
| 31 | int esc; | ||
| 32 | }; | 25 | }; |
| 33 | 26 | ||
| 34 | extern struct net_user_info slirp_user_info; | 27 | extern struct net_user_info slirp_user_info; |
| 35 | 28 | ||
| 36 | extern int set_umn_addr(int fd, char *addr, char *ptp_addr); | ||
| 37 | extern int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri); | 29 | extern int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri); |
| 38 | extern int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri); | 30 | extern int slirp_user_write(int fd, void *buf, int len, |
| 31 | struct slirp_data *pri); | ||
| 39 | 32 | ||
| 40 | #endif | 33 | #endif |
| 41 | |||
| 42 | /* | ||
| 43 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 44 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 45 | * adjust the settings for this buffer only. This must remain at the end | ||
| 46 | * of the file. | ||
| 47 | * --------------------------------------------------------------------------- | ||
| 48 | * Local variables: | ||
| 49 | * c-file-style: "linux" | ||
| 50 | * End: | ||
| 51 | */ | ||
diff --git a/arch/um/drivers/slirp_kern.c b/arch/um/drivers/slirp_kern.c index c9d6b52a831d..9864d27afdbe 100644 --- a/arch/um/drivers/slirp_kern.c +++ b/arch/um/drivers/slirp_kern.c | |||
| @@ -25,10 +25,7 @@ void slirp_init(struct net_device *dev, void *data) | |||
| 25 | { .argw = init->argw, | 25 | { .argw = init->argw, |
| 26 | .pid = -1, | 26 | .pid = -1, |
| 27 | .slave = -1, | 27 | .slave = -1, |
| 28 | .ibuf = { '\0' }, | 28 | .slip = SLIP_PROTO_INIT, |
| 29 | .obuf = { '\0' }, | ||
| 30 | .pos = 0, | ||
| 31 | .esc = 0, | ||
| 32 | .dev = dev }); | 29 | .dev = dev }); |
| 33 | 30 | ||
| 34 | dev->init = NULL; | 31 | dev->init = NULL; |
diff --git a/arch/um/drivers/slirp_user.c b/arch/um/drivers/slirp_user.c index c322515c71cc..8d91f663d82c 100644 --- a/arch/um/drivers/slirp_user.c +++ b/arch/um/drivers/slirp_user.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include "user.h" | 12 | #include "user.h" |
| 13 | #include "net_user.h" | 13 | #include "net_user.h" |
| 14 | #include "slirp.h" | 14 | #include "slirp.h" |
| 15 | #include "slip_proto.h" | 15 | #include "slip_common.h" |
| 16 | #include "helper.h" | 16 | #include "helper.h" |
| 17 | #include "os.h" | 17 | #include "os.h" |
| 18 | 18 | ||
| @@ -48,47 +48,32 @@ static int slirp_tramp(char **argv, int fd) | |||
| 48 | return(pid); | 48 | return(pid); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | /* XXX This is just a trivial wrapper around os_pipe */ | ||
| 52 | static int slirp_datachan(int *mfd, int *sfd) | ||
| 53 | { | ||
| 54 | int fds[2], err; | ||
| 55 | |||
| 56 | err = os_pipe(fds, 1, 1); | ||
| 57 | if(err < 0){ | ||
| 58 | printk("slirp_datachan: Failed to open pipe, err = %d\n", -err); | ||
| 59 | return(err); | ||
| 60 | } | ||
| 61 | |||
| 62 | *mfd = fds[0]; | ||
| 63 | *sfd = fds[1]; | ||
| 64 | return(0); | ||
| 65 | } | ||
| 66 | |||
| 67 | static int slirp_open(void *data) | 51 | static int slirp_open(void *data) |
| 68 | { | 52 | { |
| 69 | struct slirp_data *pri = data; | 53 | struct slirp_data *pri = data; |
| 70 | int sfd, mfd, pid, err; | 54 | int fds[2], pid, err; |
| 71 | 55 | ||
| 72 | err = slirp_datachan(&mfd, &sfd); | 56 | err = os_pipe(fds, 1, 1); |
| 73 | if(err) | 57 | if(err) |
| 74 | return(err); | 58 | return(err); |
| 75 | 59 | ||
| 76 | pid = slirp_tramp(pri->argw.argv, sfd); | 60 | err = slirp_tramp(pri->argw.argv, fds[1]); |
| 77 | 61 | if(err < 0){ | |
| 78 | if(pid < 0){ | 62 | printk("slirp_tramp failed - errno = %d\n", -err); |
| 79 | printk("slirp_tramp failed - errno = %d\n", -pid); | 63 | goto out; |
| 80 | os_close_file(sfd); | ||
| 81 | os_close_file(mfd); | ||
| 82 | return(pid); | ||
| 83 | } | 64 | } |
| 84 | 65 | pid = err; | |
| 85 | pri->slave = sfd; | 66 | |
| 86 | pri->pos = 0; | 67 | pri->slave = fds[1]; |
| 87 | pri->esc = 0; | 68 | pri->slip.pos = 0; |
| 88 | 69 | pri->slip.esc = 0; | |
| 89 | pri->pid = pid; | 70 | pri->pid = err; |
| 90 | 71 | ||
| 91 | return(mfd); | 72 | return(fds[0]); |
| 73 | out: | ||
| 74 | os_close_file(fds[0]); | ||
| 75 | os_close_file(fds[1]); | ||
| 76 | return err; | ||
| 92 | } | 77 | } |
| 93 | 78 | ||
| 94 | static void slirp_close(int fd, void *data) | 79 | static void slirp_close(int fd, void *data) |
| @@ -129,48 +114,12 @@ static void slirp_close(int fd, void *data) | |||
| 129 | 114 | ||
| 130 | int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri) | 115 | int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri) |
| 131 | { | 116 | { |
| 132 | int i, n, size, start; | 117 | return slip_proto_read(fd, buf, len, &pri->slip); |
| 133 | |||
| 134 | if(pri->more>0) { | ||
| 135 | i = 0; | ||
| 136 | while(i < pri->more) { | ||
| 137 | size = slip_unesc(pri->ibuf[i++], | ||
| 138 | pri->ibuf,&pri->pos,&pri->esc); | ||
| 139 | if(size){ | ||
| 140 | memcpy(buf, pri->ibuf, size); | ||
| 141 | memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); | ||
| 142 | pri->more=pri->more-i; | ||
| 143 | return(size); | ||
| 144 | } | ||
| 145 | } | ||
| 146 | pri->more=0; | ||
| 147 | } | ||
| 148 | |||
| 149 | n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); | ||
| 150 | if(n <= 0) return(n); | ||
| 151 | |||
| 152 | start = pri->pos; | ||
| 153 | for(i = 0; i < n; i++){ | ||
| 154 | size = slip_unesc(pri->ibuf[start + i], | ||
| 155 | pri->ibuf,&pri->pos,&pri->esc); | ||
| 156 | if(size){ | ||
| 157 | memcpy(buf, pri->ibuf, size); | ||
| 158 | memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); | ||
| 159 | pri->more=n-(i+1); | ||
| 160 | return(size); | ||
| 161 | } | ||
| 162 | } | ||
| 163 | return(0); | ||
| 164 | } | 118 | } |
| 165 | 119 | ||
| 166 | int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri) | 120 | int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri) |
| 167 | { | 121 | { |
| 168 | int actual, n; | 122 | return slip_proto_write(fd, buf, len, &pri->slip); |
| 169 | |||
| 170 | actual = slip_esc(buf, pri->obuf, len); | ||
| 171 | n = net_write(fd, pri->obuf, actual); | ||
| 172 | if(n < 0) return(n); | ||
| 173 | else return(len); | ||
| 174 | } | 123 | } |
| 175 | 124 | ||
| 176 | static int slirp_set_mtu(int mtu, void *data) | 125 | static int slirp_set_mtu(int mtu, void *data) |
| @@ -188,14 +137,3 @@ struct net_user_info slirp_user_info = { | |||
| 188 | .delete_address = NULL, | 137 | .delete_address = NULL, |
| 189 | .max_packet = BUF_SIZE | 138 | .max_packet = BUF_SIZE |
| 190 | }; | 139 | }; |
| 191 | |||
| 192 | /* | ||
| 193 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 194 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 195 | * adjust the settings for this buffer only. This must remain at the end | ||
| 196 | * of the file. | ||
| 197 | * --------------------------------------------------------------------------- | ||
| 198 | * Local variables: | ||
| 199 | * c-file-style: "linux" | ||
| 200 | * End: | ||
| 201 | */ | ||
diff --git a/arch/um/drivers/stderr_console.c b/arch/um/drivers/stderr_console.c index 98565b53d170..429ae8e6c7e5 100644 --- a/arch/um/drivers/stderr_console.c +++ b/arch/um/drivers/stderr_console.c | |||
| @@ -22,9 +22,9 @@ static void stderr_console_write(struct console *console, const char *string, | |||
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | static struct console stderr_console = { | 24 | static struct console stderr_console = { |
| 25 | .name "stderr", | 25 | .name = "stderr", |
| 26 | .write stderr_console_write, | 26 | .write = stderr_console_write, |
| 27 | .flags CON_PRINTBUFFER, | 27 | .flags = CON_PRINTBUFFER, |
| 28 | }; | 28 | }; |
| 29 | 29 | ||
| 30 | static int __init stderr_console_init(void) | 30 | static int __init stderr_console_init(void) |
diff --git a/arch/um/include/mconsole.h b/arch/um/include/mconsole.h index 9fbe3083fdd8..cfa368e045a5 100644 --- a/arch/um/include/mconsole.h +++ b/arch/um/include/mconsole.h | |||
| @@ -56,7 +56,7 @@ struct mc_request | |||
| 56 | int as_interrupt; | 56 | int as_interrupt; |
| 57 | 57 | ||
| 58 | int originating_fd; | 58 | int originating_fd; |
| 59 | int originlen; | 59 | unsigned int originlen; |
| 60 | unsigned char origin[128]; /* sockaddr_un */ | 60 | unsigned char origin[128]; /* sockaddr_un */ |
| 61 | 61 | ||
| 62 | struct mconsole_request request; | 62 | struct mconsole_request request; |
diff --git a/arch/um/include/net_user.h b/arch/um/include/net_user.h index 36807b796e9f..89885a77a771 100644 --- a/arch/um/include/net_user.h +++ b/arch/um/include/net_user.h | |||
| @@ -35,7 +35,7 @@ extern void *get_output_buffer(int *len_out); | |||
| 35 | extern void free_output_buffer(void *buffer); | 35 | extern void free_output_buffer(void *buffer); |
| 36 | 36 | ||
| 37 | extern int tap_open_common(void *dev, char *gate_addr); | 37 | extern int tap_open_common(void *dev, char *gate_addr); |
| 38 | extern void tap_check_ips(char *gate_addr, char *eth_addr); | 38 | extern void tap_check_ips(char *gate_addr, unsigned char *eth_addr); |
| 39 | 39 | ||
| 40 | extern void read_output(int fd, char *output_out, int len); | 40 | extern void read_output(int fd, char *output_out, int len); |
| 41 | 41 | ||
diff --git a/arch/um/include/os.h b/arch/um/include/os.h index d246d5a24609..881d2988d2d8 100644 --- a/arch/um/include/os.h +++ b/arch/um/include/os.h | |||
| @@ -136,7 +136,7 @@ extern int os_seek_file(int fd, __u64 offset); | |||
| 136 | extern int os_open_file(char *file, struct openflags flags, int mode); | 136 | extern int os_open_file(char *file, struct openflags flags, int mode); |
| 137 | extern int os_read_file(int fd, void *buf, int len); | 137 | extern int os_read_file(int fd, void *buf, int len); |
| 138 | extern int os_write_file(int fd, const void *buf, int count); | 138 | extern int os_write_file(int fd, const void *buf, int count); |
| 139 | extern int os_file_size(char *file, long long *size_out); | 139 | extern int os_file_size(char *file, unsigned long long *size_out); |
| 140 | extern int os_file_modtime(char *file, unsigned long *modtime); | 140 | extern int os_file_modtime(char *file, unsigned long *modtime); |
| 141 | extern int os_pipe(int *fd, int stream, int close_on_exec); | 141 | extern int os_pipe(int *fd, int stream, int close_on_exec); |
| 142 | extern int os_set_fd_async(int fd, int owner); | 142 | extern int os_set_fd_async(int fd, int owner); |
diff --git a/arch/um/include/sysdep-i386/ptrace.h b/arch/um/include/sysdep-i386/ptrace.h index 6eaeb9919983..c8ee9559f3ab 100644 --- a/arch/um/include/sysdep-i386/ptrace.h +++ b/arch/um/include/sysdep-i386/ptrace.h | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | 8 | ||
| 9 | #include "uml-config.h" | 9 | #include "uml-config.h" |
| 10 | #include "user_constants.h" | 10 | #include "user_constants.h" |
| 11 | #include "sysdep/faultinfo.h" | ||
| 12 | #include "choose-mode.h" | ||
| 11 | 13 | ||
| 12 | #define MAX_REG_NR (UM_FRAME_SIZE / sizeof(unsigned long)) | 14 | #define MAX_REG_NR (UM_FRAME_SIZE / sizeof(unsigned long)) |
| 13 | #define MAX_REG_OFFSET (UM_FRAME_SIZE) | 15 | #define MAX_REG_OFFSET (UM_FRAME_SIZE) |
| @@ -58,9 +60,6 @@ extern int sysemu_supported; | |||
| 58 | #define PTRACE_SYSEMU_SINGLESTEP 32 | 60 | #define PTRACE_SYSEMU_SINGLESTEP 32 |
| 59 | #endif | 61 | #endif |
| 60 | 62 | ||
| 61 | #include "sysdep/faultinfo.h" | ||
| 62 | #include "choose-mode.h" | ||
| 63 | |||
| 64 | union uml_pt_regs { | 63 | union uml_pt_regs { |
| 65 | #ifdef UML_CONFIG_MODE_TT | 64 | #ifdef UML_CONFIG_MODE_TT |
| 66 | struct tt_regs { | 65 | struct tt_regs { |
diff --git a/arch/um/include/user_util.h b/arch/um/include/user_util.h index b8c5b8a95250..7b6a24dfd302 100644 --- a/arch/um/include/user_util.h +++ b/arch/um/include/user_util.h | |||
| @@ -41,9 +41,6 @@ extern unsigned long highmem; | |||
| 41 | extern char host_info[]; | 41 | extern char host_info[]; |
| 42 | 42 | ||
| 43 | extern char saved_command_line[]; | 43 | extern char saved_command_line[]; |
| 44 | extern char command_line[]; | ||
| 45 | |||
| 46 | extern char *tempdir; | ||
| 47 | 44 | ||
| 48 | extern unsigned long _stext, _etext, _sdata, _edata, __bss_start, _end; | 45 | extern unsigned long _stext, _etext, _sdata, _edata, __bss_start, _end; |
| 49 | extern unsigned long _unprotected_end; | 46 | extern unsigned long _unprotected_end; |
diff --git a/arch/um/kernel/main.c b/arch/um/kernel/main.c index e42e6364ca13..e59f58152678 100644 --- a/arch/um/kernel/main.c +++ b/arch/um/kernel/main.c | |||
| @@ -24,8 +24,6 @@ | |||
| 24 | #include "mode.h" | 24 | #include "mode.h" |
| 25 | #include "choose-mode.h" | 25 | #include "choose-mode.h" |
| 26 | #include "uml-config.h" | 26 | #include "uml-config.h" |
| 27 | #include "irq_user.h" | ||
| 28 | #include "time_user.h" | ||
| 29 | #include "os.h" | 27 | #include "os.h" |
| 30 | 28 | ||
| 31 | /* Set in set_stklim, which is called from main and __wrap_malloc. | 29 | /* Set in set_stklim, which is called from main and __wrap_malloc. |
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 51f8e5a8ac6a..1b5ef3e96c71 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | #include "init.h" | 30 | #include "init.h" |
| 31 | #include "os.h" | 31 | #include "os.h" |
| 32 | #include "uml-config.h" | 32 | #include "uml-config.h" |
| 33 | #include "ptrace_user.h" | ||
| 34 | #include "choose-mode.h" | 33 | #include "choose-mode.h" |
| 35 | #include "mode.h" | 34 | #include "mode.h" |
| 36 | #ifdef UML_CONFIG_MODE_SKAS | 35 | #ifdef UML_CONFIG_MODE_SKAS |
| @@ -131,7 +130,7 @@ int start_fork_tramp(void *thread_arg, unsigned long temp_stack, | |||
| 131 | return(arg.pid); | 130 | return(arg.pid); |
| 132 | } | 131 | } |
| 133 | 132 | ||
| 134 | static int ptrace_child(void *arg) | 133 | static int ptrace_child(void) |
| 135 | { | 134 | { |
| 136 | int ret; | 135 | int ret; |
| 137 | int pid = os_getpid(), ppid = getppid(); | 136 | int pid = os_getpid(), ppid = getppid(); |
| @@ -160,20 +159,16 @@ static int ptrace_child(void *arg) | |||
| 160 | _exit(ret); | 159 | _exit(ret); |
| 161 | } | 160 | } |
| 162 | 161 | ||
| 163 | static int start_ptraced_child(void **stack_out) | 162 | static int start_ptraced_child(void) |
| 164 | { | 163 | { |
| 165 | void *stack; | ||
| 166 | unsigned long sp; | ||
| 167 | int pid, n, status; | 164 | int pid, n, status; |
| 168 | 165 | ||
| 169 | stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, | 166 | pid = fork(); |
| 170 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | 167 | if(pid == 0) |
| 171 | if(stack == MAP_FAILED) | 168 | ptrace_child(); |
| 172 | panic("check_ptrace : mmap failed, errno = %d", errno); | 169 | |
| 173 | sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); | ||
| 174 | pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); | ||
| 175 | if(pid < 0) | 170 | if(pid < 0) |
| 176 | panic("check_ptrace : clone failed, errno = %d", errno); | 171 | panic("check_ptrace : fork failed, errno = %d", errno); |
| 177 | CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); | 172 | CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); |
| 178 | if(n < 0) | 173 | if(n < 0) |
| 179 | panic("check_ptrace : wait failed, errno = %d", errno); | 174 | panic("check_ptrace : wait failed, errno = %d", errno); |
| @@ -181,7 +176,6 @@ static int start_ptraced_child(void **stack_out) | |||
| 181 | panic("check_ptrace : expected SIGSTOP, got status = %d", | 176 | panic("check_ptrace : expected SIGSTOP, got status = %d", |
| 182 | status); | 177 | status); |
| 183 | 178 | ||
| 184 | *stack_out = stack; | ||
| 185 | return(pid); | 179 | return(pid); |
| 186 | } | 180 | } |
| 187 | 181 | ||
| @@ -189,12 +183,12 @@ static int start_ptraced_child(void **stack_out) | |||
| 189 | * just avoid using sysemu, not panic, but only if SYSEMU features are broken. | 183 | * just avoid using sysemu, not panic, but only if SYSEMU features are broken. |
| 190 | * So only for SYSEMU features we test mustpanic, while normal host features | 184 | * So only for SYSEMU features we test mustpanic, while normal host features |
| 191 | * must work anyway!*/ | 185 | * must work anyway!*/ |
| 192 | static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic) | 186 | static int stop_ptraced_child(int pid, int exitcode, int mustexit) |
| 193 | { | 187 | { |
| 194 | int status, n, ret = 0; | 188 | int status, n, ret = 0; |
| 195 | 189 | ||
| 196 | if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) | 190 | if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) |
| 197 | panic("check_ptrace : ptrace failed, errno = %d", errno); | 191 | panic("stop_ptraced_child : ptrace failed, errno = %d", errno); |
| 198 | CATCH_EINTR(n = waitpid(pid, &status, 0)); | 192 | CATCH_EINTR(n = waitpid(pid, &status, 0)); |
| 199 | if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) { | 193 | if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) { |
| 200 | int exit_with = WEXITSTATUS(status); | 194 | int exit_with = WEXITSTATUS(status); |
| @@ -205,15 +199,13 @@ static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic) | |||
| 205 | printk("check_ptrace : child exited with exitcode %d, while " | 199 | printk("check_ptrace : child exited with exitcode %d, while " |
| 206 | "expecting %d; status 0x%x", exit_with, | 200 | "expecting %d; status 0x%x", exit_with, |
| 207 | exitcode, status); | 201 | exitcode, status); |
| 208 | if (mustpanic) | 202 | if (mustexit) |
| 209 | panic("\n"); | 203 | panic("\n"); |
| 210 | else | 204 | else |
| 211 | printk("\n"); | 205 | printk("\n"); |
| 212 | ret = -1; | 206 | ret = -1; |
| 213 | } | 207 | } |
| 214 | 208 | ||
| 215 | if(munmap(stack, PAGE_SIZE) < 0) | ||
| 216 | panic("check_ptrace : munmap failed, errno = %d", errno); | ||
| 217 | return ret; | 209 | return ret; |
| 218 | } | 210 | } |
| 219 | 211 | ||
| @@ -235,12 +227,11 @@ __uml_setup("nosysemu", nosysemu_cmd_param, | |||
| 235 | 227 | ||
| 236 | static void __init check_sysemu(void) | 228 | static void __init check_sysemu(void) |
| 237 | { | 229 | { |
| 238 | void *stack; | ||
| 239 | int pid, syscall, n, status, count=0; | 230 | int pid, syscall, n, status, count=0; |
| 240 | 231 | ||
| 241 | printk("Checking syscall emulation patch for ptrace..."); | 232 | printk("Checking syscall emulation patch for ptrace..."); |
| 242 | sysemu_supported = 0; | 233 | sysemu_supported = 0; |
| 243 | pid = start_ptraced_child(&stack); | 234 | pid = start_ptraced_child(); |
| 244 | 235 | ||
| 245 | if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0) | 236 | if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0) |
| 246 | goto fail; | 237 | goto fail; |
| @@ -258,7 +249,7 @@ static void __init check_sysemu(void) | |||
| 258 | panic("check_sysemu : failed to modify system " | 249 | panic("check_sysemu : failed to modify system " |
| 259 | "call return, errno = %d", errno); | 250 | "call return, errno = %d", errno); |
| 260 | 251 | ||
| 261 | if (stop_ptraced_child(pid, stack, 0, 0) < 0) | 252 | if (stop_ptraced_child(pid, 0, 0) < 0) |
| 262 | goto fail_stopped; | 253 | goto fail_stopped; |
| 263 | 254 | ||
| 264 | sysemu_supported = 1; | 255 | sysemu_supported = 1; |
| @@ -266,7 +257,7 @@ static void __init check_sysemu(void) | |||
| 266 | set_using_sysemu(!force_sysemu_disabled); | 257 | set_using_sysemu(!force_sysemu_disabled); |
| 267 | 258 | ||
| 268 | printk("Checking advanced syscall emulation patch for ptrace..."); | 259 | printk("Checking advanced syscall emulation patch for ptrace..."); |
| 269 | pid = start_ptraced_child(&stack); | 260 | pid = start_ptraced_child(); |
| 270 | while(1){ | 261 | while(1){ |
| 271 | count++; | 262 | count++; |
| 272 | if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0) | 263 | if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0) |
| @@ -291,7 +282,7 @@ static void __init check_sysemu(void) | |||
| 291 | break; | 282 | break; |
| 292 | } | 283 | } |
| 293 | } | 284 | } |
| 294 | if (stop_ptraced_child(pid, stack, 0, 0) < 0) | 285 | if (stop_ptraced_child(pid, 0, 0) < 0) |
| 295 | goto fail_stopped; | 286 | goto fail_stopped; |
| 296 | 287 | ||
| 297 | sysemu_supported = 2; | 288 | sysemu_supported = 2; |
| @@ -302,18 +293,17 @@ static void __init check_sysemu(void) | |||
| 302 | return; | 293 | return; |
| 303 | 294 | ||
| 304 | fail: | 295 | fail: |
| 305 | stop_ptraced_child(pid, stack, 1, 0); | 296 | stop_ptraced_child(pid, 1, 0); |
| 306 | fail_stopped: | 297 | fail_stopped: |
| 307 | printk("missing\n"); | 298 | printk("missing\n"); |
| 308 | } | 299 | } |
| 309 | 300 | ||
| 310 | void __init check_ptrace(void) | 301 | void __init check_ptrace(void) |
| 311 | { | 302 | { |
| 312 | void *stack; | ||
| 313 | int pid, syscall, n, status; | 303 | int pid, syscall, n, status; |
| 314 | 304 | ||
| 315 | printk("Checking that ptrace can change system call numbers..."); | 305 | printk("Checking that ptrace can change system call numbers..."); |
| 316 | pid = start_ptraced_child(&stack); | 306 | pid = start_ptraced_child(); |
| 317 | 307 | ||
| 318 | if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) | 308 | if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) |
| 319 | panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno); | 309 | panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno); |
| @@ -340,7 +330,7 @@ void __init check_ptrace(void) | |||
| 340 | break; | 330 | break; |
| 341 | } | 331 | } |
| 342 | } | 332 | } |
| 343 | stop_ptraced_child(pid, stack, 0, 1); | 333 | stop_ptraced_child(pid, 0, 1); |
| 344 | printk("OK\n"); | 334 | printk("OK\n"); |
| 345 | check_sysemu(); | 335 | check_sysemu(); |
| 346 | } | 336 | } |
| @@ -372,11 +362,10 @@ void forward_pending_sigio(int target) | |||
| 372 | static inline int check_skas3_ptrace_support(void) | 362 | static inline int check_skas3_ptrace_support(void) |
| 373 | { | 363 | { |
| 374 | struct ptrace_faultinfo fi; | 364 | struct ptrace_faultinfo fi; |
| 375 | void *stack; | ||
| 376 | int pid, n, ret = 1; | 365 | int pid, n, ret = 1; |
| 377 | 366 | ||
| 378 | printf("Checking for the skas3 patch in the host..."); | 367 | printf("Checking for the skas3 patch in the host..."); |
| 379 | pid = start_ptraced_child(&stack); | 368 | pid = start_ptraced_child(); |
| 380 | 369 | ||
| 381 | n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); | 370 | n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); |
| 382 | if (n < 0) { | 371 | if (n < 0) { |
| @@ -391,7 +380,7 @@ static inline int check_skas3_ptrace_support(void) | |||
| 391 | } | 380 | } |
| 392 | 381 | ||
| 393 | init_registers(pid); | 382 | init_registers(pid); |
| 394 | stop_ptraced_child(pid, stack, 1, 1); | 383 | stop_ptraced_child(pid, 1, 1); |
| 395 | 384 | ||
| 396 | return(ret); | 385 | return(ret); |
| 397 | } | 386 | } |
diff --git a/arch/um/kernel/skas/process_kern.c b/arch/um/kernel/skas/process_kern.c index ab5d3271da0b..fc71ef295782 100644 --- a/arch/um/kernel/skas/process_kern.c +++ b/arch/um/kernel/skas/process_kern.c | |||
| @@ -68,8 +68,11 @@ void new_thread_handler(int sig) | |||
| 68 | * 0 if it just exits | 68 | * 0 if it just exits |
| 69 | */ | 69 | */ |
| 70 | n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf); | 70 | n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf); |
| 71 | if(n == 1) | 71 | if(n == 1){ |
| 72 | /* Handle any immediate reschedules or signals */ | ||
| 73 | interrupt_end(); | ||
| 72 | userspace(¤t->thread.regs.regs); | 74 | userspace(¤t->thread.regs.regs); |
| 75 | } | ||
| 73 | else do_exit(0); | 76 | else do_exit(0); |
| 74 | } | 77 | } |
| 75 | 78 | ||
| @@ -96,6 +99,8 @@ void fork_handler(int sig) | |||
| 96 | schedule_tail(current->thread.prev_sched); | 99 | schedule_tail(current->thread.prev_sched); |
| 97 | current->thread.prev_sched = NULL; | 100 | current->thread.prev_sched = NULL; |
| 98 | 101 | ||
| 102 | /* Handle any immediate reschedules or signals */ | ||
| 103 | interrupt_end(); | ||
| 99 | userspace(¤t->thread.regs.regs); | 104 | userspace(¤t->thread.regs.regs); |
| 100 | } | 105 | } |
| 101 | 106 | ||
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 418427107b29..8736d098f0ee 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | #include "asm/setup.h" | 26 | #include "asm/setup.h" |
| 27 | #include "ubd_user.h" | 27 | #include "ubd_user.h" |
| 28 | #include "asm/current.h" | 28 | #include "asm/current.h" |
| 29 | #include "asm/setup.h" | ||
| 30 | #include "user_util.h" | 29 | #include "user_util.h" |
| 31 | #include "kern_util.h" | 30 | #include "kern_util.h" |
| 32 | #include "kern.h" | 31 | #include "kern.h" |
diff --git a/arch/um/os-Linux/elf_aux.c b/arch/um/os-Linux/elf_aux.c index 9aee0b62ebca..f0d6060e3e57 100644 --- a/arch/um/os-Linux/elf_aux.c +++ b/arch/um/os-Linux/elf_aux.c | |||
| @@ -45,7 +45,11 @@ __init void scan_elf_aux( char **envp) | |||
| 45 | elf_aux_hwcap = auxv->a_un.a_val; | 45 | elf_aux_hwcap = auxv->a_un.a_val; |
| 46 | break; | 46 | break; |
| 47 | case AT_PLATFORM: | 47 | case AT_PLATFORM: |
| 48 | elf_aux_platform = auxv->a_un.a_ptr; | 48 | /* elf.h removed the pointer elements from |
| 49 | * a_un, so we have to use a_val, which is | ||
| 50 | * all that's left. | ||
| 51 | */ | ||
| 52 | elf_aux_platform = (char *) auxv->a_un.a_val; | ||
| 49 | break; | 53 | break; |
| 50 | case AT_PAGESZ: | 54 | case AT_PAGESZ: |
| 51 | page_size = auxv->a_un.a_val; | 55 | page_size = auxv->a_un.a_val; |
diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c index 77d4066d1af8..fd45bb260907 100644 --- a/arch/um/os-Linux/file.c +++ b/arch/um/os-Linux/file.c | |||
| @@ -363,7 +363,7 @@ int os_write_file(int fd, const void *buf, int len) | |||
| 363 | (int (*)(int, void *, int)) write, copy_to_user_proc)); | 363 | (int (*)(int, void *, int)) write, copy_to_user_proc)); |
| 364 | } | 364 | } |
| 365 | 365 | ||
| 366 | int os_file_size(char *file, long long *size_out) | 366 | int os_file_size(char *file, unsigned long long *size_out) |
| 367 | { | 367 | { |
| 368 | struct uml_stat buf; | 368 | struct uml_stat buf; |
| 369 | int err; | 369 | int err; |
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules index 0b2491883d9c..98346c711493 100644 --- a/arch/um/scripts/Makefile.rules +++ b/arch/um/scripts/Makefile.rules | |||
| @@ -14,7 +14,7 @@ quiet_cmd_make_link = SYMLINK $@ | |||
| 14 | cmd_make_link = ln -sf $(srctree)/arch/$(SUBARCH)/$($(notdir $@)-dir)/$(notdir $@) $@ | 14 | cmd_make_link = ln -sf $(srctree)/arch/$(SUBARCH)/$($(notdir $@)-dir)/$(notdir $@) $@ |
| 15 | 15 | ||
| 16 | # this needs to be before the foreach, because targets does not accept | 16 | # this needs to be before the foreach, because targets does not accept |
| 17 | # complete paths like $(obj)/$(f). To make sure this works, use a := assignment, | 17 | # complete paths like $(obj)/$(f). To make sure this works, use a := assignment |
| 18 | # or we will get $(obj)/$(f) in the "targets" value. | 18 | # or we will get $(obj)/$(f) in the "targets" value. |
| 19 | # Also, this forces you to use the := syntax when assigning to targets. | 19 | # Also, this forces you to use the := syntax when assigning to targets. |
| 20 | # Otherwise the line below will cause an infinite loop (if you don't know why, | 20 | # Otherwise the line below will cause an infinite loop (if you don't know why, |
