Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
366fdb90
Commit
366fdb90
authored
Feb 05, 2003
by
Jeff Dike
Browse files
Options
Browse Files
Download
Plain Diff
Merge
parents
d164a32a
454f835d
Changes
113
Show whitespace changes
Inline
Side-by-side
Showing
113 changed files
with
1269 additions
and
1112 deletions
+1269
-1112
arch/um/Makefile
arch/um/Makefile
+1
-1
arch/um/drivers/chan_kern.c
arch/um/drivers/chan_kern.c
+18
-18
arch/um/drivers/chan_user.c
arch/um/drivers/chan_user.c
+3
-3
arch/um/drivers/daemon_kern.c
arch/um/drivers/daemon_kern.c
+21
-21
arch/um/drivers/daemon_user.c
arch/um/drivers/daemon_user.c
+11
-10
arch/um/drivers/fd.c
arch/um/drivers/fd.c
+12
-12
arch/um/drivers/harddog_kern.c
arch/um/drivers/harddog_kern.c
+8
-8
arch/um/drivers/hostaudio_kern.c
arch/um/drivers/hostaudio_kern.c
+14
-14
arch/um/drivers/line.c
arch/um/drivers/line.c
+8
-7
arch/um/drivers/mcast_kern.c
arch/um/drivers/mcast_kern.c
+19
-19
arch/um/drivers/mcast_user.c
arch/um/drivers/mcast_user.c
+8
-8
arch/um/drivers/mconsole_kern.c
arch/um/drivers/mconsole_kern.c
+5
-5
arch/um/drivers/mmapper_kern.c
arch/um/drivers/mmapper_kern.c
+7
-7
arch/um/drivers/net_kern.c
arch/um/drivers/net_kern.c
+24
-23
arch/um/drivers/null.c
arch/um/drivers/null.c
+10
-10
arch/um/drivers/pcap_kern.c
arch/um/drivers/pcap_kern.c
+21
-21
arch/um/drivers/pcap_user.c
arch/um/drivers/pcap_user.c
+10
-10
arch/um/drivers/port_kern.c
arch/um/drivers/port_kern.c
+61
-51
arch/um/drivers/port_user.c
arch/um/drivers/port_user.c
+37
-28
arch/um/drivers/pty.c
arch/um/drivers/pty.c
+24
-43
arch/um/drivers/slip_kern.c
arch/um/drivers/slip_kern.c
+21
-21
arch/um/drivers/slip_user.c
arch/um/drivers/slip_user.c
+8
-8
arch/um/drivers/slirp_kern.c
arch/um/drivers/slirp_kern.c
+19
-19
arch/um/drivers/slirp_user.c
arch/um/drivers/slirp_user.c
+8
-8
arch/um/drivers/ssl.c
arch/um/drivers/ssl.c
+37
-37
arch/um/drivers/stdio_console.c
arch/um/drivers/stdio_console.c
+47
-47
arch/um/drivers/tty.c
arch/um/drivers/tty.c
+12
-12
arch/um/drivers/ubd_kern.c
arch/um/drivers/ubd_kern.c
+11
-6
arch/um/drivers/xterm.c
arch/um/drivers/xterm.c
+24
-20
arch/um/drivers/xterm_kern.c
arch/um/drivers/xterm_kern.c
+7
-7
arch/um/include/choose-mode.h
arch/um/include/choose-mode.h
+3
-3
arch/um/include/frame.h
arch/um/include/frame.h
+3
-1
arch/um/include/irq_user.h
arch/um/include/irq_user.h
+1
-1
arch/um/include/kern_util.h
arch/um/include/kern_util.h
+5
-5
arch/um/include/mconsole.h
arch/um/include/mconsole.h
+14
-9
arch/um/include/mode.h
arch/um/include/mode.h
+2
-2
arch/um/include/os.h
arch/um/include/os.h
+11
-3
arch/um/include/signal_kern.h
arch/um/include/signal_kern.h
+1
-5
arch/um/include/sysdep-i386/frame.h
arch/um/include/sysdep-i386/frame.h
+2
-1
arch/um/include/sysdep-i386/frame_kern.h
arch/um/include/sysdep-i386/frame_kern.h
+10
-1
arch/um/include/sysdep-i386/frame_user.h
arch/um/include/sysdep-i386/frame_user.h
+16
-7
arch/um/include/sysdep-i386/ptrace.h
arch/um/include/sysdep-i386/ptrace.h
+72
-52
arch/um/include/sysdep-i386/sigcontext.h
arch/um/include/sysdep-i386/sigcontext.h
+0
-28
arch/um/include/sysdep-i386/syscalls.h
arch/um/include/sysdep-i386/syscalls.h
+3
-1
arch/um/include/time_user.h
arch/um/include/time_user.h
+2
-2
arch/um/include/umid.h
arch/um/include/umid.h
+5
-0
arch/um/include/uml_uaccess.h
arch/um/include/uml_uaccess.h
+28
-0
arch/um/include/user_util.h
arch/um/include/user_util.h
+2
-2
arch/um/kernel/Makefile
arch/um/kernel/Makefile
+3
-6
arch/um/kernel/frame.c
arch/um/kernel/frame.c
+18
-5
arch/um/kernel/frame_kern.c
arch/um/kernel/frame_kern.c
+33
-16
arch/um/kernel/irq.c
arch/um/kernel/irq.c
+1
-1
arch/um/kernel/irq_user.c
arch/um/kernel/irq_user.c
+15
-15
arch/um/kernel/ksyms.c
arch/um/kernel/ksyms.c
+5
-0
arch/um/kernel/mem.c
arch/um/kernel/mem.c
+43
-22
arch/um/kernel/process_kern.c
arch/um/kernel/process_kern.c
+4
-0
arch/um/kernel/sigio_user.c
arch/um/kernel/sigio_user.c
+22
-19
arch/um/kernel/signal_kern.c
arch/um/kernel/signal_kern.c
+14
-22
arch/um/kernel/skas/include/mode.h
arch/um/kernel/skas/include/mode.h
+4
-3
arch/um/kernel/skas/include/mode_kern.h
arch/um/kernel/skas/include/mode_kern.h
+1
-2
arch/um/kernel/skas/include/ptrace-skas.h
arch/um/kernel/skas/include/ptrace-skas.h
+1
-1
arch/um/kernel/skas/include/skas.h
arch/um/kernel/skas/include/skas.h
+5
-5
arch/um/kernel/skas/include/uaccess.h
arch/um/kernel/skas/include/uaccess.h
+0
-3
arch/um/kernel/skas/mem.c
arch/um/kernel/skas/mem.c
+0
-5
arch/um/kernel/skas/mem_user.c
arch/um/kernel/skas/mem_user.c
+3
-3
arch/um/kernel/skas/process.c
arch/um/kernel/skas/process.c
+25
-16
arch/um/kernel/skas/process_kern.c
arch/um/kernel/skas/process_kern.c
+12
-13
arch/um/kernel/skas/sys-i386/sigcontext.c
arch/um/kernel/skas/sys-i386/sigcontext.c
+42
-41
arch/um/kernel/skas/syscall_kern.c
arch/um/kernel/skas/syscall_kern.c
+1
-1
arch/um/kernel/skas/syscall_user.c
arch/um/kernel/skas/syscall_user.c
+2
-3
arch/um/kernel/skas/tlb.c
arch/um/kernel/skas/tlb.c
+2
-4
arch/um/kernel/skas/trap_user.c
arch/um/kernel/skas/trap_user.c
+13
-14
arch/um/kernel/tempfile.c
arch/um/kernel/tempfile.c
+11
-12
arch/um/kernel/time.c
arch/um/kernel/time.c
+8
-5
arch/um/kernel/time_kern.c
arch/um/kernel/time_kern.c
+11
-7
arch/um/kernel/trap_kern.c
arch/um/kernel/trap_kern.c
+6
-4
arch/um/kernel/trap_user.c
arch/um/kernel/trap_user.c
+23
-23
arch/um/kernel/tt/gdb.c
arch/um/kernel/tt/gdb.c
+9
-9
arch/um/kernel/tt/gdb_kern.c
arch/um/kernel/tt/gdb_kern.c
+3
-3
arch/um/kernel/tt/include/mode.h
arch/um/kernel/tt/include/mode.h
+4
-3
arch/um/kernel/tt/include/mode_kern.h
arch/um/kernel/tt/include/mode_kern.h
+0
-1
arch/um/kernel/tt/include/ptrace-tt.h
arch/um/kernel/tt/include/ptrace-tt.h
+1
-1
arch/um/kernel/tt/include/tt.h
arch/um/kernel/tt/include/tt.h
+2
-1
arch/um/kernel/tt/include/uaccess.h
arch/um/kernel/tt/include/uaccess.h
+1
-3
arch/um/kernel/tt/mem.c
arch/um/kernel/tt/mem.c
+0
-26
arch/um/kernel/tt/mem_user.c
arch/um/kernel/tt/mem_user.c
+1
-1
arch/um/kernel/tt/process_kern.c
arch/um/kernel/tt/process_kern.c
+11
-8
arch/um/kernel/tt/ptproxy/proxy.c
arch/um/kernel/tt/ptproxy/proxy.c
+8
-8
arch/um/kernel/tt/sys-i386/sigcontext.c
arch/um/kernel/tt/sys-i386/sigcontext.c
+3
-2
arch/um/kernel/tt/syscall_kern.c
arch/um/kernel/tt/syscall_kern.c
+10
-7
arch/um/kernel/tt/syscall_user.c
arch/um/kernel/tt/syscall_user.c
+5
-6
arch/um/kernel/tt/trap_user.c
arch/um/kernel/tt/trap_user.c
+8
-7
arch/um/kernel/tt/uaccess_user.c
arch/um/kernel/tt/uaccess_user.c
+1
-41
arch/um/kernel/uaccess_user.c
arch/um/kernel/uaccess_user.c
+64
-0
arch/um/kernel/um_arch.c
arch/um/kernel/um_arch.c
+12
-7
arch/um/kernel/umid.c
arch/um/kernel/umid.c
+10
-6
arch/um/kernel/user_syms.c
arch/um/kernel/user_syms.c
+3
-6
arch/um/os-Linux/drivers/ethertap_kern.c
arch/um/os-Linux/drivers/ethertap_kern.c
+17
-17
arch/um/os-Linux/drivers/ethertap_user.c
arch/um/os-Linux/drivers/ethertap_user.c
+8
-8
arch/um/os-Linux/drivers/tuntap_kern.c
arch/um/os-Linux/drivers/tuntap_kern.c
+18
-18
arch/um/os-Linux/drivers/tuntap_user.c
arch/um/os-Linux/drivers/tuntap_user.c
+8
-8
arch/um/os-Linux/file.c
arch/um/os-Linux/file.c
+15
-6
arch/um/os-Linux/process.c
arch/um/os-Linux/process.c
+1
-1
arch/um/sys-i386/Makefile
arch/um/sys-i386/Makefile
+2
-1
arch/um/sys-i386/bugs.c
arch/um/sys-i386/bugs.c
+1
-1
arch/um/sys-i386/sigcontext.c
arch/um/sys-i386/sigcontext.c
+1
-1
arch/um/util/mk_task_kern.c
arch/um/util/mk_task_kern.c
+1
-1
include/asm-um/archparam-i386.h
include/asm-um/archparam-i386.h
+1
-1
include/asm-um/pgtable.h
include/asm-um/pgtable.h
+3
-0
include/asm-um/processor-i386.h
include/asm-um/processor-i386.h
+2
-2
include/asm-um/ptrace-generic.h
include/asm-um/ptrace-generic.h
+3
-2
include/asm-um/ptrace-i386.h
include/asm-um/ptrace-i386.h
+2
-1
include/asm-um/ucontext.h
include/asm-um/ucontext.h
+6
-0
No files found.
arch/um/Makefile
View file @
366fdb90
...
...
@@ -164,7 +164,7 @@ $(ARCH_DIR)/os:
cd
$(ARCH_DIR)
&&
ln
-sf
os-
$(OS)
os
$(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/um/drivers/chan_kern.c
View file @
366fdb90
...
...
@@ -75,15 +75,15 @@ static void not_configged_free(void *data)
}
static
struct
chan_ops
not_configged_ops
=
{
init:
not_configged_init
,
open:
not_configged_open
,
close:
not_configged_close
,
read:
not_configged_read
,
write:
not_configged_write
,
console_write:
not_configged_console_write
,
window_size:
not_configged_window_size
,
free:
not_configged_free
,
winch:
0
,
.
init
=
not_configged_init
,
.
open
=
not_configged_open
,
.
close
=
not_configged_close
,
.
read
=
not_configged_read
,
.
write
=
not_configged_write
,
.
console_write
=
not_configged_console_write
,
.
window_size
=
not_configged_window_size
,
.
free
=
not_configged_free
,
.
winch
=
0
,
};
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,
chan
=
kmalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
);
if
(
chan
==
NULL
)
return
(
NULL
);
*
chan
=
((
struct
chan
)
{
list
:
LIST_HEAD_INIT
(
chan
->
list
),
primary
:
1
,
input
:
0
,
output
:
0
,
opened
:
0
,
fd
:
-
1
,
pri
:
pri
,
ops
:
ops
,
data
:
data
});
*
chan
=
((
struct
chan
)
{
.
list
=
LIST_HEAD_INIT
(
chan
->
list
),
.
primary
=
1
,
.
input
=
0
,
.
output
=
0
,
.
opened
=
0
,
.
fd
=
-
1
,
.
pri
=
pri
,
.
ops
=
ops
,
.
data
=
data
});
return
(
chan
);
}
...
...
arch/um/drivers/chan_user.c
View file @
366fdb90
...
...
@@ -159,9 +159,9 @@ static int winch_tramp(int fd, void *device_data, int *fd_out)
return
(
err
);
}
data
=
((
struct
winch_data
)
{
pty_fd
:
fd
,
pipe_fd
:
fds
[
1
],
close_me
:
fds
[
0
]
}
);
data
=
((
struct
winch_data
)
{
.
pty_fd
=
fd
,
.
pipe_fd
=
fds
[
1
],
.
close_me
=
fds
[
0
]
}
);
pid
=
run_helper_thread
(
winch_thread
,
&
data
,
0
,
&
stack
,
0
);
if
(
pid
<
0
){
printk
(
"fork of winch_thread failed - errno = %d
\n
"
,
errno
);
...
...
arch/um/drivers/daemon_kern.c
View file @
366fdb90
...
...
@@ -28,14 +28,14 @@ void daemon_init(struct net_device *dev, void *data)
pri
=
dev
->
priv
;
dpri
=
(
struct
daemon_data
*
)
pri
->
user
;
*
dpri
=
((
struct
daemon_data
)
{
sock_type
:
init
->
sock_type
,
ctl_sock
:
init
->
ctl_sock
,
ctl_addr
:
NULL
,
data_addr
:
NULL
,
local_addr
:
NULL
,
fd
:
-
1
,
control
:
-
1
,
dev
:
dev
});
{
.
sock_type
=
init
->
sock_type
,
.
ctl_sock
=
init
->
ctl_sock
,
.
ctl_addr
=
NULL
,
.
data_addr
=
NULL
,
.
local_addr
=
NULL
,
.
fd
=
-
1
,
.
control
=
-
1
,
.
dev
=
dev
});
printk
(
"daemon backend (uml_switch version %d) - %s:%s"
,
SWITCH_VERSION
,
dpri
->
sock_type
,
dpri
->
ctl_sock
);
...
...
@@ -59,10 +59,10 @@ static int daemon_write(int fd, struct sk_buff **skb,
}
static
struct
net_kern_info
daemon_kern_info
=
{
init:
daemon_init
,
protocol:
eth_protocol
,
read:
daemon_read
,
write:
daemon_write
,
.
init
=
daemon_init
,
.
protocol
=
eth_protocol
,
.
read
=
daemon_read
,
.
write
=
daemon_write
,
};
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
;
*
init
=
((
struct
daemon_init
)
{
sock_type
:
"unix"
,
ctl_sock
:
"/tmp/uml.ctl"
});
{
.
sock_type
=
"unix"
,
.
ctl_sock
=
"/tmp/uml.ctl"
});
remain
=
split_if_spec
(
str
,
mac_out
,
&
init
->
sock_type
,
&
init
->
ctl_sock
,
NULL
);
...
...
@@ -84,13 +84,13 @@ int daemon_setup(char *str, char **mac_out, void *data)
}
static
struct
transport
daemon_transport
=
{
list
:
LIST_HEAD_INIT
(
daemon_transport
.
list
),
name
:
"daemon"
,
setup
:
daemon_setup
,
user
:
&
daemon_user_info
,
kern
:
&
daemon_kern_info
,
private_size
:
sizeof
(
struct
daemon_data
),
setup_size
:
sizeof
(
struct
daemon_init
),
.
list
=
LIST_HEAD_INIT
(
daemon_transport
.
list
),
.
name
=
"daemon"
,
.
setup
=
daemon_setup
,
.
user
=
&
daemon_user_info
,
.
kern
=
&
daemon_kern_info
,
.
private_size
=
sizeof
(
struct
daemon_data
),
.
setup_size
=
sizeof
(
struct
daemon_init
),
};
static
int
register_daemon
(
void
)
...
...
arch/um/drivers/daemon_user.c
View file @
366fdb90
...
...
@@ -7,6 +7,7 @@
#include <errno.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/time.h>
...
...
@@ -24,8 +25,8 @@ enum request_type { REQ_NEW_CONTROL };
#define SWITCH_MAGIC 0xfeedface
struct
request_v3
{
u
nsigned
long
magic
;
in
t
version
;
u
int32_t
magic
;
uint32_
t
version
;
enum
request_type
type
;
struct
sockaddr_un
sock
;
};
...
...
@@ -172,14 +173,14 @@ static int daemon_set_mtu(int mtu, void *data)
}
struct
net_user_info
daemon_user_info
=
{
init:
daemon_user_init
,
open:
daemon_open
,
close:
NULL
,
remove:
daemon_remove
,
set_mtu:
daemon_set_mtu
,
add_address:
NULL
,
delete_address:
NULL
,
max_packet:
MAX_PACKET
-
ETH_HEADER_OTHER
.
init
=
daemon_user_init
,
.
open
=
daemon_open
,
.
close
=
NULL
,
.
remove
=
daemon_remove
,
.
set_mtu
=
daemon_set_mtu
,
.
add_address
=
NULL
,
.
delete_address
=
NULL
,
.
max_packet
=
MAX_PACKET
-
ETH_HEADER_OTHER
};
/*
...
...
arch/um/drivers/fd.c
View file @
366fdb90
...
...
@@ -36,8 +36,8 @@ void *fd_init(char *str, int device, struct chan_opts *opts)
return
(
NULL
);
}
if
((
data
=
um_kmalloc
(
sizeof
(
*
data
)))
==
NULL
)
return
(
NULL
);
*
data
=
((
struct
fd_chan
)
{
fd
:
n
,
raw
:
opts
->
raw
});
*
data
=
((
struct
fd_chan
)
{
.
fd
=
n
,
.
raw
=
opts
->
raw
});
return
(
data
);
}
...
...
@@ -72,16 +72,16 @@ int fd_console_write(int fd, const char *buf, int n, void *d)
}
struct
chan_ops
fd_ops
=
{
type:
"fd"
,
init:
fd_init
,
open:
fd_open
,
close:
fd_close
,
read:
generic_read
,
write:
generic_write
,
console_write:
fd_console_write
,
window_size:
generic_window_size
,
free:
generic_free
,
winch:
1
,
.
type
=
"fd"
,
.
init
=
fd_init
,
.
open
=
fd_open
,
.
close
=
fd_close
,
.
read
=
generic_read
,
.
write
=
generic_write
,
.
console_write
=
fd_console_write
,
.
window_size
=
generic_window_size
,
.
free
=
generic_free
,
.
winch
=
1
,
};
/*
...
...
arch/um/drivers/harddog_kern.c
View file @
366fdb90
...
...
@@ -145,17 +145,17 @@ static int harddog_ioctl(struct inode *inode, struct file *file,
}
static
struct
file_operations
harddog_fops
=
{
owner:
THIS_MODULE
,
write:
harddog_write
,
ioctl:
harddog_ioctl
,
open:
harddog_open
,
release:
harddog_release
,
.
owner
=
THIS_MODULE
,
.
write
=
harddog_write
,
.
ioctl
=
harddog_ioctl
,
.
open
=
harddog_open
,
.
release
=
harddog_release
,
};
static
struct
miscdevice
harddog_miscdev
=
{
minor:
WATCHDOG_MINOR
,
name:
"watchdog"
,
fops:
&
harddog_fops
,
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
harddog_fops
,
};
static
char
banner
[]
__initdata
=
KERN_INFO
"UML Watchdog Timer
\n
"
;
...
...
arch/um/drivers/hostaudio_kern.c
View file @
366fdb90
...
...
@@ -195,23 +195,23 @@ static int hostmixer_release(struct inode *inode, struct file *file)
/* kernel module operations */
static
struct
file_operations
hostaudio_fops
=
{
owner:
THIS_MODULE
,
llseek:
no_llseek
,
read:
hostaudio_read
,
write:
hostaudio_write
,
poll:
hostaudio_poll
,
ioctl:
hostaudio_ioctl
,
mmap:
NULL
,
open:
hostaudio_open
,
release:
hostaudio_release
,
.
owner
=
THIS_MODULE
,
.
llseek
=
no_llseek
,
.
read
=
hostaudio_read
,
.
write
=
hostaudio_write
,
.
poll
=
hostaudio_poll
,
.
ioctl
=
hostaudio_ioctl
,
.
mmap
=
NULL
,
.
open
=
hostaudio_open
,
.
release
=
hostaudio_release
,
};
static
struct
file_operations
hostmixer_fops
=
{
owner:
THIS_MODULE
,
llseek:
no_llseek
,
ioctl:
hostmixer_ioctl_mixdev
,
open:
hostmixer_open_mixdev
,
release:
hostmixer_release
,
.
owner
=
THIS_MODULE
,
.
llseek
=
no_llseek
,
.
ioctl
=
hostmixer_ioctl_mixdev
,
.
open
=
hostmixer_open_mixdev
,
.
release
=
hostmixer_release
,
};
struct
{
...
...
arch/um/drivers/line.c
View file @
366fdb90
...
...
@@ -35,7 +35,7 @@ void line_timer_cb(void *arg)
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
;
...
...
@@ -519,11 +519,11 @@ void register_winch_irq(int fd, int tty_fd, int pid, void *line)
printk
(
"register_winch_irq - kmalloc failed
\n
"
);
goto
out
;
}
*
winch
=
((
struct
winch
)
{
list
:
LIST_HEAD_INIT
(
winch
->
list
),
fd
:
fd
,
tty_fd
:
tty_fd
,
pid
:
pid
,
line
:
line
});
*
winch
=
((
struct
winch
)
{
.
list
=
LIST_HEAD_INIT
(
winch
->
list
),
.
fd
=
fd
,
.
tty_fd
=
tty_fd
,
.
pid
=
pid
,
.
line
=
line
});
list_add
(
&
winch
->
list
,
&
winch_handlers
);
if
(
um_request_irq
(
WINCH_IRQ
,
fd
,
IRQ_READ
,
winch_interrupt
,
SA_INTERRUPT
|
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
...
...
@@ -541,7 +541,8 @@ static void winch_cleanup(void)
list_for_each
(
ele
,
&
winch_handlers
){
winch
=
list_entry
(
ele
,
struct
winch
,
list
);
close
(
winch
->
fd
);
if
(
winch
->
pid
!=
-
1
)
os_kill_process
(
winch
->
pid
,
0
);
if
(
winch
->
pid
!=
-
1
)
os_kill_process
(
winch
->
pid
,
1
);
}
}
...
...
arch/um/drivers/mcast_kern.c
View file @
366fdb90
...
...
@@ -36,11 +36,11 @@ void mcast_init(struct net_device *dev, void *data)
pri
=
dev
->
priv
;
dpri
=
(
struct
mcast_data
*
)
pri
->
user
;
*
dpri
=
((
struct
mcast_data
)
{
addr
:
init
->
addr
,
port
:
init
->
port
,
ttl
:
init
->
ttl
,
mcast_addr
:
NULL
,
dev
:
dev
});
{
.
addr
=
init
->
addr
,
.
port
=
init
->
port
,
.
ttl
=
init
->
ttl
,
.
mcast_addr
=
NULL
,
.
dev
=
dev
});
printk
(
"mcast backend "
);
printk
(
"multicast adddress: %s:%u, TTL:%u "
,
dpri
->
addr
,
dpri
->
port
,
dpri
->
ttl
);
...
...
@@ -64,10 +64,10 @@ static int mcast_write(int fd, struct sk_buff **skb,
}
static
struct
net_kern_info
mcast_kern_info
=
{
init:
mcast_init
,
protocol:
eth_protocol
,
read:
mcast_read
,
write:
mcast_write
,
.
init
=
mcast_init
,
.
protocol
=
eth_protocol
,
.
read
=
mcast_read
,
.
write
=
mcast_write
,
};
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
;
*
init
=
((
struct
mcast_init
)
{
addr
:
"239.192.168.1"
,
port
:
1102
,
ttl
:
1
});
{
.
addr
=
"239.192.168.1"
,
.
port
=
1102
,
.
ttl
=
1
});
remain
=
split_if_spec
(
str
,
mac_out
,
&
init
->
addr
,
&
port_str
,
&
ttl_str
,
NULL
);
...
...
@@ -116,13 +116,13 @@ int mcast_setup(char *str, char **mac_out, void *data)
}
static
struct
transport
mcast_transport
=
{
list
:
LIST_HEAD_INIT
(
mcast_transport
.
list
),
name
:
"mcast"
,
setup
:
mcast_setup
,
user
:
&
mcast_user_info
,
kern
:
&
mcast_kern_info
,
private_size
:
sizeof
(
struct
mcast_data
),
setup_size
:
sizeof
(
struct
mcast_init
),
.
list
=
LIST_HEAD_INIT
(
mcast_transport
.
list
),
.
name
=
"mcast"
,
.
setup
=
mcast_setup
,
.
user
=
&
mcast_user_info
,
.
kern
=
&
mcast_kern_info
,
.
private_size
=
sizeof
(
struct
mcast_data
),
.
setup_size
=
sizeof
(
struct
mcast_init
),
};
static
int
register_mcast
(
void
)
...
...
arch/um/drivers/mcast_user.c
View file @
366fdb90
...
...
@@ -153,14 +153,14 @@ static int mcast_set_mtu(int mtu, void *data)
}
struct
net_user_info
mcast_user_info
=
{
init:
mcast_user_init
,
open:
mcast_open
,
close:
mcast_close
,
remove:
NULL
,
set_mtu:
mcast_set_mtu
,
add_address:
NULL
,
delete_address:
NULL
,
max_packet:
MAX_PACKET
-
ETH_HEADER_OTHER
.
init
=
mcast_user_init
,
.
open
=
mcast_open
,
.
close
=
mcast_close
,
.
remove
=
NULL
,
.
set_mtu
=
mcast_set_mtu
,
.
add_address
=
NULL
,
.
delete_address
=
NULL
,
.
max_packet
=
MAX_PACKET
-
ETH_HEADER_OTHER
};
/*
...
...
arch/um/drivers/mconsole_kern.c
View file @
366fdb90
...
...
@@ -36,8 +36,8 @@ static int do_unlink_socket(struct notifier_block *notifier,
static
struct
notifier_block
reboot_notifier
=
{
notifier_call:
do_unlink_socket
,
priority:
0
,
.
notifier_call
=
do_unlink_socket
,
.
priority
=
0
,
};
/* 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,
}
static struct notifier_block panic_exit_notifier = {
notifier_call :
notify_panic,
next :
NULL,
priority :
1
.notifier_call =
notify_panic,
.next =
NULL,
.priority =
1
};
static int add_notifier(void)
...
...
arch/um/drivers/mmapper_kern.c
View file @
366fdb90
...
...
@@ -106,13 +106,13 @@ mmapper_release(struct inode *inode, struct file *file)
}
static
struct
file_operations
mmapper_fops
=
{
owner:
THIS_MODULE
,
read:
mmapper_read
,
write:
mmapper_write
,
ioctl:
mmapper_ioctl
,
mmap:
mmapper_mmap
,
open:
mmapper_open
,
release:
mmapper_release
,
.
owner
=
THIS_MODULE
,
.
read
=
mmapper_read
,
.
write
=
mmapper_write
,
.
ioctl
=
mmapper_ioctl
,
.
mmap
=
mmapper_mmap
,
.
open
=
mmapper_open
,
.
release
=
mmapper_release
,
};
static
int
__init
mmapper_init
(
void
)
...
...
arch/um/drivers/net_kern.c
View file @
366fdb90
...
...
@@ -368,22 +368,22 @@ static int eth_configure(int n, void *init, char *mac,
*/
save
=
lp
->
user
[
0
];
*
lp
=
((
struct
uml_net_private
)
{
list
:
LIST_HEAD_INIT
(
lp
->
list
),
lock
:
SPIN_LOCK_UNLOCKED
,
dev
:
dev
,
fd
:
-
1
,
mac
:
{
0xfe
,
0xfd
,
0x0
,
0x0
,
0x0
,
0x0
},
have_mac
:
device
->
have_mac
,
protocol
:
transport
->
kern
->
protocol
,
open
:
transport
->
user
->
open
,
close
:
transport
->
user
->
close
,
remove
:
transport
->
user
->
remove
,
read
:
transport
->
kern
->
read
,
write
:
transport
->
kern
->
write
,
add_address
:
transport
->
user
->
add_address
,
delete_address
:
transport
->
user
->
delete_address
,
set_mtu
:
transport
->
user
->
set_mtu
,
user
:
{
save
}
});
{
.
list
=
LIST_HEAD_INIT
(
lp
->
list
),
.
lock
=
SPIN_LOCK_UNLOCKED
,
.
dev
=
dev
,
.
fd
=
-
1
,
.
mac
=
{
0xfe
,
0xfd
,
0x0
,
0x0
,
0x0
,
0x0
},
.
have_mac
=
device
->
have_mac
,
.
protocol
=
transport
->
kern
->
protocol
,
.
open
=
transport
->
user
->
open
,
.
close
=
transport
->
user
->
close
,
.
remove
=
transport
->
user
->
remove
,
.
read
=
transport
->
kern
->
read
,
.
write
=
transport
->
kern
->
write
,
.
add_address
=
transport
->
user
->
add_address
,
.
delete_address
=
transport
->
user
->
delete_address
,
.
set_mtu
=
transport
->
user
->
set_mtu
,
.
user
=
{
save
}
});
init_timer
(
&
lp
->
tl
);
lp
->
tl
.
function
=
uml_net_user_timer_expire
;
memset
(
&
lp
->
stats
,
0
,
sizeof
(
lp
->
stats
));
...
...
@@ -542,9 +542,9 @@ static int eth_setup(char *str)
printk
(
"eth_init : alloc_bootmem failed
\n
"
);
return
(
1
);
}
*
new
=
((
struct
eth_init
)
{
list
:
LIST_HEAD_INIT
(
new
->
list
),
index
:
n
,
init
:
str
});
*
new
=
((
struct
eth_init
)
{
.
list
=
LIST_HEAD_INIT
(
new
->
list
),
.
index
=
n
,
.
init
=
str
});
list_add_tail
(
&
new
->
list
,
&
eth_cmd_line
);
return
(
1
);
}
...
...
@@ -618,9 +618,10 @@ static int net_remove(char *str)
}
static
struct
mc_device
net_mc
=
{
name:
"eth"
,
config:
net_config
,
remove:
net_remove
,
.
name
=
"eth"
,
.
config
=
net_config
,
.
get_config
=
NULL
,
.
remove
=
net_remove
,
};
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
=
{
notifier_call:
uml_inetaddr_event
,
.
notifier_call
=
uml_inetaddr_event
,
};
static
int
uml_net_init
(
void
)
...
...
arch/um/drivers/null.c
View file @
366fdb90
...
...
@@ -32,16 +32,16 @@ void null_free(void *data)
}
struct
chan_ops
null_ops
=
{
type:
"null"
,
init:
null_init
,
open:
null_open
,
close:
generic_close
,
read:
null_read
,
write:
generic_write
,
console_write:
generic_console_write
,
window_size:
generic_window_size
,
free:
null_free
,
winch:
0
,
.
type
=
"null"
,
.
init
=
null_init
,
.
open
=
null_open
,
.
close
=
generic_close
,
.
read
=
null_read
,
.
write
=
generic_write
,
.
console_write
=
generic_console_write
,
.
window_size
=
generic_window_size
,
.
free
=
null_free
,
.
winch
=
0
,
};
/*
...
...
arch/um/drivers/pcap_kern.c
View file @
366fdb90
...
...
@@ -27,12 +27,12 @@ void pcap_init(struct net_device *dev, void *data)
pri
=
dev
->
priv
;
ppri
=
(
struct
pcap_data
*
)
pri
->
user
;
*
ppri
=
((
struct
pcap_data
)
{
host_if
:
init
->
host_if
,
promisc
:
init
->
promisc
,
optimize
:
init
->
optimize
,
filter
:
init
->
filter
,
compiled
:
NULL
,
pcap
:
NULL
});
{
.
host_if
=
init
->
host_if
,
.
promisc
=
init
->
promisc
,
.
optimize
=
init
->
optimize
,
.
filter
=
init
->
filter
,
.
compiled
=
NULL
,
.
pcap
=
NULL
});
}
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)
}
static
struct
net_kern_info
pcap_kern_info
=
{
init:
pcap_init
,
protocol:
eth_protocol
,
read:
pcap_read
,
write:
pcap_write
,
.
init
=
pcap_init
,
.
protocol
=
eth_protocol
,
.
read
=
pcap_read
,
.
write
=
pcap_write
,
};
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
;
*
init
=
((
struct
pcap_init
)
{
host_if
:
"eth0"
,
promisc
:
1
,
optimize
:
0
,
filter
:
NULL
});
{
.
host_if
=
"eth0"
,
.
promisc
=
1
,
.
optimize
=
0
,
.
filter
=
NULL
});
remain
=
split_if_spec
(
str
,
&
host_if
,
&
init
->
filter
,
&
options
[
0
],
&
options
[
1
],
NULL
);
...
...
@@ -98,13 +98,13 @@ int pcap_setup(char *str, char **mac_out, void *data)
}
static
struct
transport
pcap_transport
=
{
list
:
LIST_HEAD_INIT
(
pcap_transport
.
list
),
name
:
"pcap"
,
setup
:
pcap_setup
,
user
:
&
pcap_user_info
,
kern
:
&
pcap_kern_info
,
private_size
:
sizeof
(
struct
pcap_data
),
setup_size
:
sizeof
(
struct
pcap_init
),
.
list
=
LIST_HEAD_INIT
(
pcap_transport
.
list
),
.
name
=
"pcap"
,
.
setup
=
pcap_setup
,
.
user
=
&
pcap_user_info
,
.
kern
=
&
pcap_kern_info
,
.
private_size
=
sizeof
(
struct
pcap_data
),
.
setup_size
=
sizeof
(
struct
pcap_init
),
};
static
int
register_pcap
(
void
)
...
...
arch/um/drivers/pcap_user.c
View file @
366fdb90
...
...
@@ -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
)
{
struct
pcap_handler_data
hdata
=
((
struct
pcap_handler_data
)
{
buffer
:
buffer
,
len
:
len
});
{
.
buffer
=
buffer
,
.
len
=
len
});
int
n
;
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)
}
struct
net_user_info
pcap_user_info
=
{
init:
pcap_user_init
,
open:
pcap_open
,
close:
NULL
,
remove:
pcap_remove
,
set_mtu:
NULL
,
add_address:
NULL
,
delete_address:
NULL
,
max_packet:
MAX_PACKET
-
ETH_HEADER_OTHER
.
init
=
pcap_user_init
,
.
open
=
pcap_open
,
.
close
=
NULL
,
.
remove
=
pcap_remove
,
.
set_mtu
=
NULL
,
.
add_address
=
NULL
,
.
delete_address
=
NULL
,
.
max_packet
=
MAX_PACKET
-
ETH_HEADER_OTHER
};
/*
...
...
arch/um/drivers/port_kern.c
View file @
366fdb90
...
...
@@ -31,7 +31,6 @@ struct port_list {
struct
port_dev
{
struct
port_list
*
port
;
int
fd
;
int
helper_pid
;
int
telnetd_pid
;
};
...
...
@@ -55,7 +54,8 @@ static void pipe_interrupt(int irq, void *data, struct pt_regs *regs)
if
(
fd
==
-
EAGAIN
)
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
);
}
...
...
@@ -75,26 +75,29 @@ static int port_accept(struct port_list *port)
fd
=
port_connection
(
port
->
fd
,
socket
,
&
pid
);
if
(
fd
<
0
){
if
(
fd
!=
-
EAGAIN
)
printk
(
"port_connection returned %d
\n
"
,
-
fd
);
printk
(
KERN_ERR
"port_accept : port_connection "
"returned %d
\n
"
,
-
fd
);
goto
out
;
}
conn
=
kmalloc
(
sizeof
(
*
conn
),
GFP_ATOMIC
);
if
(
conn
==
NULL
){
printk
(
"port_interrupt : failed to allocate connection
\n
"
);
printk
(
KERN_ERR
"port_accept : failed to allocate "
"connection
\n
"
);
goto
out_close
;
}
*
conn
=
((
struct
connection
)
{
list
:
LIST_HEAD_INIT
(
conn
->
list
),
fd
:
fd
,
socket
:
{
socket
[
0
],
socket
[
1
]
},
telnetd_pid
:
pid
,
port
:
port
});
{
.
list
=
LIST_HEAD_INIT
(
conn
->
list
),
.
fd
=
fd
,
.
socket
=
{
socket
[
0
],
socket
[
1
]
},
.
telnetd_pid
=
pid
,
.
port
=
port
});
if
(
um_request_irq
(
TELNETD_IRQ
,
socket
[
0
],
IRQ_READ
,
pipe_interrupt
,
SA_INTERRUPT
|
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
"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
;
}
...
...
@@ -106,7 +109,8 @@ static int port_accept(struct port_list *port)
kfree
(
conn
);
out_close:
os_close_file
(
fd
);
if
(
pid
!=
-
1
)
os_kill_process
(
pid
,
0
);
if
(
pid
!=
-
1
)
os_kill_process
(
pid
,
1
);
out:
return
(
ret
);
}
...
...
@@ -174,14 +178,15 @@ void *port_data(int port_num)
}
*
port
=
((
struct
port_list
)
{
list
:
LIST_HEAD_INIT
(
port
->
list
),
has_connection
:
0
,
sem
:
__SEMAPHORE_INITIALIZER
(
port
->
sem
,
0
),
lock
:
SPIN_LOCK_UNLOCKED
,
port
:
port_num
,
fd
:
fd
,
pending
:
LIST_HEAD_INIT
(
port
->
pending
),
connections
:
LIST_HEAD_INIT
(
port
->
connections
)
});
{
.
list
=
LIST_HEAD_INIT
(
port
->
list
),
.
has_connection
=
0
,
.
sem
=
__SEMAPHORE_INITIALIZER
(
port
->
sem
,
0
),
.
lock
=
SPIN_LOCK_UNLOCKED
,
.
port
=
port_num
,
.
fd
=
fd
,
.
pending
=
LIST_HEAD_INIT
(
port
->
pending
),
.
connections
=
LIST_HEAD_INIT
(
port
->
connections
)
});
list_add
(
&
port
->
list
,
&
ports
);
found:
...
...
@@ -191,9 +196,9 @@ void *port_data(int port_num)
goto
out
;
}
*
dev
=
((
struct
port_dev
)
{
port
:
port
,
fd
:
-
1
,
helper_pid
:
-
1
});
*
dev
=
((
struct
port_dev
)
{
.
port
=
port
,
.
helper_pid
=
-
1
,
.
telnetd_pid
=
-
1
});
goto
out
;
out_free:
...
...
@@ -205,38 +210,16 @@ void *port_data(int port_num)
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
)
{
struct
port_dev
*
dev
=
data
;
struct
connection
*
conn
;
struct
port_list
*
port
=
dev
->
port
;
int
fd
;
while
(
1
){
if
(
down_interruptible
(
&
port
->
sem
))
return
(
-
ERESTARTSYS
);
if
(
down_interruptible
(
&
port
->
sem
))
return
(
-
ERESTARTSYS
);
spin_lock
(
&
port
->
lock
);
...
...
@@ -263,21 +246,48 @@ int port_wait(void *data)
kfree
(
conn
);
}
dev
->
fd
=
conn
->
fd
;
fd
=
conn
->
fd
;
dev
->
helper_pid
=
conn
->
helper_pid
;
dev
->
telnetd_pid
=
conn
->
telnetd_pid
;
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
)
{
struct
port_dev
*
dev
=
d
;
port_remove_dev
(
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.
* Emacs will notice this stuff at the end of the file and automatically
...
...
arch/um/drivers/port_user.c
View file @
366fdb90
...
...
@@ -47,14 +47,28 @@ void *port_init(char *str, int device, struct chan_opts *opts)
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
,
kernel_data
:
kern_data
});
*
data
=
((
struct
port_chan
)
{
.
raw
=
opts
->
raw
,
.
kernel_data
=
kern_data
});
sprintf
(
data
->
dev
,
"%d"
,
port
);
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
)
...
...
@@ -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
));
}
void
port_free
(
void
*
d
)
{
struct
port_chan
*
data
=
d
;
port_kern_free
(
data
->
kernel_data
);
kfree
(
data
);
}
struct
chan_ops
port_ops
=
{
type:
"port"
,
init:
port_init
,
open:
port_open
,
close:
port_close
,
read:
generic_read
,
write:
generic_write
,
console_write:
port_console_write
,
window_size:
generic_window_size
,
free:
port_free
,
winch:
1
,
.
type
=
"port"
,
.
init
=
port_init
,
.
open
=
port_open
,
.
close
=
port_close
,
.
read
=
generic_read
,
.
write
=
generic_write
,
.
console_write
=
port_console_write
,
.
window_size
=
generic_window_size
,
.
free
=
port_free
,
.
winch
=
1
,
};
int
port_listen_fd
(
int
port
)
...
...
@@ -113,7 +119,8 @@ int port_listen_fd(int port)
int
fd
,
err
;
fd
=
socket
(
PF_INET
,
SOCK_STREAM
,
0
);
if
(
fd
==
-
1
)
return
(
-
errno
);
if
(
fd
==
-
1
)
return
(
-
errno
);
addr
.
sin_family
=
AF_INET
;
addr
.
sin_port
=
htons
(
port
);
...
...
@@ -163,14 +170,16 @@ int port_connection(int fd, int *socket, int *pid_out)
return
(
-
errno
);
err
=
os_pipe
(
socket
,
0
,
0
);
if
(
err
)
goto
out_close
;
if
(
err
)
goto
out_close
;
data
=
((
struct
port_pre_exec_data
)
{
sock_fd
:
new
,
pipe_fd
:
socket
[
1
]
});
{
.
sock_fd
=
new
,
.
pipe_fd
=
socket
[
1
]
});
err
=
run_helper
(
port_pre_exec
,
&
data
,
argv
,
NULL
);
if
(
err
<
0
)
goto
out_shutdown
;
if
(
err
<
0
)
goto
out_shutdown
;
*
pid_out
=
err
;
return
(
new
);
...
...
arch/um/drivers/pty.c
View file @
366fdb90
/*
* Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
* Copyright (C) 2001
, 2002
Jeff Dike (jdike@karaya.com)
* Licensed under the GPL
*/
...
...
@@ -27,9 +27,9 @@ void *pty_chan_init(char *str, int device, struct chan_opts *opts)
struct
pty_chan
*
data
;
if
((
data
=
um_kmalloc
(
sizeof
(
*
data
)))
==
NULL
)
return
(
NULL
);
*
data
=
((
struct
pty_chan
)
{
announce
:
opts
->
announce
,
dev
:
device
,
raw
:
opts
->
raw
});
*
data
=
((
struct
pty_chan
)
{
.
announce
=
opts
->
announce
,
.
dev
=
device
,
.
raw
=
opts
->
raw
});
return
(
data
);
}
...
...
@@ -86,34 +86,15 @@ int getmaster(char *line)
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
)
{
struct
pty_chan
*
data
=
d
;
int
fd
;
char
dev
[
sizeof
(
"/dev/ptyxx
\0
"
)]
=
"/dev/ptyxx"
;
struct
grantpt_info
info
;
fd
=
getmaster
(
dev
);
if
(
fd
<
0
)
return
(
-
errno
);
info
.
fd
=
fd
;
initial_thread_cb
(
grantpt_cb
,
&
info
);
unlockpt
(
fd
);
if
(
data
->
raw
)
raw
(
fd
,
0
);
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)
}
struct
chan_ops
pty_ops
=
{
type:
"pty"
,
init:
pty_chan_init
,
open:
pty_open
,
close:
generic_close
,
read:
generic_read
,
write:
generic_write
,
console_write:
pty_console_write
,
window_size:
generic_window_size
,
free:
generic_free
,
winch:
0
,
.
type
=
"pty"
,
.
init
=
pty_chan_init
,
.
open
=
pty_open
,
.
close
=
generic_close
,
.
read
=
generic_read
,
.
write
=
generic_write
,
.
console_write
=
pty_console_write
,
.
window_size
=
generic_window_size
,
.
free
=
generic_free
,
.
winch
=
0
,
};
struct
chan_ops
pts_ops
=
{
type:
"pts"
,
init:
pty_chan_init
,
open:
pts_open
,
close:
generic_close
,
read:
generic_read
,
write:
generic_write
,
console_write:
pty_console_write
,
window_size:
generic_window_size
,
free:
generic_free
,
winch:
0
,
.
type
=
"pts"
,
.
init
=
pty_chan_init
,
.
open
=
pts_open
,
.
close
=
generic_close
,
.
read
=
generic_read
,
.
write
=
generic_write
,
.
console_write
=
pty_console_write
,
.
window_size
=
generic_window_size
,
.
free
=
generic_free
,
.
winch
=
0
,
};
/*
...
...
arch/um/drivers/slip_kern.c
View file @
366fdb90
...
...
@@ -22,15 +22,15 @@ void slip_init(struct net_device *dev, void *data)
private
=
dev
->
priv
;
spri
=
(
struct
slip_data
*
)
private
->
user
;
*
spri
=
((
struct
slip_data
)
{
name
:
{
'\0'
},
addr:
NULL
,
gate_addr
:
init
->
gate_addr
,
slave
:
-
1
,
ibuf
:
{
'\0'
},
obuf
:
{
'\0'
},
pos
:
0
,
esc
:
0
,
dev
:
dev
});
{
.
name
=
{
'\0'
},
.
addr
=
NULL
,
.
gate_addr
=
init
->
gate_addr
,
.
slave
=
-
1
,
.
ibuf
=
{
'\0'
},
.
obuf
=
{
'\0'
},
.
pos
=
0
,
.
esc
=
0
,
.
dev
=
dev
});
dev
->
init
=
NULL
;
dev
->
hard_header_len
=
0
;
...
...
@@ -61,10 +61,10 @@ static int slip_write(int fd, struct sk_buff **skb,
}
struct
net_kern_info
slip_kern_info
=
{
init:
slip_init
,
protocol:
slip_protocol
,
read:
slip_read
,
write:
slip_write
,
.
init
=
slip_init
,
.
protocol
=
slip_protocol
,
.
read
=
slip_read
,
.
write
=
slip_write
,
};
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
;
*
init
=
((
struct
slip_init
)
{
gate_addr
:
NULL
});
{
.
gate_addr
=
NULL
});
if
(
str
[
0
]
!=
'\0'
)
init
->
gate_addr
=
str
;
...
...
@@ -80,13 +80,13 @@ static int slip_setup(char *str, char **mac_out, void *data)
}
static
struct
transport
slip_transport
=
{
list
:
LIST_HEAD_INIT
(
slip_transport
.
list
),
name
:
"slip"
,
setup
:
slip_setup
,
user
:
&
slip_user_info
,
kern
:
&
slip_kern_info
,
private_size
:
sizeof
(
struct
slip_data
),
setup_size
:
sizeof
(
struct
slip_init
),
.
list
=
LIST_HEAD_INIT
(
slip_transport
.
list
),
.
name
=
"slip"
,
.
setup
=
slip_setup
,
.
user
=
&
slip_user_info
,
.
kern
=
&
slip_kern_info
,
.
private_size
=
sizeof
(
struct
slip_data
),
.
setup_size
=
sizeof
(
struct
slip_init
),
};
static
int
register_slip
(
void
)
...
...
arch/um/drivers/slip_user.c
View file @
366fdb90
...
...
@@ -257,14 +257,14 @@ static void slip_del_addr(unsigned char *addr, unsigned char *netmask,
}
struct
net_user_info
slip_user_info
=
{
init:
slip_user_init
,
open:
slip_open
,
close:
slip_close
,
remove:
NULL
,
set_mtu:
slip_set_mtu
,
add_address:
slip_add_addr
,
delete_address:
slip_del_addr
,
max_packet:
BUF_SIZE
.
init
=
slip_user_init
,
.
open
=
slip_open
,
.
close
=
slip_close
,
.
remove
=
NULL
,
.
set_mtu
=
slip_set_mtu
,
.
add_address
=
slip_add_addr
,
.
delete_address
=
slip_del_addr
,
.
max_packet
=
BUF_SIZE
};
/*
...
...
arch/um/drivers/slirp_kern.c
View file @
366fdb90
...
...
@@ -22,14 +22,14 @@ void slirp_init(struct net_device *dev, void *data)
private
=
dev
->
priv
;
spri
=
(
struct
slirp_data
*
)
private
->
user
;
*
spri
=
((
struct
slirp_data
)
{
argw
:
init
->
argw
,
pid
:
-
1
,
slave
:
-
1
,
ibuf
:
{
'\0'
},
obuf
:
{
'\0'
},
pos
:
0
,
esc
:
0
,
dev
:
dev
});
{
.
argw
=
init
->
argw
,
.
pid
=
-
1
,
.
slave
=
-
1
,
.
ibuf
=
{
'\0'
},
.
obuf
=
{
'\0'
},
.
pos
=
0
,
.
esc
=
0
,
.
dev
=
dev
});
dev
->
init
=
NULL
;
dev
->
hard_header_len
=
0
;
...
...
@@ -64,10 +64,10 @@ static int slirp_write(int fd, struct sk_buff **skb,
}
struct
net_kern_info
slirp_kern_info
=
{
init:
slirp_init
,
protocol:
slirp_protocol
,
read:
slirp_read
,
write:
slirp_write
,
.
init
=
slirp_init
,
.
protocol
=
slirp_protocol
,
.
read
=
slirp_read
,
.
write
=
slirp_write
,
};
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
=
{
list
:
LIST_HEAD_INIT
(
slirp_transport
.
list
),
name
:
"slirp"
,
setup
:
slirp_setup
,
user
:
&
slirp_user_info
,
kern
:
&
slirp_kern_info
,
private_size
:
sizeof
(
struct
slirp_data
),
setup_size
:
sizeof
(
struct
slirp_init
),
.
list
=
LIST_HEAD_INIT
(
slirp_transport
.
list
),
.
name
=
"slirp"
,
.
setup
=
slirp_setup
,
.
user
=
&
slirp_user_info
,
.
kern
=
&
slirp_kern_info
,
.
private_size
=
sizeof
(
struct
slirp_data
),
.
setup_size
=
sizeof
(
struct
slirp_init
),
};
static
int
register_slirp
(
void
)
...
...
arch/um/drivers/slirp_user.c
View file @
366fdb90
...
...
@@ -180,14 +180,14 @@ static int slirp_set_mtu(int mtu, void *data)
}
struct
net_user_info
slirp_user_info
=
{
init:
slirp_user_init
,
open:
slirp_open
,
close:
slirp_close
,
remove:
NULL
,
set_mtu:
slirp_set_mtu
,
add_address:
NULL
,
delete_address:
NULL
,
max_packet:
BUF_SIZE
.
init
=
slirp_user_init
,
.
open
=
slirp_open
,
.
close
=
slirp_close
,
.
remove
=
NULL
,
.
set_mtu
=
slirp_set_mtu
,
.
add_address
=
NULL
,
.
delete_address
=
NULL
,
.
max_packet
=
BUF_SIZE
};
/*
...
...
arch/um/drivers/ssl.c
View file @
366fdb90
...
...
@@ -41,11 +41,11 @@ void ssl_announce(char *dev_name, int dev)
}
static
struct
chan_opts
opts
=
{
announce:
ssl_announce
,
xterm_title:
"Serial Line #%d"
,
raw:
1
,
tramp_stack
:
0
,
in_kernel
:
1
,
.
announce
=
ssl_announce
,
.
xterm_title
=
"Serial Line #%d"
,
.
raw
=
1
,
.
tramp_stack
=
0
,
.
in_kernel
=
1
,
};
static
int
ssl_config
(
char
*
str
);
...
...
@@ -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
struct
line_driver
driver
=
{
name
:
"UML serial line"
,
devfs_name
:
"tts/%d"
,
major
:
TTYAUX_MAJOR
,
minor_start
:
64
,
type
:
TTY_DRIVER_TYPE_SERIAL
,
subtype
:
0
,
read_irq
:
SSL_IRQ
,
read_irq_name
:
"ssl"
,
write_irq
:
SSL_WRITE_IRQ
,
write_irq_name
:
"ssl-write"
,
symlink_from
:
"serial"
,
symlink_to
:
"tts"
,
mc
:
{
name
:
"ssl"
,
config
:
ssl_config
,
get_config
:
ssl_get_config
,
remove
:
ssl_remove
,
.
name
=
"UML serial line"
,
.
devfs_name
=
"tts/%d"
,
.
major
=
TTYAUX_MAJOR
,
.
minor_start
=
64
,
.
type
=
TTY_DRIVER_TYPE_SERIAL
,
.
subtype
=
0
,
.
read_irq
=
SSL_IRQ
,
.
read_irq_name
=
"ssl"
,
.
write_irq
=
SSL_WRITE_IRQ
,
.
write_irq_name
=
"ssl-write"
,
.
symlink_from
=
"serial"
,
.
symlink_to
=
"tts"
,
.
mc
=
{
.
name
=
"ssl"
,
.
config
=
ssl_config
,
.
get_config
=
ssl_get_config
,
.
remove
=
ssl_remove
,
},
};
...
...
@@ -191,21 +191,21 @@ void ssl_hangup(struct tty_struct *tty)
}
static
struct
tty_driver
ssl_driver
=
{
refcount
:
&
ssl_refcount
,
open
:
ssl_open
,
close
:
ssl_close
,
write
:
ssl_write
,
put_char
:
ssl_put_char
,
flush_chars
:
ssl_flush_chars
,
chars_in_buffer
:
ssl_chars_in_buffer
,
flush_buffer
:
ssl_flush_buffer
,
ioctl
:
ssl_ioctl
,
throttle
:
ssl_throttle
,
unthrottle
:
ssl_unthrottle
,
set_termios
:
ssl_set_termios
,
stop
:
ssl_stop
,
start
:
ssl_start
,
hangup
:
ssl_hangup
.
refcount
=
&
ssl_refcount
,
.
open
=
ssl_open
,
.
close
=
ssl_close
,
.
write
=
ssl_write
,
.
put_char
=
ssl_put_char
,
.
flush_chars
=
ssl_flush_chars
,
.
chars_in_buffer
=
ssl_chars_in_buffer
,
.
flush_buffer
=
ssl_flush_buffer
,
.
ioctl
=
ssl_ioctl
,
.
throttle
=
ssl_throttle
,
.
unthrottle
=
ssl_unthrottle
,
.
set_termios
=
ssl_set_termios
,
.
stop
=
ssl_stop
,
.
start
=
ssl_start
,
.
hangup
=
ssl_hangup
};
/* Changed by ssl_init and referenced by ssl_exit, which are both serialized
...
...
arch/um/drivers/stdio_console.c
View file @
366fdb90
...
...
@@ -42,28 +42,28 @@ static struct tty_driver console_driver;
static
int
console_refcount
=
0
;
static
struct
chan_ops
init_console_ops
=
{
type:
"you shouldn't see this"
,
init
:
NULL
,
open
:
NULL
,
close
:
NULL
,
read
:
NULL
,
write
:
NULL
,
console_write
:
generic_write
,
window_size
:
NULL
,
free
:
NULL
,
winch:
0
,
.
type
=
"you shouldn't see this"
,
.
init
=
NULL
,
.
open
=
NULL
,
.
close
=
NULL
,
.
read
=
NULL
,
.
write
=
NULL
,
.
console_write
=
generic_write
,
.
window_size
=
NULL
,
.
free
=
NULL
,
.
winch
=
0
,
};
static
struct
chan
init_console_chan
=
{
list
:
{
},
primary
:
1
,
input
:
0
,
output
:
1
,
opened
:
1
,
fd
:
1
,
pri
:
INIT_STATIC
,
ops
:
&
init_console_ops
,
data
:
NULL
.
list
=
{
},
.
primary
=
1
,
.
input
=
0
,
.
output
=
1
,
.
opened
=
1
,
.
fd
=
1
,
.
pri
=
INIT_STATIC
,
.
ops
=
&
init_console_ops
,
.
data
=
NULL
};
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
=
{
announce:
stdio_announce
,
xterm_title:
"Virtual Console #%d"
,
raw:
1
,
tramp_stack
:
0
,
in_kernel
:
1
,
.
announce
=
stdio_announce
,
.
xterm_title
=
"Virtual Console #%d"
,
.
raw
=
1
,
.
tramp_stack
=
0
,
.
in_kernel
=
1
,
};
static
int
con_config
(
char
*
str
);
...
...
@@ -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
struct
line_driver
driver
=
{
name
:
"UML console"
,
devfs_name
:
"vc/%d"
,
major
:
TTY_MAJOR
,
minor_start
:
0
,
type
:
TTY_DRIVER_TYPE_CONSOLE
,
subtype
:
SYSTEM_TYPE_CONSOLE
,
read_irq
:
CONSOLE_IRQ
,
read_irq_name
:
"console"
,
write_irq
:
CONSOLE_WRITE_IRQ
,
write_irq_name
:
"console-write"
,
symlink_from
:
"ttys"
,
symlink_to
:
"vc"
,
mc
:
{
name
:
"con"
,
config
:
con_config
,
get_config
:
con_get_config
,
remove
:
con_remove
,
.
name
=
"UML console"
,
.
devfs_name
=
"vc/%d"
,
.
major
=
TTY_MAJOR
,
.
minor_start
=
0
,
.
type
=
TTY_DRIVER_TYPE_CONSOLE
,
.
subtype
=
SYSTEM_TYPE_CONSOLE
,
.
read_irq
=
CONSOLE_IRQ
,
.
read_irq_name
=
"console"
,
.
write_irq
=
CONSOLE_WRITE_IRQ
,
.
write_irq_name
=
"console-write"
,
.
symlink_from
=
"ttys"
,
.
symlink_to
=
"vc"
,
.
mc
=
{
.
name
=
"con"
,
.
config
=
con_config
,
.
get_config
=
con_get_config
,
.
remove
=
con_remove
,
},
};
...
...
@@ -192,12 +192,12 @@ static void console_write(struct console *console, const char *string,
}
static
struct
tty_driver
console_driver
=
{
refcount
:
&
console_refcount
,
open
:
con_open
,
close
:
con_close
,
write
:
con_write
,
chars_in_buffer
:
chars_in_buffer
,
set_termios
:
set_termios
.
refcount
=
&
console_refcount
,
.
open
=
con_open
,
.
close
=
con_close
,
.
write
=
con_write
,
.
chars_in_buffer
=
chars_in_buffer
,
.
set_termios
=
set_termios
};
static
kdev_t
console_device
(
struct
console
*
c
)
...
...
arch/um/drivers/tty.c
View file @
366fdb90
...
...
@@ -32,8 +32,8 @@ void *tty_chan_init(char *str, int device, struct chan_opts *opts)
if
((
data
=
um_kmalloc
(
sizeof
(
*
data
)))
==
NULL
)
return
(
NULL
);
*
data
=
((
struct
tty_chan
)
{
dev
:
str
,
raw
:
opts
->
raw
});
*
data
=
((
struct
tty_chan
)
{
.
dev
=
str
,
.
raw
=
opts
->
raw
});
return
(
data
);
}
...
...
@@ -62,16 +62,16 @@ int tty_console_write(int fd, const char *buf, int n, void *d)
}
struct
chan_ops
tty_ops
=
{
type:
"tty"
,
init:
tty_chan_init
,
open:
tty_open
,
close:
generic_close
,
read:
generic_read
,
write:
generic_write
,
console_write:
tty_console_write
,
window_size:
generic_window_size
,
free:
generic_free
,
winch:
0
,
.
type
=
"tty"
,
.
init
=
tty_chan_init
,
.
open
=
tty_open
,
.
close
=
generic_close
,
.
read
=
generic_read
,
.
write
=
generic_write
,
.
console_write
=
tty_console_write
,
.
window_size
=
generic_window_size
,
.
free
=
generic_free
,
.
winch
=
0
,
};
/*
...
...
arch/um/drivers/ubd_kern.c
View file @
366fdb90
...
...
@@ -77,9 +77,11 @@ static struct gendisk *ubd_gendisk[MAX_DEV];
static
struct
gendisk
*
fake_gendisk
[
MAX_DEV
];
#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
#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
/* Not protected - changed only in ubd_setup_common and then only to
...
...
@@ -177,6 +179,8 @@ static void make_ide_entries(char *dev_name)
if
(
proc_ide_root
==
NULL
)
make_proc_ide
();
dir
=
proc_mkdir
(
dev_name
,
proc_ide
);
if
(
!
dir
)
return
;
ent
=
create_proc_entry
(
"media"
,
S_IFREG
|
S_IRUGO
,
dir
);
if
(
!
ent
)
return
;
ent
->
nlink
=
1
;
...
...
@@ -405,7 +409,8 @@ static int io_pid = -1;
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
);
...
...
arch/um/drivers/xterm.c
View file @
366fdb90
...
...
@@ -37,13 +37,13 @@ void *xterm_init(char *str, int device, struct chan_opts *opts)
struct
xterm_chan
*
data
;
if
((
data
=
malloc
(
sizeof
(
*
data
)))
==
NULL
)
return
(
NULL
);
*
data
=
((
struct
xterm_chan
)
{
pid
:
-
1
,
helper_pid
:
-
1
,
device
:
device
,
title
:
opts
->
xterm_title
,
raw
:
opts
->
raw
,
stack
:
opts
->
tramp_stack
,
direct_rcv
:
!
opts
->
in_kernel
}
);
*
data
=
((
struct
xterm_chan
)
{
.
pid
=
-
1
,
.
helper_pid
=
-
1
,
.
device
=
device
,
.
title
=
opts
->
xterm_title
,
.
raw
=
opts
->
raw
,
.
stack
=
opts
->
tramp_stack
,
.
direct_rcv
=
!
opts
->
in_kernel
}
);
return
(
data
);
}
...
...
@@ -137,7 +137,7 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
}
if
(
new
<
0
){
printk
(
"xterm_open : os_rcv_fd failed, errno = %d
\n
"
,
-
new
);
return
(
new
)
;
goto
out
;
}
tcgetattr
(
new
,
&
data
->
tt
);
...
...
@@ -145,6 +145,8 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
data
->
pid
=
pid
;
*
dev_out
=
NULL
;
out:
unlink
(
file
);
return
(
new
);
}
...
...
@@ -152,9 +154,11 @@ void xterm_close(int fd, void *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
;
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
;
close
(
fd
);
}
...
...
@@ -172,16 +176,16 @@ int xterm_console_write(int fd, const char *buf, int n, void *d)
}
struct
chan_ops
xterm_ops
=
{
type:
"xterm"
,
init:
xterm_init
,
open:
xterm_open
,
close:
xterm_close
,
read:
generic_read
,
write:
generic_write
,
console_write:
xterm_console_write
,
window_size:
generic_window_size
,
free:
xterm_free
,
winch:
1
,
.
type
=
"xterm"
,
.
init
=
xterm_init
,
.
open
=
xterm_open
,
.
close
=
xterm_close
,
.
read
=
generic_read
,
.
write
=
generic_write
,
.
console_write
=
xterm_console_write
,
.
window_size
=
generic_window_size
,
.
free
=
xterm_free
,
.
winch
=
1
,
};
/*
...
...
arch/um/drivers/xterm_kern.c
View file @
366fdb90
...
...
@@ -39,21 +39,21 @@ int xterm_fd(int socket, int *pid_out)
data
=
kmalloc
(
sizeof
(
*
data
),
GFP_KERNEL
);
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
);
}
*
data
=
((
struct
xterm_wait
)
{
sem
:
__SEMAPHORE_INITIALIZER
(
data
->
sem
,
0
),
fd
:
socket
,
pid
:
-
1
,
new_fd
:
-
1
});
{
.
sem
=
__SEMAPHORE_INITIALIZER
(
data
->
sem
,
0
),
.
fd
=
socket
,
.
pid
=
-
1
,
.
new_fd
=
-
1
});
err
=
um_request_irq
(
XTERM_IRQ
,
socket
,
IRQ_READ
,
xterm_interrupt
,
SA_INTERRUPT
|
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
"xterm"
,
data
);
if
(
err
){
printk
(
KERN_ERR
"
Failed to get IRQ for xterm, err = %d
\n
"
,
err
);
printk
(
KERN_ERR
"
xterm_fd : failed to get IRQ for xterm, "
"err = %d
\n
"
,
err
);
return
(
err
);
}
down
(
&
data
->
sem
);
...
...
arch/um/include/choose-mode.h
View file @
366fdb90
...
...
@@ -8,13 +8,13 @@
#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))
#elif defined(CONFIG_MODE_SKAS)
#elif defined(
UML_
CONFIG_MODE_SKAS)
#define CHOOSE_MODE(tt, skas) (skas)
#elif defined(CONFIG_MODE_TT)
#elif defined(
UML_
CONFIG_MODE_TT)
#define CHOOSE_MODE(tt, skas) (tt)
#endif
...
...
arch/um/include/frame.h
View file @
366fdb90
...
...
@@ -15,12 +15,12 @@ struct frame_common {
int
sr_index
;
int
sr_relative
;
int
sp_index
;
struct
arch_frame_data
arch
;
};
struct
sc_frame
{
struct
frame_common
common
;
int
sc_index
;
struct
arch_frame_data
arch
;
};
extern
struct
sc_frame
signal_frame_sc
;
...
...
@@ -31,6 +31,8 @@ struct si_frame {
struct
frame_common
common
;
int
sip_index
;
int
si_index
;
int
ucp_index
;
int
uc_index
;
};
extern
struct
si_frame
signal_frame_si
;
...
...
arch/um/include/irq_user.h
View file @
366fdb90
...
...
@@ -8,7 +8,7 @@
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
void
free_irq_by_irq_and_dev
(
int
irq
,
void
*
dev_id
);
extern
void
free_irq_by_fd
(
int
fd
);
...
...
arch/um/include/kern_util.h
View file @
366fdb90
...
...
@@ -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
int
sys_execve
(
char
*
file
,
char
**
argv
,
char
**
env
);
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
void
force_sigbus
(
void
);
extern
int
pid_to_processor_id
(
int
pid
);
...
...
@@ -64,7 +64,7 @@ extern void *syscall_sp(void *t);
extern
void
syscall_trace
(
void
);
extern
int
hz
(
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
pid_to_processor_id
(
int
pid
);
extern
void
boot_timer_handler
(
int
sig
);
...
...
@@ -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
singlestepping
(
void
*
t
);
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
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
do_uml_exitcalls
(
void
);
extern
int
attach_debugger
(
int
idle_pid
,
int
pid
,
int
stop
);
...
...
@@ -101,7 +101,7 @@ extern void *get_init_task(void);
extern
int
clear_user_proc
(
void
*
buf
,
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
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
int
smp_sigio_handler
(
void
);
extern
void
*
get_current
(
void
);
...
...
arch/um/include/mconsole.h
View file @
366fdb90
...
...
@@ -7,30 +7,35 @@
#ifndef __MCONSOLE_H__
#define __MCONSOLE_H__
#ifndef __KERNEL__
#include <stdint.h>
#define u32 uint32_t
#endif
#define MCONSOLE_MAGIC (0xcafebabe)
#define MCONSOLE_MAX_DATA (512)
#define MCONSOLE_VERSION 2
struct
mconsole_request
{
u
nsigned
long
magic
;
int
version
;
int
len
;
u
32
magic
;
u32
version
;
u32
len
;
char
data
[
MCONSOLE_MAX_DATA
];
};
struct
mconsole_reply
{
int
err
;
int
more
;
int
len
;
u32
err
;
u32
more
;
u32
len
;
char
data
[
MCONSOLE_MAX_DATA
];
};
struct
mconsole_notify
{
u
nsigned
long
magic
;
int
version
;
u
32
magic
;
u32
version
;
enum
{
MCONSOLE_SOCKET
,
MCONSOLE_PANIC
,
MCONSOLE_HANG
,
MCONSOLE_USER_NOTIFY
}
type
;
int
len
;
u32
len
;
char
data
[
MCONSOLE_MAX_DATA
];
};
...
...
arch/um/include/mode.h
View file @
366fdb90
...
...
@@ -8,11 +8,11 @@
#include "uml-config.h"
#ifdef CONFIG_MODE_TT
#ifdef
UML_
CONFIG_MODE_TT
#include "../kernel/tt/include/mode.h"
#endif
#ifdef CONFIG_MODE_SKAS
#ifdef
UML_
CONFIG_MODE_SKAS
#include "../kernel/skas/include/mode.h"
#endif
...
...
arch/um/include/os.h
View file @
366fdb90
...
...
@@ -25,9 +25,11 @@ struct openflags {
unsigned
int
t
:
1
;
/* O_TRUNC */
unsigned
int
a
:
1
;
/* O_APPEND */
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
)
{
...
...
@@ -83,9 +85,16 @@ static inline struct openflags of_excl(struct openflags 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_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_pipe
(
int
*
fd
,
int
stream
,
int
close_on_exec
);
extern
int
os_set_fd_async
(
int
fd
,
int
owner
);
...
...
@@ -98,7 +107,6 @@ extern int create_unix_socket(char *file, int len);
extern
int
os_connect_socket
(
char
*
name
);
extern
int
os_file_type
(
char
*
file
);
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
int
os_process_parent
(
int
pid
);
...
...
arch/um/include/signal_kern.h
View file @
366fdb90
/*
* Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
* Copyright (C) 2001
, 2002
Jeff Dike (jdike@karaya.com)
* Licensed under the GPL
*/
#ifndef __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
);
#endif
...
...
arch/um/include/sysdep-i386/frame.h
View file @
366fdb90
...
...
@@ -7,7 +7,8 @@
#define __FRAME_I386_H
struct
arch_frame_data_raw
{
unsigned
long
sc_end
;
unsigned
long
fp_start
;
unsigned
long
sr
;
};
struct
arch_frame_data
{
...
...
arch/um/include/sysdep-i386/frame_kern.h
View file @
366fdb90
...
...
@@ -16,6 +16,15 @@ static inline void *sp_to_sc(unsigned long 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
)
{
unsigned
long
sc
;
...
...
@@ -42,7 +51,7 @@ static inline void *sp_to_rt_mask(unsigned long sp)
mask
=
sp
-
signal_frame_si
.
common
.
sp_index
+
signal_frame_si
.
common
.
len
+
sc_size
(
&
signal_frame_s
c
.
arch
)
-
4
;
sc_size
(
&
signal_frame_s
i
.
common
.
arch
)
-
4
;
return
((
void
*
)
mask
);
}
...
...
arch/um/include/sysdep-i386/frame_user.h
View file @
366fdb90
...
...
@@ -18,26 +18,35 @@
* 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
* 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 s
i
gcontext up to the top of the stack. So,
* 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
* considered to be.
*/
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
;
data
->
sc_end
+=
sizeof
(
*
sc
);
unsigned
long
sr
=
*
((
unsigned
long
*
)
srp
);
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
,
struct
arch_frame_data
*
out
)
{
unsigned
long
fpstate_start
=
in
->
sc_end
;
unsigned
long
fpstate_start
=
in
->
fp_start
;
if
(
in
->
sr
==
0
){
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
...
...
arch/um/include/sysdep-i386/ptrace.h
View file @
366fdb90
...
...
@@ -8,78 +8,100 @@
#include "uml-config.h"
#ifdef CONFIG_MODE_TT
#ifdef
UML_
CONFIG_MODE_TT
#include "ptrace-tt.h"
#endif
#ifdef CONFIG_MODE_SKAS
#ifdef
UML_
CONFIG_MODE_SKAS
#include "ptrace-skas.h"
#endif
#include "choose-mode.h"
struct
uml_pt_regs
{
unsigned
long
args
[
6
];
union
uml_pt_regs
{
#ifdef UML_CONFIG_MODE_TT
struct
tt_regs
{
long
syscall
;
int
is_user
;
union
{
#ifdef CONFIG_MODE_TT
void
*
tt
;
void
*
sc
;
}
tt
;
#endif
#ifdef CONFIG_MODE_SKAS
struct
{
#ifdef
UML_
CONFIG_MODE_SKAS
struct
skas_regs
{
unsigned
long
regs
[
HOST_FRAME_SIZE
];
unsigned
long
fp
[
HOST_FP_SIZE
];
unsigned
long
xfp
[
HOST_XFP_SIZE
];
unsigned
long
fault_addr
;
unsigned
long
fault_type
;
unsigned
long
trap_type
;
long
syscall
;
int
is_user
;
}
skas
;
#endif
}
mode
;
};
#define EMPTY_UML_PT_REGS { \
syscall : -1, \
args : { [0 ... 5] = 0 }, \
is_user : 0 }
#define EMPTY_UML_PT_REGS { }
extern
int
mode_tt
;
#define UPT_SC(r) ((r)->tt.sc)
#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) \
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) \
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) \
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) \
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) \
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) \
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) \
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) \
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) \
CHOOSE_MODE(SC_EBP((r)->mode.tt), REGS_EBP((r)->mode.skas.regs))
#define UPT_ORIG_EAX(r) ((r)->syscall)
CHOOSE_MODE(SC_EBP(UPT_SC(r)), REGS_EBP((r)->skas.regs))
#define UPT_ORIG_EAX(r) \
CHOOSE_MODE((r)->tt.syscall, (r)->skas.syscall)
#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) \
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) \
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) \
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) \
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) \
CHOOSE_MODE(SC_GS((r)->mode.tt), REGS_GS((r)->mode.skas.regs))
#define UPT_SC(r) ((r)->mode.tt)
CHOOSE_MODE(SC_GS(UPT_SC(r)), REGS_GS((r)->skas.regs))
#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) \
({ unsigned long val; \
...
...
@@ -136,28 +158,26 @@ extern int mode_tt;
} while (0)
#define UPT_SET_SYSCALL_RETURN(r, res) \
CHOOSE_MODE(SC_SET_SYSCALL_RETURN(
(r)->mode.tt
, (res)), \
REGS_SET_SYSCALL_RETURN((r)->
mode.
skas.regs, (res)))
CHOOSE_MODE(SC_SET_SYSCALL_RETURN(
UPT_SC(r)
, (res)), \
REGS_SET_SYSCALL_RETURN((r)->skas.regs, (res)))
#define UPT_RESTART_SYSCALL(r) \
CHOOSE_MODE(SC_RESTART_SYSCALL(
(r)->mode.tt
), \
REGS_RESTART_SYSCALL((r)->
mode.
skas.regs))
CHOOSE_MODE(SC_RESTART_SYSCALL(
UPT_SC(r)
), \
REGS_RESTART_SYSCALL((r)->skas.regs))
#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_SEGV_IS_FIXABLE(r) \
CHOOSE_MODE(SC_SEGV_IS_FIXABLE(
r->mode.tt
), \
REGS_SEGV_IS_FIXABLE(&r->mode.
skas))
CHOOSE_MODE(SC_SEGV_IS_FIXABLE(
UPT_SC(r)
), \
REGS_SEGV_IS_FIXABLE(&r->
skas))
#define UPT_FAULT_ADDR(r) \
CHOOSE_MODE(SC_FAULT_ADDR(r->mode.tt), \
REGS_FAULT_ADDR(&r->mode.skas))
CHOOSE_MODE(SC_FAULT_ADDR(UPT_SC(r)), REGS_FAULT_ADDR(&r->skas))
#define UPT_FAULT_WRITE(r) \
CHOOSE_MODE(SC_FAULT_WRITE(r->mode.tt), \
REGS_FAULT_WRITE(&r->mode.skas))
CHOOSE_MODE(SC_FAULT_WRITE(UPT_SC(r)), REGS_FAULT_WRITE(&r->skas))
#endif
...
...
arch/um/include/sysdep-i386/sigcontext.h
View file @
366fdb90
...
...
@@ -33,34 +33,6 @@
#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
int
sc_get_fpregs
(
unsigned
long
buf
,
void
*
sc_ptr
);
...
...
arch/um/include/sysdep-i386/syscalls.h
View file @
366fdb90
...
...
@@ -4,10 +4,12 @@
*/
#include "asm/unistd.h"
#include "sysdep/ptrace.h"
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(®s->regs))
extern
syscall_handler_t
sys_modify_ldt
;
extern
syscall_handler_t
old_mmap_i386
;
...
...
arch/um/include/time_user.h
View file @
366fdb90
...
...
@@ -11,7 +11,7 @@ extern void switch_timers(int to_real);
extern
void
set_interval
(
int
timer_type
);
extern
void
idle_sleep
(
int
secs
);
extern
void
enable_timer
(
void
);
extern
void
time_lock
(
void
);
extern
void
time_unlock
(
void
);
extern
unsigned
long
time_lock
(
void
);
extern
void
time_unlock
(
unsigned
long
);
#endif
arch/um/include/umid.h
View file @
366fdb90
...
...
@@ -3,8 +3,13 @@
* Licensed under the GPL
*/
#ifndef __UMID_H__
#define __UMID_H__
extern
int
umid_file_name
(
char
*
name
,
char
*
buf
,
int
len
);
#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
...
...
arch/um/include/uml_uaccess.h
0 → 100644
View file @
366fdb90
/*
* 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:
*/
arch/um/include/user_util.h
View file @
366fdb90
...
...
@@ -24,7 +24,7 @@ struct cpu_task {
extern
struct
cpu_task
cpu_tasks
[];
struct
signal_info
{
void
(
*
handler
)(
int
,
struct
uml_pt_regs
*
);
void
(
*
handler
)(
int
,
union
uml_pt_regs
*
);
int
is_irq
;
};
...
...
@@ -86,7 +86,7 @@ extern void check_sigio(void);
extern
int
run_kernel_thread
(
int
(
*
fn
)(
void
*
),
void
*
arg
,
void
**
jmp_ptr
);
extern
void
write_sigio_workaround
(
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
void
forward_pending_sigio
(
int
target
);
extern
int
can_do_skas
(
void
);
...
...
arch/um/kernel/Makefile
View file @
366fdb90
...
...
@@ -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
\
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
\
time_kern.o tlb.o trap_kern.o trap_user.o um_arch.o
\
umid.o user_util.o
time_kern.o tlb.o trap_kern.o trap_user.o u
access_user.o u
m_arch.o
\
umid.o user_
syms.o user_
util.o
obj-$(CONFIG_BLK_DEV_INITRD)
+=
initrd_kern.o initrd_user.o
obj-$(CONFIG_GPROF)
+=
gprof_syms.o
...
...
@@ -21,9 +21,6 @@ obj-$(CONFIG_MODE_SKAS) += skas/
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
\
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)
)
...
...
@@ -42,7 +39,7 @@ CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \
CFLAGS_frame.o
:=
$(
patsubst
-fomit-frame-pointer
,,
$(USER_CFLAGS)
)
$(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
# regardless of how the rest of the kernel is built.
...
...
arch/um/kernel/frame.c
View file @
366fdb90
...
...
@@ -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 */
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
);
}
if
(
waitpid
(
pid
,
&
status
,
0
)
<
0
){
...
...
@@ -110,6 +111,7 @@ struct common_raw {
unsigned
long
sig
;
unsigned
long
sr
;
unsigned
long
sp
;
struct
arch_frame_data_raw
arch
;
};
#define SA_RESTORER (0x04000000)
...
...
@@ -173,7 +175,6 @@ struct sc_frame_raw {
struct
common_raw
common
;
unsigned
long
sc
;
int
restorer
;
struct
arch_frame_data_raw
arch
;
};
/* Changed only during early boot */
...
...
@@ -185,7 +186,8 @@ static void sc_handler(int sig, struct sigcontext sc)
raw_sc
->
common
.
sr
=
frame_restorer
();
raw_sc
->
common
.
sp
=
frame_sp
();
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
());
kill
(
getpid
(),
SIGKILL
);
}
...
...
@@ -205,18 +207,25 @@ struct si_frame_raw {
struct
common_raw
common
;
unsigned
long
sip
;
unsigned
long
si
;
unsigned
long
ucp
;
unsigned
long
uc
;
};
/* Changed only during early boot */
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
.
sr
=
frame_restorer
();
raw_si
->
common
.
sp
=
frame_sp
();
raw_si
->
sip
=
(
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
());
kill
(
getpid
(),
SIGKILL
);
}
...
...
@@ -292,7 +301,7 @@ void capture_signal_stack(void)
&
signal_frame_sc
.
common
);
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 */
raw_sc
.
restorer
=
1
;
...
...
@@ -300,6 +309,7 @@ void capture_signal_stack(void)
(
void
*
)
top
,
sigstack
,
PAGE_SIZE
,
&
signal_frame_sc_sr
.
common
);
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 */
...
...
@@ -308,6 +318,9 @@ void capture_signal_stack(void)
&
signal_frame_si
.
common
);
signal_frame_si
.
sip_index
=
raw_si
.
sip
-
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
)
||
(
munmap
(
sigstack
,
PAGE_SIZE
)
<
0
)){
...
...
arch/um/kernel/frame_kern.c
View file @
366fdb90
...
...
@@ -6,6 +6,8 @@
#include "asm/ptrace.h"
#include "asm/uaccess.h"
#include "asm/signal.h"
#include "asm/uaccess.h"
#include "asm/ucontext.h"
#include "frame_kern.h"
#include "sigcontext.h"
#include "sysdep/ptrace.h"
...
...
@@ -27,48 +29,62 @@ static int copy_restorer(void (*restorer)(void), unsigned long start,
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
,
f
rom
->
regs
.
mode
.
tt
,
&
signal_frame_sc_sr
.
arch
),
copy_sc_to_user_skas
(
to
,
&
from
->
regs
,
return
(
CHOOSE_MODE
(
copy_sc_to_user_tt
(
to
,
f
p
,
UPT_SC
(
&
from
->
regs
)
,
arch
),
copy_sc_to_user_skas
(
to
,
fp
,
&
from
->
regs
,
current
->
thread
.
cr2
,
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
,
unsigned
long
handler
,
void
(
*
restorer
)(
void
),
struct
pt_regs
*
regs
,
siginfo_t
*
info
,
sigset_t
*
mask
)
{
unsigned
long
start
,
sc
,
sigs
;
void
*
sip
;
int
sig_size
=
_NSIG_WORDS
*
sizeof
(
unsigned
long
);
unsigned
long
start
;
void
*
sip
,
*
ucp
,
*
fp
;
start
=
stack_top
-
signal_frame_si
.
common
.
len
-
sc_size
(
&
signal_frame_sc
.
arch
)
-
sig_size
;
start
=
stack_top
-
signal_frame_si
.
common
.
len
;
sip
=
(
void
*
)
(
start
+
signal_frame_si
.
si_index
);
sc
=
start
+
signal_frame_si
.
common
.
len
;
sigs
=
sc
+
sc_size
(
&
signal_frame_sc
.
arch
);
ucp
=
(
void
*
)
(
start
+
signal_frame_si
.
uc_index
)
;
fp
=
(
void
*
)
(((
unsigned
long
)
ucp
)
+
sizeof
(
struct
ucontext
)
);
if
(
restorer
==
NULL
)
panic
(
"setup_signal_stack_si - no restorer"
);
if
(
copy_sc_to_user
((
void
*
)
sc
,
regs
)
||
copy_to_user
((
void
*
)
start
,
signal_frame_si
.
common
.
data
,
if
(
copy_to_user
((
void
*
)
start
,
signal_frame_si
.
common
.
data
,
signal_frame_si
.
common
.
len
)
||
copy_to_user
((
void
*
)
(
start
+
signal_frame_si
.
common
.
sig_index
),
&
sig
,
sizeof
(
sig
))
||
copy_siginfo_to_user
(
sip
,
info
)
||
copy_to_user
((
void
*
)
(
start
+
signal_frame_si
.
sip_index
),
&
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
,
signal_frame_si
.
common
.
sr_relative
))
return
(
1
);
PT_REGS_IP
(
regs
)
=
handler
;
PT_REGS_SP
(
regs
)
=
start
+
signal_frame_s
c
.
common
.
sp_index
;
PT_REGS_SP
(
regs
)
=
start
+
signal_frame_s
i
.
common
.
sp_index
;
return
(
0
);
}
...
...
@@ -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
)
||
copy_to_user
((
void
*
)
(
start
+
frame
->
sig_index
),
&
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
((
void
*
)
sigs
,
&
mask
->
sig
[
1
],
sig_size
)
||
copy_restorer
(
restorer
,
start
,
frame
->
sr_index
,
frame
->
sr_relative
))
...
...
arch/um/kernel/irq.c
View file @
366fdb90
...
...
@@ -271,7 +271,7 @@ void enable_irq(unsigned int irq)
* SMP cross-CPU interrupts have their own specific
* 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
...
...
arch/um/kernel/irq_user.c
View file @
366fdb90
...
...
@@ -42,7 +42,7 @@ static int pollfds_size = 0;
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
;
int
i
,
n
;
...
...
@@ -128,15 +128,15 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
if
(
type
==
IRQ_READ
)
events
=
POLLIN
|
POLLPRI
;
else
events
=
POLLOUT
;
*
new_fd
=
((
struct
irq_fd
)
{
next
:
NULL
,
id
:
dev_id
,
fd
:
fd
,
type
:
type
,
irq
:
irq
,
pid
:
pid
,
events
:
events
,
current_events:
0
,
freed
:
0
}
);
*
new_fd
=
((
struct
irq_fd
)
{
.
next
=
NULL
,
.
id
=
dev_id
,
.
fd
=
fd
,
.
type
=
type
,
.
irq
=
irq
,
.
pid
=
pid
,
.
events
=
events
,
.
current_events
=
0
,
.
freed
=
0
}
);
/* Critical section - locked by a spinlock because this stuff can
* 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)
if
(
type
==
IRQ_WRITE
)
fd
=
-
1
;
pollfds
[
pollfds_num
]
=
((
struct
pollfd
)
{
fd
:
fd
,
events
:
events
,
revents
:
0
});
pollfds
[
pollfds_num
]
=
((
struct
pollfd
)
{
.
fd
=
fd
,
.
events
=
events
,
.
revents
=
0
});
pollfds_num
++
;
*
last_irq_ptr
=
new_fd
;
...
...
@@ -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
)
{
struct
irq_and_dev
data
=
((
struct
irq_and_dev
)
{
irq
:
irq
,
dev
:
dev
});
struct
irq_and_dev
data
=
((
struct
irq_and_dev
)
{
.
irq
=
irq
,
.
dev
=
dev
});
free_irq_by_cb
(
same_irq_and_dev
,
&
data
);
}
...
...
arch/um/kernel/ksyms.c
View file @
366fdb90
...
...
@@ -14,6 +14,7 @@
#include "asm/processor.h"
#include "asm/unistd.h"
#include "asm/pgalloc.h"
#include "asm/pgtable.h"
#include "asm/page.h"
#include "asm/tlbflush.h"
#include "kern_util.h"
...
...
@@ -42,7 +43,11 @@ EXPORT_SYMBOL(page_to_phys);
EXPORT_SYMBOL
(
phys_to_page
);
EXPORT_SYMBOL
(
high_physmem
);
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_read_file
);
EXPORT_SYMBOL
(
os_write_file
);
...
...
arch/um/kernel/mem.c
View file @
366fdb90
...
...
@@ -27,6 +27,7 @@
#include "init.h"
#include "os.h"
#include "mode_kern.h"
#include "uml_uaccess.h"
/* Changed during early boot */
pgd_t
swapper_pg_dir
[
1024
];
...
...
@@ -231,11 +232,11 @@ static int setup_one_range(int fd, char *driver, unsigned long start,
panic
(
"Failed to allocating mem_region"
);
}
*
region
=
((
struct
mem_region
)
{
driver
:
driver
,
start_pfn
:
pfn
,
start
:
start
,
len
:
len
,
fd
:
fd
}
);
*
region
=
((
struct
mem_region
)
{
.
driver
=
driver
,
.
start_pfn
=
pfn
,
.
start
=
start
,
.
len
=
len
,
.
fd
=
fd
}
);
regions
[
i
]
=
region
;
out:
up
(
&
regions_sem
);
...
...
@@ -414,8 +415,28 @@ __uml_setup("mem=", uml_mem_setup,
struct
page
*
arch_validate
(
struct
page
*
page
,
int
mask
,
int
order
)
{
return
(
CHOOSE_MODE_PROC
(
arch_validate_tt
,
arch_validate_skas
,
page
,
mask
,
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
;
}
DECLARE_MUTEX
(
vm_reserved_sem
);
...
...
@@ -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
struct
vm_reserved
head
=
{
list
:
LIST_HEAD_INIT
(
head
.
list
),
start
:
0
,
end
:
0xffffffff
.
list
=
LIST_HEAD_INIT
(
head
.
list
),
.
start
=
0
,
.
end
=
0xffffffff
};
static
struct
vm_reserved
tail
=
{
list
:
LIST_HEAD_INIT
(
tail
.
list
),
start
:
0
,
end
:
0xffffffff
.
list
=
LIST_HEAD_INIT
(
tail
.
list
),
.
start
=
0
,
.
end
=
0xffffffff
};
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)
goto
out
;
}
*
entry
=
((
struct
vm_reserved
)
{
list
:
LIST_HEAD_INIT
(
entry
->
list
),
start
:
start
,
end
:
end
});
{
.
list
=
LIST_HEAD_INIT
(
entry
->
list
),
.
start
=
start
,
.
end
=
end
});
list_add
(
&
entry
->
list
,
&
prev
->
list
);
err
=
0
;
out:
...
...
@@ -539,9 +560,9 @@ struct iomem {
*/
struct
iomem
iomem_regions
[
NREGIONS
]
=
{
[
0
...
NREGIONS
-
1
]
=
{
name
:
NULL
,
fd
:
-
1
,
size
:
0
}
};
{
.
name
=
NULL
,
.
fd
=
-
1
,
.
size
=
0
}
};
int
num_iomem_regions
=
0
;
...
...
@@ -551,9 +572,9 @@ void add_iomem(char *name, int fd, unsigned long size)
return
;
size
=
(
size
+
PAGE_SIZE
-
1
)
&
PAGE_MASK
;
iomem_regions
[
num_iomem_regions
++
]
=
((
struct
iomem
)
{
name
:
name
,
fd
:
fd
,
size
:
size
}
);
((
struct
iomem
)
{
.
name
=
name
,
.
fd
=
fd
,
.
size
=
size
}
);
}
int
setup_iomem
(
void
)
...
...
arch/um/kernel/process_kern.c
View file @
366fdb90
...
...
@@ -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
)
{
int
save_kmalloc_ok
=
kmalloc_ok
;
kmalloc_ok
=
0
;
CHOOSE_MODE_PROC
(
initial_thread_cb_tt
,
initial_thread_cb_skas
,
proc
,
arg
);
kmalloc_ok
=
save_kmalloc_ok
;
}
unsigned
long
stack_sp
(
unsigned
long
page
)
...
...
arch/um/kernel/sigio_user.c
View file @
366fdb90
...
...
@@ -52,7 +52,7 @@ void __init check_one_sigio(void (*proc)(int, int))
{
struct
sigaction
old
,
new
;
struct
termios
tt
;
struct
openpty_arg
pty
=
{
master
:
-
1
,
slave
:
-
1
};
struct
openpty_arg
pty
=
{
.
master
=
-
1
,
.
slave
=
-
1
};
int
master
,
slave
,
flags
;
initial_thread_cb
(
openpty_cb
,
&
pty
);
...
...
@@ -111,6 +111,7 @@ static void tty_output(int master, int slave)
printk
(
"Checking that host ptys support output SIGIO..."
);
memset
(
buf
,
0
,
sizeof
(
buf
));
while
(
write
(
master
,
buf
,
sizeof
(
buf
))
>
0
)
;
if
(
errno
!=
EAGAIN
)
panic
(
"check_sigio : write failed, errno = %d
\n
"
,
errno
);
...
...
@@ -170,15 +171,15 @@ struct pollfds {
* synchronizes with it.
*/
struct
pollfds
current_poll
=
{
poll
:
NULL
,
size
:
0
,
used
:
0
.
poll
=
NULL
,
.
size
=
0
,
.
used
=
0
};
struct
pollfds
next_poll
=
{
poll
:
NULL
,
size
:
0
,
used
:
0
.
poll
=
NULL
,
.
size
=
0
,
.
used
=
0
};
static
int
write_sigio_thread
(
void
*
unused
)
...
...
@@ -267,7 +268,8 @@ static void update_thread(void)
return
;
fail:
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
;
close
(
sigio_private
[
0
]);
close
(
sigio_private
[
1
]);
...
...
@@ -298,9 +300,9 @@ int add_sigio_fd(int fd, int read)
if
(
read
)
events
=
POLLIN
;
else
events
=
POLLOUT
;
next_poll
.
poll
[
n
-
1
]
=
((
struct
pollfd
)
{
fd
:
fd
,
events
:
events
,
revents
:
0
});
next_poll
.
poll
[
n
-
1
]
=
((
struct
pollfd
)
{
.
fd
=
fd
,
.
events
=
events
,
.
revents
=
0
});
update_thread
();
out:
sigio_unlock
();
...
...
@@ -348,12 +350,12 @@ static int setup_initial_poll(int fd)
printk
(
"setup_initial_poll : failed to allocate poll
\n
"
);
return
(
-
1
);
}
*
p
=
((
struct
pollfd
)
{
fd
:
fd
,
events
:
POLLIN
,
revents
:
0
});
current_poll
=
((
struct
pollfds
)
{
poll
:
p
,
used
:
1
,
size
:
1
});
*
p
=
((
struct
pollfd
)
{
.
fd
=
fd
,
.
events
=
POLLIN
,
.
revents
=
0
});
current_poll
=
((
struct
pollfds
)
{
.
poll
=
p
,
.
used
=
1
,
.
size
=
1
});
return
(
0
);
}
...
...
@@ -394,7 +396,7 @@ void write_sigio_workaround(void)
return
;
out_kill:
kill
(
write_sigio_pid
,
SIGKILL
);
os_kill_process
(
write_sigio_pid
,
1
);
write_sigio_pid
=
-
1
;
out_close2:
close
(
sigio_private
[
0
]);
...
...
@@ -420,7 +422,8 @@ int read_sigio_fd(int fd)
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
);
...
...
arch/um/kernel/signal_kern.c
View file @
366fdb90
...
...
@@ -18,6 +18,7 @@
#include "asm/uaccess.h"
#include "asm/unistd.h"
#include "user_util.h"
#include "asm/ucontext.h"
#include "kern_util.h"
#include "signal_kern.h"
#include "signal_user.h"
...
...
@@ -29,18 +30,6 @@
EXPORT_SYMBOL
(
block_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
)
{
if
(
sig
==
SIGSEGV
){
...
...
@@ -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
;
ret
=
CHOOSE_MODE
(
copy_sc_from_user_tt
(
to
->
regs
.
mode
.
tt
,
from
,
&
signal_frame_sc
.
arch
),
ret
=
CHOOSE_MODE
(
copy_sc_from_user_tt
(
UPT_SC
(
&
to
->
regs
),
from
,
arch
),
copy_sc_from_user_skas
(
&
to
->
regs
,
from
));
return
(
ret
);
}
int
sys_sigreturn
(
struct
pt_regs
regs
)
{
void
*
sc
=
sp_to_sc
(
PT_REGS_SP
(
&
regs
));
void
*
mask
=
sp_to_mask
(
PT_REGS_SP
(
&
regs
));
void
*
sc
=
sp_to_sc
(
PT_REGS_SP
(
&
current
->
thread
.
regs
));
void
*
mask
=
sp_to_mask
(
PT_REGS_SP
(
&
current
->
thread
.
regs
));
int
sig_size
=
(
_NSIG_WORDS
-
1
)
*
sizeof
(
unsigned
long
);
spin_lock_irq
(
&
current
->
sig
->
siglock
);
...
...
@@ -260,22 +249,25 @@ int sys_sigreturn(struct pt_regs regs)
sigdelsetmask
(
&
current
->
blocked
,
~
_BLOCKABLE
);
recalc_sigpending
();
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
));
}
int
sys_rt_sigreturn
(
struct
pt_regs
regs
)
{
void
*
sc
=
sp_to_rt_sc
(
PT_REGS_SP
(
&
regs
));
void
*
mask
=
sp_to_rt_mask
(
PT_REGS_SP
(
&
regs
))
;
struct
ucontext
*
uc
=
sp_to_uc
(
PT_REGS_SP
(
&
current
->
thread
.
regs
));
void
*
fp
;
int
sig_size
=
_NSIG_WORDS
*
sizeof
(
unsigned
long
);
spin_lock_irq
(
&
current
->
sig
->
siglock
);
copy_from_user
(
&
current
->
blocked
,
mask
,
sig_size
);
copy_from_user
(
&
current
->
blocked
,
&
uc
->
uc_sig
mask
,
sig_size
);
sigdelsetmask
(
&
current
->
blocked
,
~
_BLOCKABLE
);
recalc_sigpending
();
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
));
}
...
...
arch/um/kernel/skas/include/mode.h
View file @
366fdb90
...
...
@@ -12,10 +12,11 @@ extern unsigned long exec_fpx_regs[];
extern
int
have_fpx_regs
;
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_to_user_skas
(
void
*
to_ptr
,
struct
uml_pt_regs
*
regs
,
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
,
void
*
fp
,
union
uml_pt_regs
*
regs
,
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
reboot_skas
(
void
);
extern
void
kill_off_processes_skas
(
void
);
...
...
arch/um/kernel/skas/include/mode_kern.h
View file @
366fdb90
...
...
@@ -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
,
unsigned
long
*
task_size_out
);
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
thread_pid_skas
(
struct
task_struct
*
task
);
#define kmem_end_skas (host_task_size)
#define kmem_end_skas (host_task_size
- 1024 * 1024
)
#endif
...
...
arch/um/kernel/skas/include/ptrace-skas.h
View file @
366fdb90
...
...
@@ -8,7 +8,7 @@
#include "uml-config.h"
#ifdef CONFIG_MODE_SKAS
#ifdef
UML_
CONFIG_MODE_SKAS
#include "skas_ptregs.h"
...
...
arch/um/kernel/skas/include/skas.h
View file @
366fdb90
...
...
@@ -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
,
void
**
fork_buf_ptr
);
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
remove_sigstack
(
void
);
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
,
unsigned
long
len
,
int
r
,
int
w
,
int
x
);
extern
int
unmap
(
int
fd
,
void
*
addr
,
int
len
);
extern
int
protect
(
int
fd
,
unsigned
long
addr
,
unsigned
long
len
,
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
new_mm
(
int
from
);
extern
void
save_registers
(
struct
uml_pt_regs
*
regs
);
extern
void
restore_registers
(
struct
uml_pt_regs
*
regs
);
extern
void
save_registers
(
union
uml_pt_regs
*
regs
);
extern
void
restore_registers
(
union
uml_pt_regs
*
regs
);
extern
void
start_userspace
(
void
);
extern
void
init_registers
(
int
pid
);
...
...
arch/um/kernel/skas/include/uaccess.h
View file @
366fdb90
...
...
@@ -27,9 +27,6 @@ static inline int verify_area_skas(int type, const void * addr,
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
)
{
pte_t
pte
;
...
...
arch/um/kernel/skas/mem.c
View file @
366fdb90
...
...
@@ -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
);
}
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.
* Emacs will notice this stuff at the end of the file and automatically
...
...
arch/um/kernel/skas/mem_user.c
View file @
366fdb90
...
...
@@ -33,7 +33,7 @@ void map(int fd, unsigned long virt, unsigned long phys, unsigned long len,
.
fd
=
region
->
fd
,
.
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
))
printk
(
"map : /proc/mm map failed, errno = %d
\n
"
,
errno
);
}
...
...
@@ -48,7 +48,7 @@ int unmap(int fd, void *addr, int len)
{
.
munmap
=
{
.
addr
=
(
unsigned
long
)
addr
,
.
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
)))
return
(
-
errno
);
return
(
0
);
...
...
@@ -70,7 +70,7 @@ int protect(int fd, unsigned long addr, unsigned long len, int r, int w,
.
len
=
len
,
.
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
(
must_succeed
)
panic
(
"protect failed, errno = %d"
,
errno
);
...
...
arch/um/kernel/skas/process.c
View file @
366fdb90
...
...
@@ -20,10 +20,10 @@
#include "user_util.h"
#include "kern_util.h"
#include "skas.h"
#include "skas_ptrace.h"
#include "sysdep/sigcontext.h"
#include "os.h"
#include "proc_mm.h"
#include "skas_ptrace.h"
unsigned
long
exec_regs
[
FRAME_SIZE
];
unsigned
long
exec_fp_regs
[
HOST_FP_SIZE
];
...
...
@@ -39,14 +39,15 @@ static void handle_segv(int pid)
if
(
err
)
panic
(
"handle_segv - PTRACE_FAULTINFO failed, errno = %d
\n
"
,
errno
);
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
;
syscall_nr
=
PT_SYSCALL_NR
(
regs
->
mode
.
skas
.
regs
);
syscall_nr
=
PT_SYSCALL_NR
(
regs
->
skas
.
regs
);
if
(
syscall_nr
<
1
){
relay_signal
(
SIGTRAP
,
regs
);
return
;
...
...
@@ -79,6 +80,7 @@ static int userspace_tramp(void *arg)
enable_timer
();
ptrace
(
PTRACE_TRACEME
,
0
,
0
,
0
);
os_stop_process
(
os_getpid
());
return
(
0
);
}
void
start_userspace
(
void
)
...
...
@@ -115,7 +117,7 @@ void start_userspace(void)
userspace_pid
=
pid
;
}
void
userspace
(
struct
uml_pt_regs
*
regs
)
void
userspace
(
union
uml_pt_regs
*
regs
)
{
int
err
,
status
,
op
;
...
...
@@ -131,7 +133,7 @@ void userspace(struct uml_pt_regs *regs)
panic
(
"userspace - waitpid failed, errno = %d
\n
"
,
errno
);
regs
->
is_user
=
1
;
regs
->
skas
.
is_user
=
1
;
save_registers
(
regs
);
if
(
WIFSTOPPED
(
status
)){
...
...
@@ -191,28 +193,28 @@ void thread_wait(void *sw, void *fb)
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
)
{
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
);
if
(
ptrace
(
fp_op
,
userspace_pid
,
0
,
fp_regs
)
<
0
)
return
(
-
errno
);
return
(
0
);
}
void
save_registers
(
struct
uml_pt_regs
*
regs
)
void
save_registers
(
union
uml_pt_regs
*
regs
)
{
unsigned
long
*
fp_regs
;
int
err
,
fp_op
;
if
(
have_fpx_regs
){
fp_op
=
PTRACE_GETFPXREGS
;
fp_regs
=
regs
->
mode
.
skas
.
xfp
;
fp_regs
=
regs
->
skas
.
xfp
;
}
else
{
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
);
...
...
@@ -221,18 +223,18 @@ void save_registers(struct uml_pt_regs *regs)
err
);
}
void
restore_registers
(
struct
uml_pt_regs
*
regs
)
void
restore_registers
(
union
uml_pt_regs
*
regs
)
{
unsigned
long
*
fp_regs
;
int
err
,
fp_op
;
if
(
have_fpx_regs
){
fp_op
=
PTRACE_SETFPXREGS
;
fp_regs
=
regs
->
mode
.
skas
.
xfp
;
fp_regs
=
regs
->
skas
.
xfp
;
}
else
{
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
);
...
...
@@ -272,10 +274,14 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr)
(
*
cb_proc
)(
cb_arg
);
longjmp
(
*
cb_back
,
1
);
}
else
if
(
n
==
3
)
else
if
(
n
==
3
){
kmalloc_ok
=
0
;
return
(
0
);
else
if
(
n
==
4
)
}
else
if
(
n
==
4
){
kmalloc_ok
=
0
;
return
(
1
);
}
longjmp
(
**
switch_buf
,
1
);
}
...
...
@@ -296,8 +302,11 @@ void initial_thread_cb_skas(void (*proc)(void *), void *arg)
cb_proc
=
proc
;
cb_arg
=
arg
;
cb_back
=
&
here
;
block_signals
();
if
(
setjmp
(
here
)
==
0
)
longjmp
(
initial_jmpbuf
,
2
);
unblock_signals
();
cb_proc
=
NULL
;
cb_arg
=
NULL
;
...
...
@@ -328,7 +337,7 @@ int new_mm(int from)
copy
=
((
struct
proc_mm_op
)
{
.
op
=
MM_COPY_SEGMENTS
,
.
u
=
{
.
copy_segments
=
from
}
}
);
n
=
os_write_file
(
fd
,
(
char
*
)
&
copy
,
sizeof
(
copy
));
n
=
os_write_file
(
fd
,
&
copy
,
sizeof
(
copy
));
if
(
n
!=
sizeof
(
copy
))
printk
(
"new_mm : /proc/mm copy_segments failed, "
"errno = %d
\n
"
,
errno
);
...
...
arch/um/kernel/skas/process_kern.c
View file @
366fdb90
...
...
@@ -68,8 +68,7 @@ void new_thread_handler(int sig)
n
=
run_kernel_thread
(
fn
,
arg
,
&
current
->
thread
.
exec_buf
);
if
(
n
==
1
)
userspace
(
&
current
->
thread
.
regs
.
regs
);
else
if
(
n
==
2
)
do_exit
(
0
);
else
do_exit
(
0
);
}
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,
void
(
*
handler
)(
int
);
if
(
current
->
thread
.
forking
){
memcpy
(
&
p
->
thread
.
regs
.
regs
.
mode
.
skas
,
&
current
->
thread
.
regs
.
regs
.
mode
.
skas
,
sizeof
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
));
REGS_SET_SYSCALL_RETURN
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
regs
,
0
);
if
(
sp
!=
0
)
REGS_SP
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
regs
)
=
sp
;
memcpy
(
&
p
->
thread
.
regs
.
regs
.
skas
,
&
current
->
thread
.
regs
.
regs
.
skas
,
sizeof
(
p
->
thread
.
regs
.
regs
.
skas
));
REGS_SET_SYSCALL_RETURN
(
p
->
thread
.
regs
.
regs
.
skas
.
regs
,
0
);
if
(
sp
!=
0
)
REGS_SP
(
p
->
thread
.
regs
.
regs
.
skas
.
regs
)
=
sp
;
handler
=
fork_handler
;
}
else
{
memcpy
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
regs
,
exec_regs
,
sizeof
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
regs
));
memcpy
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
fp
,
exec_fp_regs
,
sizeof
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
fp
));
memcpy
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
xfp
,
exec_fpx_regs
,
sizeof
(
p
->
thread
.
regs
.
regs
.
mode
.
skas
.
xfp
));
memcpy
(
p
->
thread
.
regs
.
regs
.
skas
.
regs
,
exec_regs
,
sizeof
(
p
->
thread
.
regs
.
regs
.
skas
.
regs
));
memcpy
(
p
->
thread
.
regs
.
regs
.
skas
.
fp
,
exec_fp_regs
,
sizeof
(
p
->
thread
.
regs
.
regs
.
skas
.
fp
));
memcpy
(
p
->
thread
.
regs
.
regs
.
skas
.
xfp
,
exec_fpx_regs
,
sizeof
(
p
->
thread
.
regs
.
regs
.
skas
.
xfp
));
p
->
thread
.
request
.
u
.
thread
=
current
->
thread
.
request
.
u
.
thread
;
handler
=
new_thread_handler
;
}
...
...
arch/um/kernel/skas/sys-i386/sigcontext.c
View file @
366fdb90
...
...
@@ -15,7 +15,7 @@
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
;
unsigned
long
fpregs
[
FP_FRAME_SIZE
];
...
...
@@ -26,26 +26,26 @@ int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr)
if
(
err
)
return
(
err
);
regs
->
mode
.
skas
.
regs
[
GS
]
=
sc
.
gs
;
regs
->
mode
.
skas
.
regs
[
FS
]
=
sc
.
fs
;
regs
->
mode
.
skas
.
regs
[
ES
]
=
sc
.
es
;
regs
->
mode
.
skas
.
regs
[
DS
]
=
sc
.
ds
;
regs
->
mode
.
skas
.
regs
[
EDI
]
=
sc
.
edi
;
regs
->
mode
.
skas
.
regs
[
ESI
]
=
sc
.
esi
;
regs
->
mode
.
skas
.
regs
[
EBP
]
=
sc
.
ebp
;
regs
->
mode
.
skas
.
regs
[
UESP
]
=
sc
.
esp
;
regs
->
mode
.
skas
.
regs
[
EBX
]
=
sc
.
ebx
;
regs
->
mode
.
skas
.
regs
[
EDX
]
=
sc
.
edx
;
regs
->
mode
.
skas
.
regs
[
ECX
]
=
sc
.
ecx
;
regs
->
mode
.
skas
.
regs
[
EAX
]
=
sc
.
eax
;
regs
->
mode
.
skas
.
regs
[
EIP
]
=
sc
.
eip
;
regs
->
mode
.
skas
.
regs
[
CS
]
=
sc
.
cs
;
regs
->
mode
.
skas
.
regs
[
EFL
]
=
sc
.
eflags
;
regs
->
mode
.
skas
.
regs
[
UESP
]
=
sc
.
esp_at_signal
;
regs
->
mode
.
skas
.
regs
[
SS
]
=
sc
.
ss
;
regs
->
mode
.
skas
.
fault_addr
=
sc
.
cr2
;
regs
->
mode
.
skas
.
fault_type
=
FAULT_WRITE
(
sc
.
err
);
regs
->
mode
.
skas
.
trap_type
=
sc
.
trapno
;
regs
->
skas
.
regs
[
GS
]
=
sc
.
gs
;
regs
->
skas
.
regs
[
FS
]
=
sc
.
fs
;
regs
->
skas
.
regs
[
ES
]
=
sc
.
es
;
regs
->
skas
.
regs
[
DS
]
=
sc
.
ds
;
regs
->
skas
.
regs
[
EDI
]
=
sc
.
edi
;
regs
->
skas
.
regs
[
ESI
]
=
sc
.
esi
;
regs
->
skas
.
regs
[
EBP
]
=
sc
.
ebp
;
regs
->
skas
.
regs
[
UESP
]
=
sc
.
esp
;
regs
->
skas
.
regs
[
EBX
]
=
sc
.
ebx
;
regs
->
skas
.
regs
[
EDX
]
=
sc
.
edx
;
regs
->
skas
.
regs
[
ECX
]
=
sc
.
ecx
;
regs
->
skas
.
regs
[
EAX
]
=
sc
.
eax
;
regs
->
skas
.
regs
[
EIP
]
=
sc
.
eip
;
regs
->
skas
.
regs
[
CS
]
=
sc
.
cs
;
regs
->
skas
.
regs
[
EFL
]
=
sc
.
eflags
;
regs
->
skas
.
regs
[
UESP
]
=
sc
.
esp_at_signal
;
regs
->
skas
.
regs
[
SS
]
=
sc
.
ss
;
regs
->
skas
.
fault_addr
=
sc
.
cr2
;
regs
->
skas
.
fault_type
=
FAULT_WRITE
(
sc
.
err
);
regs
->
skas
.
trap_type
=
sc
.
trapno
;
err
=
ptrace
(
PTRACE_SETFPREGS
,
userspace_pid
,
0
,
fpregs
);
if
(
err
<
0
){
...
...
@@ -57,7 +57,7 @@ int copy_sc_from_user_skas(struct uml_pt_regs *regs, void *from_ptr)
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
)
{
struct
sigcontext
sc
,
*
to
=
to_ptr
;
...
...
@@ -65,26 +65,26 @@ int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs,
unsigned
long
fpregs
[
FP_FRAME_SIZE
];
int
err
;
sc
.
gs
=
regs
->
mode
.
skas
.
regs
[
GS
];
sc
.
fs
=
regs
->
mode
.
skas
.
regs
[
FS
];
sc
.
es
=
regs
->
mode
.
skas
.
regs
[
ES
];
sc
.
ds
=
regs
->
mode
.
skas
.
regs
[
DS
];
sc
.
edi
=
regs
->
mode
.
skas
.
regs
[
EDI
];
sc
.
esi
=
regs
->
mode
.
skas
.
regs
[
ESI
];
sc
.
ebp
=
regs
->
mode
.
skas
.
regs
[
EBP
];
sc
.
esp
=
regs
->
mode
.
skas
.
regs
[
UESP
];
sc
.
ebx
=
regs
->
mode
.
skas
.
regs
[
EBX
];
sc
.
edx
=
regs
->
mode
.
skas
.
regs
[
EDX
];
sc
.
ecx
=
regs
->
mode
.
skas
.
regs
[
ECX
];
sc
.
eax
=
regs
->
mode
.
skas
.
regs
[
EAX
];
sc
.
eip
=
regs
->
mode
.
skas
.
regs
[
EIP
];
sc
.
cs
=
regs
->
mode
.
skas
.
regs
[
CS
];
sc
.
eflags
=
regs
->
mode
.
skas
.
regs
[
EFL
];
sc
.
esp_at_signal
=
regs
->
mode
.
skas
.
regs
[
UESP
];
sc
.
ss
=
regs
->
mode
.
skas
.
regs
[
SS
];
sc
.
gs
=
regs
->
skas
.
regs
[
GS
];
sc
.
fs
=
regs
->
skas
.
regs
[
FS
];
sc
.
es
=
regs
->
skas
.
regs
[
ES
];
sc
.
ds
=
regs
->
skas
.
regs
[
DS
];
sc
.
edi
=
regs
->
skas
.
regs
[
EDI
];
sc
.
esi
=
regs
->
skas
.
regs
[
ESI
];
sc
.
ebp
=
regs
->
skas
.
regs
[
EBP
];
sc
.
esp
=
regs
->
skas
.
regs
[
UESP
];
sc
.
ebx
=
regs
->
skas
.
regs
[
EBX
];
sc
.
edx
=
regs
->
skas
.
regs
[
EDX
];
sc
.
ecx
=
regs
->
skas
.
regs
[
ECX
];
sc
.
eax
=
regs
->
skas
.
regs
[
EAX
];
sc
.
eip
=
regs
->
skas
.
regs
[
EIP
];
sc
.
cs
=
regs
->
skas
.
regs
[
CS
];
sc
.
eflags
=
regs
->
skas
.
regs
[
EFL
];
sc
.
esp_at_signal
=
regs
->
skas
.
regs
[
UESP
];
sc
.
ss
=
regs
->
skas
.
regs
[
SS
];
sc
.
cr2
=
fault_addr
;
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
);
if
(
err
<
0
){
...
...
@@ -92,7 +92,8 @@ int copy_sc_to_user_skas(void *to_ptr, struct uml_pt_regs *regs,
"errno = %d
\n
"
,
errno
);
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
;
if
(
err
)
...
...
arch/um/kernel/skas/syscall_kern.c
View file @
366fdb90
...
...
@@ -21,7 +21,7 @@ long execute_syscall_skas(void *r)
current
->
thread
.
nsyscalls
++
;
nsyscalls
++
;
syscall
=
regs
->
regs
.
syscall
;
syscall
=
UPT_SYSCALL_NR
(
&
regs
->
regs
)
;
if
((
syscall
>=
NR_syscalls
)
||
(
syscall
<
0
))
res
=
-
ENOSYS
;
...
...
arch/um/kernel/skas/syscall_user.c
View file @
366fdb90
...
...
@@ -15,18 +15,17 @@
#define ERESTARTNOINTR 513
#define ERESTARTNOHAND 514
void
handle_syscall
(
struct
uml_pt_regs
*
regs
)
void
handle_syscall
(
union
uml_pt_regs
*
regs
)
{
long
result
;
int
index
;
host_to_regs
(
regs
);
index
=
record_syscall_start
(
UPT_SYSCALL_NR
(
regs
));
syscall_trace
();
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
)
||
(
result
==
-
ERESTARTNOINTR
))
do_signal
(
result
);
...
...
arch/um/kernel/skas/tlb.c
View file @
366fdb90
...
...
@@ -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
);
}
addr
+=
PAGE_SIZE
;
}
else
{
if
(
pmd_newpage
(
*
pmd
)){
...
...
@@ -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
)
{
if
(
mm
==
NULL
)
flush_tlb_kernel_vm_skas
();
else
fix_range
(
mm
,
0
,
host_task_size
,
0
);
fix_range
(
mm
,
0
,
host_task_size
,
0
);
}
void
force_flush_all_skas
(
void
)
...
...
arch/um/kernel/skas/trap_user.c
View file @
366fdb90
...
...
@@ -13,41 +13,40 @@
#include "task.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
;
int
save_errno
=
errno
;
r
=
(
struct
uml_pt_regs
*
)
TASK_REGS
(
get_current
());
save_regs
=
*
r
;
r
=
&
TASK_REGS
(
get_current
())
->
skas
;
r
->
is_user
=
0
;
r
->
mode
.
skas
.
fault_addr
=
SC_FAULT_ADDR
(
sc
);
r
->
mode
.
skas
.
fault_type
=
SC_FAULT_TYPE
(
sc
);
r
->
mode
.
skas
.
trap_type
=
SC_TRAP_TYPE
(
sc
);
r
->
fault_addr
=
SC_FAULT_ADDR
(
sc
);
r
->
fault_type
=
SC_FAULT_TYPE
(
sc
);
r
->
trap_type
=
SC_TRAP_TYPE
(
sc
);
change_sig
(
SIGUSR1
,
1
);
info
=
&
sig_info
[
sig
];
if
(
!
info
->
is_irq
)
unblock_signals
();
(
*
info
->
handler
)(
sig
,
r
);
(
*
info
->
handler
)(
sig
,
(
union
uml_pt_regs
*
)
r
);
*
r
=
save_regs
;
errno
=
save_errno
;
}
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
;
if
(
sig
==
SIGVTALRM
)
missed_ticks
[
cpu
()]
++
;
regs
->
is_user
=
1
;
regs
->
mode
.
skas
.
fault_addr
=
0
;
regs
->
mode
.
skas
.
fault_type
=
0
;
regs
->
mode
.
skas
.
trap_type
=
0
;
regs
->
skas
.
is_user
=
1
;
regs
->
skas
.
fault_addr
=
0
;
regs
->
skas
.
fault_type
=
0
;
regs
->
skas
.
trap_type
=
0
;
info
=
&
sig_info
[
sig
];
(
*
info
->
handler
)(
sig
,
regs
);
...
...
arch/um/kernel/tempfile.c
View file @
366fdb90
...
...
@@ -23,11 +23,11 @@ static void __init find_tempdir(void)
if
(
tempdir
!=
NULL
)
return
;
/* We've already been called */
for
(
i
=
0
;
dirs
[
i
];
i
++
){
dir
=
getenv
(
dirs
[
i
]);
if
(
dir
!=
NULL
)
break
;
if
((
dir
!=
NULL
)
&&
(
*
dir
!=
'\0'
))
break
;
}
if
(
dir
==
NULL
)
dir
=
"/tmp"
;
else
if
(
*
dir
==
'\0'
)
dir
=
NULL
;
if
(
dir
!=
NULL
)
{
if
((
dir
==
NULL
)
||
(
*
dir
==
'\0'
))
dir
=
"/tmp"
;
tempdir
=
malloc
(
strlen
(
dir
)
+
2
);
if
(
tempdir
==
NULL
){
fprintf
(
stderr
,
"Failed to malloc tempdir, "
...
...
@@ -36,7 +36,6 @@ static void __init find_tempdir(void)
}
strcpy
(
tempdir
,
dir
);
strcat
(
tempdir
,
"/"
);
}
}
int
make_tempfile
(
const
char
*
template
,
char
**
out_tempname
,
int
do_unlink
)
...
...
arch/um/kernel/time.c
View file @
366fdb90
...
...
@@ -86,20 +86,23 @@ struct timeval local_offset = { 0, 0 };
void
do_gettimeofday
(
struct
timeval
*
tv
)
{
time_lock
();
unsigned
long
flags
;
flags
=
time_lock
();
gettimeofday
(
tv
,
NULL
);
timeradd
(
tv
,
&
local_offset
,
tv
);
time_unlock
();
time_unlock
(
flags
);
}
void
do_settimeofday
(
struct
timeval
*
tv
)
{
struct
timeval
now
;
unsigned
long
flags
;
time_lock
();
flags
=
time_lock
();
gettimeofday
(
&
now
,
NULL
);
timersub
(
tv
,
&
now
,
&
local_offset
);
time_unlock
();
time_unlock
(
flags
);
}
void
idle_sleep
(
int
secs
)
...
...
@@ -108,7 +111,7 @@ void idle_sleep(int secs)
ts
.
tv_sec
=
secs
;
ts
.
tv_nsec
=
0
;
nanosleep
(
&
ts
,
&
ts
);
nanosleep
(
&
ts
,
NULL
);
}
/*
...
...
arch/um/kernel/time_kern.c
View file @
366fdb90
...
...
@@ -37,7 +37,7 @@ int timer_irq_inited = 0;
*/
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
];
...
...
@@ -50,7 +50,9 @@ void boot_timer_handler(int sig)
{
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
);
}
...
...
@@ -118,7 +120,7 @@ void __const_udelay(um_udelay_t usecs)
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
update_process_times
(
user_context
(
UPT_SP
(
regs
)));
...
...
@@ -129,14 +131,16 @@ void timer_handler(int sig, struct uml_pt_regs *regs)
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
)
...
...
arch/um/kernel/trap_kern.c
View file @
366fdb90
...
...
@@ -109,7 +109,8 @@ unsigned long segv(unsigned long address, unsigned long ip, int is_write,
flush_tlb_kernel_vm
();
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
);
catcher
=
current
->
thread
.
fault_catcher
;
...
...
@@ -164,14 +165,15 @@ void bad_segv(unsigned long address, unsigned long ip, int is_write)
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
(
!
regs
->
is_user
)
panic
(
"Kernel mode signal %d"
,
sig
);
if
(
!
UPT_IS_USER
(
regs
))
panic
(
"Kernel mode signal %d"
,
sig
);
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
)
do_longjmp
(
current
->
thread
.
fault_catcher
,
1
);
...
...
arch/um/kernel/trap_user.c
View file @
366fdb90
...
...
@@ -48,11 +48,11 @@ struct {
int
is_user
;
}
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
;
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
),
UPT_FAULT_WRITE
(
regs
));
return
;
...
...
@@ -65,35 +65,35 @@ void segv_handler(int sig, struct uml_pt_regs *regs)
segfault_record
[
index
].
pid
=
os_getpid
();
segfault_record
[
index
].
is_write
=
UPT_FAULT_WRITE
(
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
),
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
);
}
struct
signal_info
sig_info
[]
=
{
[
SIGTRAP
]
{
handler
:
relay_signal
,
is_irq
:
0
},
[
SIGFPE
]
{
handler
:
relay_signal
,
is_irq
:
0
},
[
SIGILL
]
{
handler
:
relay_signal
,
is_irq
:
0
},
[
SIGBUS
]
{
handler
:
bus_handler
,
is_irq
:
0
},
[
SIGSEGV
]
{
handler
:
segv_handler
,
is_irq
:
0
},
[
SIGIO
]
{
handler
:
sigio_handler
,
is_irq
:
1
},
[
SIGVTALRM
]
{
handler
:
timer_handler
,
is_irq
:
1
},
[
SIGALRM
]
{
handler
:
timer_handler
,
is_irq
:
1
},
[
SIGUSR2
]
{
handler
:
usr2_handler
,
is_irq
:
0
},
[
SIGTRAP
]
{
.
handler
=
relay_signal
,
.
is_irq
=
0
},
[
SIGFPE
]
{
.
handler
=
relay_signal
,
.
is_irq
=
0
},
[
SIGILL
]
{
.
handler
=
relay_signal
,
.
is_irq
=
0
},
[
SIGBUS
]
{
.
handler
=
bus_handler
,
.
is_irq
=
0
},
[
SIGSEGV
]
{
.
handler
=
segv_handler
,
.
is_irq
=
0
},
[
SIGIO
]
{
.
handler
=
sigio_handler
,
.
is_irq
=
1
},
[
SIGVTALRM
]
{
.
handler
=
timer_handler
,
.
is_irq
=
1
},
[
SIGALRM
]
{
.
handler
=
timer_handler
,
.
is_irq
=
1
},
[
SIGUSR2
]
{
.
handler
=
usr2_handler
,
.
is_irq
=
0
},
};
void
sig_handler
(
int
sig
,
struct
sigcontext
sc
)
...
...
arch/um/kernel/tt/gdb.c
View file @
366fdb90
...
...
@@ -44,7 +44,7 @@ int cont(int pid)
return
(
ptrace
(
PTRACE_CONT
,
pid
,
0
,
0
));
}
#ifdef CONFIG_PT_PROXY
#ifdef
UML_
CONFIG_PT_PROXY
int
debugger_signal
(
int
status
,
pid_t
pid
)
{
...
...
@@ -62,11 +62,11 @@ static void gdb_announce(char *dev_name, int dev)
}
static
struct
chan_opts
opts
=
{
announce
:
gdb_announce
,
xterm_title
:
"UML kernel debugger"
,
raw
:
0
,
tramp_stack
:
0
,
in_kernel
:
0
,
.
announce
=
gdb_announce
,
.
xterm_title
=
"UML kernel debugger"
,
.
raw
=
0
,
.
tramp_stack
=
0
,
.
in_kernel
=
0
,
};
/* Accessed by the tracing thread, which automatically serializes access */
...
...
@@ -74,16 +74,16 @@ static void *xterm_data;
static
int
xterm_fd
;
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
*
);
int
open_gdb_chan
(
void
)
{
char
stack
[
UM_KERN_PAGE_SIZE
];
char
stack
[
UM_KERN_PAGE_SIZE
]
,
*
dummy
;
opts
.
tramp_stack
=
(
unsigned
long
)
stack
;
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
);
}
...
...
arch/um/kernel/tt/gdb_kern.c
View file @
366fdb90
...
...
@@ -13,9 +13,9 @@ extern int gdb_config(char *str);
extern
int
gdb_remove
(
char
*
unused
);
static
struct
mc_device
gdb_mc
=
{
name:
"gdb"
,
config:
gdb_config
,
remove:
gdb_remove
,
.
name
=
"gdb"
,
.
config
=
gdb_config
,
.
remove
=
gdb_remove
,
};
int
gdb_mc_init
(
void
)
...
...
arch/um/kernel/tt/include/mode.h
View file @
366fdb90
...
...
@@ -13,9 +13,10 @@ extern int tracing_pid;
extern
int
tracer
(
int
(
*
init_proc
)(
void
*
),
void
*
sp
);
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_to_user_tt
(
void
*
to_ptr
,
void
*
from_ptr
,
void
*
data
);
extern
void
sig_handler_common_tt
(
int
sig
,
struct
sigcontext
*
sc
);
extern
void
syscall_handler_tt
(
int
sig
,
struct
uml_pt_regs
*
regs
);
extern
int
copy_sc_to_user_tt
(
void
*
to_ptr
,
void
*
fp
,
void
*
from_ptr
,
void
*
data
);
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
halt_tt
(
void
);
extern
int
is_tracer_winch
(
int
pid
,
int
fd
,
void
*
data
);
...
...
arch/um/kernel/tt/include/mode_kern.h
View file @
366fdb90
...
...
@@ -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
,
unsigned
long
*
task_size_out
);
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
thread_pid_tt
(
struct
task_struct
*
task
);
...
...
arch/um/kernel/tt/include/ptrace-tt.h
View file @
366fdb90
...
...
@@ -8,7 +8,7 @@
#include "uml-config.h"
#ifdef CONFIG_MODE_TT
#ifdef
UML_
CONFIG_MODE_TT
#include "sysdep/sc.h"
#endif
...
...
arch/um/kernel/tt/include/tt.h
View file @
366fdb90
...
...
@@ -26,10 +26,11 @@ extern void set_tracing(void *t, int tracing);
extern
int
is_tracing
(
void
*
task
);
extern
int
singlestepping_tt
(
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
int
do_syscall
(
void
*
task
,
int
pid
);
extern
int
is_valid_pid
(
int
pid
);
extern
void
remap_data
(
void
*
segment_start
,
void
*
segment_end
,
int
w
);
#endif
...
...
arch/um/kernel/tt/include/uaccess.h
View file @
366fdb90
...
...
@@ -12,6 +12,7 @@
#include "asm/errno.h"
#include "asm/current.h"
#include "asm/a.out.h"
#include "uml_uaccess.h"
#define ABOVE_KMEM (16 * 1024 * 1024)
...
...
@@ -51,9 +52,6 @@ static inline int copy_from_user_tt(void *to, const void *from, int 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
)
{
return
(
access_ok_tt
(
VERIFY_WRITE
,
to
,
n
)
?
...
...
arch/um/kernel/tt/mem.c
View file @
366fdb90
...
...
@@ -39,32 +39,6 @@ unsigned long set_task_sizes_tt(int arg, unsigned long *host_size_out,
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.
* Emacs will notice this stuff at the end of the file and automatically
...
...
arch/um/kernel/tt/mem_user.c
View file @
366fdb90
...
...
@@ -26,7 +26,7 @@ void remap_data(void *segment_start, void *segment_end, int w)
(
unsigned
long
)
segment_start
;
data
=
create_mem_file
(
size
);
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"
);
exit
(
1
);
}
...
...
arch/um/kernel/tt/process_kern.c
View file @
366fdb90
...
...
@@ -6,6 +6,7 @@
#include "linux/sched.h"
#include "linux/signal.h"
#include "linux/kernel.h"
#include "linux/interrupt.h"
#include "asm/system.h"
#include "asm/pgalloc.h"
#include "asm/ptrace.h"
...
...
@@ -111,7 +112,7 @@ void exit_thread_tt(void)
close
(
current
->
thread
.
mode
.
tt
.
switch_pipe
[
1
]);
}
extern
void
schedule_tail
(
struct
task_struc
t
*
prev
);
void
schedule_tail
(
task_
t
*
prev
);
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
;
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
]);
block_signals
();
init_new_thread_signals
(
1
);
#ifdef CONFIG_SMP
schedule_tail
(
NULL
);
schedule_tail
(
current
->
thread
.
prev_sched
);
#endif
enable_timer
();
free_page
(
current
->
thread
.
temp_stack
);
...
...
@@ -160,7 +161,7 @@ static int new_thread_proc(void *stack)
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
]);
#ifdef CONFIG_SMP
...
...
@@ -168,6 +169,7 @@ void finish_fork_handler(int sig)
#endif
enable_timer
();
change_sig
(
SIGVTALRM
,
1
);
local_irq_enable
();
force_flush_all
();
if
(
current
->
mm
!=
current
->
parent
->
mm
)
protect_memory
(
uml_reserved
,
high_physmem
-
uml_reserved
,
1
,
...
...
@@ -187,6 +189,7 @@ int fork_tramp(void *stack)
{
int
sig
=
sigusr1
;
local_irq_disable
();
init_new_thread_stack
(
stack
,
finish_fork_handler
);
kill
(
os_getpid
(),
sig
);
...
...
@@ -232,10 +235,10 @@ int copy_thread_tt(int nr, unsigned long clone_flags, unsigned long sp,
}
if
(
current
->
thread
.
forking
){
sc_to_sc
(
p
->
thread
.
regs
.
regs
.
mode
.
tt
,
current
->
thread
.
regs
.
regs
.
mode
.
tt
);
SC_SET_SYSCALL_RETURN
(
p
->
thread
.
regs
.
regs
.
mode
.
tt
,
0
);
if
(
sp
!=
0
)
SC_SP
(
p
->
thread
.
regs
.
regs
.
mode
.
tt
)
=
sp
;
sc_to_sc
(
UPT_SC
(
&
p
->
thread
.
regs
.
regs
)
,
UPT_SC
(
&
current
->
thread
.
regs
.
regs
)
);
SC_SET_SYSCALL_RETURN
(
UPT_SC
(
&
p
->
thread
.
regs
.
regs
)
,
0
);
if
(
sp
!=
0
)
SC_SP
(
UPT_SC
(
&
p
->
thread
.
regs
.
regs
)
)
=
sp
;
}
p
->
thread
.
mode
.
tt
.
extern_pid
=
new_pid
;
...
...
arch/um/kernel/tt/ptproxy/proxy.c
View file @
366fdb90
...
...
@@ -129,14 +129,14 @@ static int parent_syscall(debugger_state *debugger, int pid);
int
init_parent_proxy
(
int
pid
)
{
parent
=
((
debugger_state
)
{
pid
:
pid
,
wait_options
:
0
,
wait_status_ptr
:
NULL
,
waiting
:
0
,
real_wait
:
0
,
expecting_child
:
0
,
handle_trace
:
parent_syscall
,
debugee
:
NULL
}
);
parent
=
((
debugger_state
)
{
.
pid
=
pid
,
.
wait_options
=
0
,
.
wait_status_ptr
=
NULL
,
.
waiting
=
0
,
.
real_wait
=
0
,
.
expecting_child
=
0
,
.
handle_trace
=
parent_syscall
,
.
debugee
=
NULL
}
);
return
(
0
);
}
...
...
arch/um/kernel/tt/sys-i386/sigcontext.c
View file @
366fdb90
...
...
@@ -29,14 +29,15 @@ int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data)
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
*
f
p
,
void
*
f
rom_ptr
,
void
*
data
)
{
struct
arch_frame_data
*
arch
=
data
;
struct
sigcontext
*
to
=
to_ptr
,
*
from
=
from_ptr
;
struct
_fpstate
*
to_fp
,
*
from_fp
;
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
;
err
=
copy_to_user_proc
(
to
,
from
,
sizeof
(
*
to
));
if
(
from_fp
!=
NULL
){
...
...
arch/um/kernel/tt/syscall_kern.c
View file @
366fdb90
...
...
@@ -20,29 +20,32 @@ static inline int check_area(void *ptr, int size)
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
)
{
return
(
check_area
((
void
*
)
regs
->
regs
.
args
[
1
]
,
return
(
check_area
((
void
*
)
UPT_SYSCALL_ARG1
(
&
regs
->
regs
)
,
sizeof
(
struct
utimbuf
)));
}
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
)));
}
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
)
{
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
{
...
...
@@ -90,7 +93,7 @@ struct bogus this_is_bogus[256] = {
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
->
check_params
&&
(
*
bogon
->
check_params
)(
regs
))
...
...
@@ -109,7 +112,7 @@ long execute_syscall_tt(void *r)
current
->
thread
.
nsyscalls
++
;
nsyscalls
++
;
syscall
=
regs
->
regs
.
syscall
;
syscall
=
UPT_SYSCALL_NR
(
&
regs
->
regs
)
;
if
((
syscall
>=
NR_syscalls
)
||
(
syscall
<
0
))
res
=
-
ENOSYS
;
...
...
arch/um/kernel/tt/syscall_user.c
View file @
366fdb90
...
...
@@ -22,15 +22,14 @@
#define ERESTARTNOINTR 513
#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
;
long
result
;
int
index
,
syscall
;
syscall
=
regs
->
syscall
;
sc
=
regs
->
mode
.
tt
;
sc_to_regs
(
regs
,
sc
,
syscall
);
syscall
=
UPT_SYSCALL_NR
(
regs
);
sc
=
UPT_SC
(
regs
);
SC_START_SYSCALL
(
sc
);
index
=
record_syscall_start
(
syscall
);
...
...
@@ -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
* 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
);
if
((
result
==
-
ERESTARTNOHAND
)
||
(
result
==
-
ERESTARTSYS
)
||
...
...
@@ -54,7 +53,7 @@ void syscall_handler_tt(int sig, struct uml_pt_regs *regs)
int
do_syscall
(
void
*
task
,
int
pid
)
{
unsigned
long
proc_regs
[
FRAME_SIZE
];
struct
uml_pt_regs
*
regs
;
union
uml_pt_regs
*
regs
;
int
syscall
;
if
(
ptrace_getregs
(
pid
,
proc_regs
)
<
0
)
...
...
arch/um/kernel/tt/trap_user.c
View file @
366fdb90
...
...
@@ -14,26 +14,27 @@
#include "task.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
;
int
save_errno
=
errno
,
is_user
;
unprotect_kernel_mem
();
r
=
(
struct
uml_pt_regs
*
)
TASK_REGS
(
get_current
())
;
r
=
&
TASK_REGS
(
get_current
())
->
tt
;
save_regs
=
*
r
;
is_user
=
user_context
(
SC_SP
(
sc
));
r
->
is_user
=
is_user
;
r
->
mode
.
tt
=
sc
;
if
(
sig
!=
SIGUSR2
)
r
->
syscall
=
-
1
;
r
->
sc
=
sc
;
if
(
sig
!=
SIGUSR2
)
r
->
syscall
=
-
1
;
change_sig
(
SIGUSR1
,
1
);
info
=
&
sig_info
[
sig
];
if
(
!
info
->
is_irq
)
unblock_signals
();
(
*
info
->
handler
)(
sig
,
r
);
(
*
info
->
handler
)(
sig
,
(
union
uml_pt_regs
*
)
r
);
if
(
is_user
){
interrupt_end
();
...
...
arch/um/kernel/tt/uaccess_user.c
View file @
366fdb90
...
...
@@ -7,34 +7,7 @@
#include <setjmp.h>
#include <string.h>
#include "user_util.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
);
}
#include "uml_uaccess.h"
int
__do_copy_from_user
(
void
*
to
,
const
void
*
from
,
int
n
,
void
**
fault_addr
,
void
**
fault_catcher
)
...
...
@@ -48,19 +21,6 @@ int __do_copy_from_user(void *to, const void *from, int n,
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
)
{
strncpy
(
dst
,
src
,
count
);
...
...
arch/um/kernel/uaccess_user.c
0 → 100644
View file @
366fdb90
/*
* 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:
*/
arch/um/kernel/um_arch.c
View file @
366fdb90
...
...
@@ -85,10 +85,10 @@ static void c_stop(struct seq_file *m, void *v)
}
struct
seq_operations
cpuinfo_op
=
{
start:
c_start
,
next:
c_next
,
stop:
c_stop
,
show:
show_cpuinfo
,
.
start
=
c_start
,
.
next
=
c_next
,
.
stop
=
c_stop
,
.
show
=
show_cpuinfo
,
};
pte_t
*
__bad_pagetable
(
void
)
...
...
@@ -317,6 +317,11 @@ int linux_main(int argc, char **argv)
if
(
physmem_size
>
max_physmem
){
highmem
=
physmem_size
-
max_physmem
;
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
;
...
...
@@ -361,9 +366,9 @@ static int panic_exit(struct notifier_block *self, unsigned long unused1,
}
static
struct
notifier_block
panic_exit_notifier
=
{
notifier_call
:
panic_exit
,
next
:
NULL
,
priority
:
0
.
notifier_call
=
panic_exit
,
.
next
=
NULL
,
.
priority
=
0
};
void
__init
setup_arch
(
char
**
cmdline_p
)
...
...
arch/um/kernel/umid.c
View file @
366fdb90
...
...
@@ -35,7 +35,7 @@ static int umid_inited = 0;
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
){
printk
(
"Unique machine name can't be set twice
\n
"
);
...
...
@@ -48,12 +48,17 @@ static int __init set_umid(char *name, int *add)
strncpy
(
umid
,
name
,
UMID_LEN
-
1
);
umid
[
UMID_LEN
-
1
]
=
'\0'
;
umid_is_random
=
0
;
umid_is_random
=
is_random
;
umid_inited
=
1
;
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
"
" 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
"
...
...
@@ -186,7 +191,6 @@ int not_dead_yet(char *dir)
}
if
(
!
dead
)
return
(
1
);
return
(
actually_do_remove
(
dir
));
return
(
0
);
}
static
int
__init
set_uml_dir
(
char
*
name
,
int
*
add
)
...
...
@@ -254,7 +258,7 @@ static int __init make_umid(void)
strcat
(
tmp
,
"XXXXXX"
);
fd
=
mkstemp
(
tmp
);
if
(
fd
<
0
){
printk
(
"
set
_umid - mkstemp failed, errno = %d
\n
"
,
printk
(
"
make
_umid - mkstemp failed, errno = %d
\n
"
,
errno
);
return
(
1
);
}
...
...
@@ -265,7 +269,7 @@ static int __init make_umid(void)
* for directories.
*/
unlink
(
tmp
);
s
trcpy
(
umid
,
&
tmp
[
strlen
(
uml_dir
)]
);
s
et_umid
(
&
tmp
[
strlen
(
uml_dir
)],
1
);
}
sprintf
(
tmp
,
"%s%s"
,
uml_dir
,
umid
);
...
...
arch/um/kernel/user_syms.c
View file @
366fdb90
...
...
@@ -10,10 +10,7 @@
#include <sys/ioctl.h>
#include "user_util.h"
#include "mem_user.h"
/* XXX All the __CONFIG_* stuff is broken because this file can't include
* config.h
*/
#include "uml-config.h"
/* Had to steal this from linux/module.h because that file can't be included
* since this includes various user-level headers.
...
...
@@ -36,7 +33,7 @@ struct module_symbol
#define EXPORT_SYMBOL(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(var)
...
...
@@ -51,7 +48,7 @@ const struct module_symbol __ksymtab_##sym \
__attribute__((section("__ksymtab"))) = \
{ (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))
#else
#define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(__VERSIONED_SYMBOL(var)))
...
...
arch/um/os-Linux/drivers/ethertap_kern.c
View file @
366fdb90
...
...
@@ -28,11 +28,11 @@ static void etap_init(struct net_device *dev, void *data)
pri
=
dev
->
priv
;
epri
=
(
struct
ethertap_data
*
)
pri
->
user
;
*
epri
=
((
struct
ethertap_data
)
{
dev_name
:
init
->
dev_name
,
gate_addr
:
init
->
gate_addr
,
data_fd
:
-
1
,
control_fd
:
-
1
,
dev
:
dev
});
{
.
dev_name
=
init
->
dev_name
,
.
gate_addr
=
init
->
gate_addr
,
.
data_fd
=
-
1
,
.
control_fd
=
-
1
,
.
dev
=
dev
});
printk
(
"ethertap backend - %s"
,
epri
->
dev_name
);
if
(
epri
->
gate_addr
!=
NULL
)
...
...
@@ -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
=
{
init:
etap_init
,
protocol:
eth_protocol
,
read:
etap_read
,
write:
etap_write
,
.
init
=
etap_init
,
.
protocol
=
eth_protocol
,
.
read
=
etap_read
,
.
write
=
etap_write
,
};
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
;
*
init
=
((
struct
ethertap_init
)
{
dev_name
:
NULL
,
gate_addr
:
NULL
});
{
.
dev_name
=
NULL
,
.
gate_addr
=
NULL
});
if
(
tap_setup_common
(
str
,
"ethertap"
,
&
init
->
dev_name
,
mac_out
,
&
init
->
gate_addr
))
return
(
0
);
...
...
@@ -94,12 +94,12 @@ int ethertap_setup(char *str, char **mac_out, void *data)
}
static
struct
transport
ethertap_transport
=
{
list
:
LIST_HEAD_INIT
(
ethertap_transport
.
list
),
name
:
"ethertap"
,
setup
:
ethertap_setup
,
user
:
&
ethertap_user_info
,
kern
:
&
ethertap_kern_info
,
private_size
:
sizeof
(
struct
ethertap_data
),
.
list
=
LIST_HEAD_INIT
(
ethertap_transport
.
list
),
.
name
=
"ethertap"
,
.
setup
=
ethertap_setup
,
.
user
=
&
ethertap_user_info
,
.
kern
=
&
ethertap_kern_info
,
.
private_size
=
sizeof
(
struct
ethertap_data
),
};
static
int
register_ethertap
(
void
)
...
...
arch/um/os-Linux/drivers/ethertap_user.c
View file @
366fdb90
...
...
@@ -216,14 +216,14 @@ static void etap_del_addr(unsigned char *addr, unsigned char *netmask,
}
struct
net_user_info
ethertap_user_info
=
{
init:
etap_user_init
,
open:
etap_open
,
close:
etap_close
,
remove:
NULL
,
set_mtu:
etap_set_mtu
,
add_address:
etap_add_addr
,
delete_address:
etap_del_addr
,
max_packet:
MAX_PACKET
-
ETH_HEADER_ETHERTAP
.
init
=
etap_user_init
,
.
open
=
etap_open
,
.
close
=
etap_close
,
.
remove
=
NULL
,
.
set_mtu
=
etap_set_mtu
,
.
add_address
=
etap_add_addr
,
.
delete_address
=
etap_del_addr
,
.
max_packet
=
MAX_PACKET
-
ETH_HEADER_ETHERTAP
};
/*
...
...
arch/um/os-Linux/drivers/tuntap_kern.c
View file @
366fdb90
...
...
@@ -28,11 +28,11 @@ static void tuntap_init(struct net_device *dev, void *data)
pri
=
dev
->
priv
;
tpri
=
(
struct
tuntap_data
*
)
pri
->
user
;
*
tpri
=
((
struct
tuntap_data
)
{
dev_name
:
init
->
dev_name
,
fixed_config
:
(
init
->
dev_name
!=
NULL
),
gate_addr
:
init
->
gate_addr
,
fd
:
-
1
,
dev
:
dev
});
{
.
dev_name
=
init
->
dev_name
,
.
fixed_config
=
(
init
->
dev_name
!=
NULL
),
.
gate_addr
=
init
->
gate_addr
,
.
fd
=
-
1
,
.
dev
=
dev
});
printk
(
"TUN/TAP backend - "
);
if
(
tpri
->
gate_addr
!=
NULL
)
printk
(
"IP = %s"
,
tpri
->
gate_addr
);
...
...
@@ -55,10 +55,10 @@ static int tuntap_write(int fd, struct sk_buff **skb,
}
struct
net_kern_info
tuntap_kern_info
=
{
init:
tuntap_init
,
protocol:
eth_protocol
,
read:
tuntap_read
,
write:
tuntap_write
,
.
init
=
tuntap_init
,
.
protocol
=
eth_protocol
,
.
read
=
tuntap_read
,
.
write
=
tuntap_write
,
};
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
;
*
init
=
((
struct
tuntap_init
)
{
dev_name
:
NULL
,
gate_addr
:
NULL
});
{
.
dev_name
=
NULL
,
.
gate_addr
=
NULL
});
if
(
tap_setup_common
(
str
,
"tuntap"
,
&
init
->
dev_name
,
mac_out
,
&
init
->
gate_addr
))
return
(
0
);
...
...
@@ -76,13 +76,13 @@ int tuntap_setup(char *str, char **mac_out, void *data)
}
static
struct
transport
tuntap_transport
=
{
list
:
LIST_HEAD_INIT
(
tuntap_transport
.
list
),
name
:
"tuntap"
,
setup
:
tuntap_setup
,
user
:
&
tuntap_user_info
,
kern
:
&
tuntap_kern_info
,
private_size
:
sizeof
(
struct
tuntap_data
),
setup_size
:
sizeof
(
struct
tuntap_init
),
.
list
=
LIST_HEAD_INIT
(
tuntap_transport
.
list
),
.
name
=
"tuntap"
,
.
setup
=
tuntap_setup
,
.
user
=
&
tuntap_user_info
,
.
kern
=
&
tuntap_kern_info
,
.
private_size
=
sizeof
(
struct
tuntap_data
),
.
setup_size
=
sizeof
(
struct
tuntap_init
),
};
static
int
register_tuntap
(
void
)
...
...
arch/um/os-Linux/drivers/tuntap_user.c
View file @
366fdb90
...
...
@@ -201,14 +201,14 @@ static int tuntap_set_mtu(int mtu, void *data)
}
struct
net_user_info
tuntap_user_info
=
{
init:
tuntap_user_init
,
open:
tuntap_open
,
close:
tuntap_close
,
remove:
NULL
,
set_mtu:
tuntap_set_mtu
,
add_address:
tuntap_add_addr
,
delete_address:
tuntap_del_addr
,
max_packet:
MAX_PACKET
.
init
=
tuntap_user_init
,
.
open
=
tuntap_open
,
.
close
=
tuntap_close
,
.
remove
=
NULL
,
.
set_mtu
=
tuntap_set_mtu
,
.
add_address
=
tuntap_add_addr
,
.
delete_address
=
tuntap_del_addr
,
.
max_packet
=
MAX_PACKET
};
/*
...
...
arch/um/os-Linux/file.c
View file @
366fdb90
...
...
@@ -28,8 +28,8 @@ int os_file_type(char *file)
else
if
(
S_ISLNK
(
buf
.
st_mode
))
return
(
OS_TYPE_SYMLINK
);
else
if
(
S_ISCHR
(
buf
.
st_mode
))
return
(
OS_TYPE_CHARDEV
);
else
if
(
S_ISBLK
(
buf
.
st_mode
))
return
(
OS_TYPE_BLOCKDEV
);
else
if
(
S_ISFIFO
(
buf
.
st_mode
))
return
(
OS_TYPE_FIFO
);
else
if
(
S_ISSOCK
(
buf
.
st_mode
))
return
(
OS_TYPE_SOCK
);
else
if
(
S_ISFIFO
(
buf
.
st_mode
))
return
(
OS_TYPE_FIFO
);
else
if
(
S_ISSOCK
(
buf
.
st_mode
))
return
(
OS_TYPE_SOCK
);
else
return
(
OS_TYPE_FILE
);
}
...
...
@@ -64,6 +64,15 @@ int os_open_file(char *file, struct openflags flags, int mode)
fd
=
open64
(
file
,
f
,
mode
);
if
(
fd
<
0
)
return
(
-
errno
);
if
(
flags
.
cl
){
if
(
fcntl
(
fd
,
F_SETFD
,
1
)){
close
(
fd
);
return
(
-
errno
);
}
}
return
(
fd
);
return
(
fd
);
}
...
...
@@ -100,7 +109,7 @@ int os_seek_file(int fd, __u64 offset)
return
(
0
);
}
int
os_read_file
(
int
fd
,
char
*
buf
,
int
len
)
int
os_read_file
(
int
fd
,
void
*
buf
,
int
len
)
{
int
n
;
...
...
@@ -118,7 +127,7 @@ int os_read_file(int fd, char *buf, int len)
return
(
n
);
}
int
os_write_file
(
int
fd
,
char
*
buf
,
int
count
)
int
os_write_file
(
int
fd
,
void
*
buf
,
int
count
)
{
int
n
;
...
...
@@ -276,8 +285,8 @@ int os_rcv_fd(int fd, int *helper_pid_out)
msg
.
msg_name
=
NULL
;
msg
.
msg_namelen
=
0
;
iov
=
((
struct
iovec
)
{
iov_base
:
helper_pid_out
,
iov_len
:
sizeof
(
*
helper_pid_out
)
});
iov
=
((
struct
iovec
)
{
.
iov_base
=
helper_pid_out
,
.
iov_len
=
sizeof
(
*
helper_pid_out
)
});
msg
.
msg_iov
=
&
iov
;
msg
.
msg_iovlen
=
1
;
msg
.
msg_control
=
buf
;
...
...
arch/um/os-Linux/process.c
View file @
366fdb90
...
...
@@ -106,7 +106,7 @@ int os_map_memory(void *virt, int fd, unsigned long off, unsigned long len,
loc
=
mmap
((
void
*
)
virt
,
len
,
prot
,
MAP_SHARED
|
MAP_FIXED
,
fd
,
off
);
if
(
loc
<
0
)
if
(
loc
==
MAP_FAILED
)
return
(
-
errno
);
return
(
0
);
}
...
...
arch/um/sys-i386/Makefile
View file @
366fdb90
...
...
@@ -9,6 +9,7 @@ USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o
USER_OBJS
:=
$(
foreach
file,
$(USER_OBJS)
,
$(obj)
/
$(file)
)
SYMLINKS
=
semaphore.c highmem.c module.c
SYMLINKS
:=
$(
foreach
f,
$(SYMLINKS)
,
$(src)
/
$f
)
semaphore.c-dir
=
kernel
highmem.c-dir
=
mm
...
...
@@ -22,7 +23,7 @@ endef
$(USER_OBJS)
:
%.o: %.c
$(CC)
$
(
CFLAGS_
$(
notdir
$@
)
)
$(USER_CFLAGS)
-c
-o
$@
$<
$(
foreach f,$(SYMLINKS),$(src)/$f
)
:
$(
SYMLINKS
)
:
$(
call
make_link,
$@
)
clean
:
...
...
arch/um/sys-i386/bugs.c
View file @
366fdb90
...
...
@@ -117,7 +117,7 @@ void arch_check_bugs(void)
if
(
check_cpu_feature
(
"xmm"
,
&
have_it
))
cpu_has_xmm
=
have_it
;
}
int
arch_handle_signal
(
int
sig
,
struct
uml_pt_regs
*
regs
)
int
arch_handle_signal
(
int
sig
,
union
uml_pt_regs
*
regs
)
{
unsigned
long
ip
;
...
...
arch/um/sys-i386/sigcontext.c
View file @
366fdb90
...
...
@@ -21,7 +21,7 @@ int sc_size(void *data)
void
sc_to_sc
(
void
*
to_ptr
,
void
*
from_ptr
)
{
struct
sigcontext
*
to
=
to_ptr
,
*
from
=
from_ptr
;
int
size
=
sizeof
(
*
to
)
+
signal_frame_sc
.
arch
.
fpstate_size
;
int
size
=
sizeof
(
*
to
)
+
signal_frame_sc
.
common
.
arch
.
fpstate_size
;
memcpy
(
to
,
from
,
size
);
if
(
from
->
fpstate
!=
NULL
)
to
->
fpstate
=
(
struct
_fpstate
*
)
(
to
+
1
);
...
...
arch/um/util/mk_task_kern.c
View file @
366fdb90
...
...
@@ -9,7 +9,7 @@ extern void print_tail(void);
int
main
(
int
argc
,
char
**
argv
)
{
print_head
();
print_ptr
(
"TASK_REGS"
,
"
struct
uml_pt_regs"
,
print_ptr
(
"TASK_REGS"
,
"
union
uml_pt_regs"
,
offsetof
(
struct
task_struct
,
thread
.
regs
));
print
(
"TASK_PID"
,
"int"
,
offsetof
(
struct
task_struct
,
pid
));
print_tail
();
...
...
include/asm-um/archparam-i386.h
View file @
366fdb90
...
...
@@ -48,7 +48,7 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
/* fake once used fs and gs selectors? */
\
pr_reg[9] = PT_REGS_DS(regs); \
pr_reg[10] = PT_REGS_DS(regs); \
pr_reg[11] =
regs->regs.syscall
; \
pr_reg[11] =
PT_REGS_SYSCALL_NR(regs)
; \
pr_reg[12] = PT_REGS_IP(regs); \
pr_reg[13] = PT_REGS_CS(regs); \
pr_reg[14] = PT_REGS_EFLAGS(regs); \
...
...
include/asm-um/pgtable.h
View file @
366fdb90
...
...
@@ -14,6 +14,9 @@
extern
pgd_t
swapper_pg_dir
[
1024
];
extern
void
*
um_virt_to_phys
(
struct
task_struct
*
task
,
unsigned
long
virt
,
pte_t
*
pte_out
);
/* zero page used for uninitialized stuff */
extern
unsigned
long
*
empty_zero_page
;
...
...
include/asm-um/processor-i386.h
View file @
366fdb90
...
...
@@ -14,8 +14,8 @@ struct arch_thread {
int
debugregs_seq
;
};
#define INIT_ARCH_THREAD {
debugregs :
{ [ 0 ... 7 ] = 0 }, \
debugregs_seq :
0 }
#define INIT_ARCH_THREAD {
.debugregs =
{ [ 0 ... 7 ] = 0 }, \
.debugregs_seq =
0 }
#include "asm/arch/user.h"
...
...
include/asm-um/ptrace-generic.h
View file @
366fdb90
...
...
@@ -9,7 +9,7 @@
#ifndef __ASSEMBLY__
#include "linux/config.h"
#include "skas_ptrace.h"
#include "asm/current.h"
#define pt_regs pt_regs_subarch
...
...
@@ -23,9 +23,10 @@
#undef instruction_pointer
#include "sysdep/ptrace.h"
#include "skas_ptrace.h"
struct
pt_regs
{
struct
uml_pt_regs
regs
;
union
uml_pt_regs
regs
;
};
#define EMPTY_REGS { regs : EMPTY_UML_PT_REGS }
...
...
include/asm-um/ptrace-i386.h
View file @
366fdb90
...
...
@@ -6,6 +6,7 @@
#ifndef __UM_PTRACE_I386_H
#define __UM_PTRACE_I386_H
#include "sysdep/ptrace.h"
#include "asm/ptrace-generic.h"
#define PT_REGS_EAX(r) UPT_EAX(&(r)->regs)
...
...
@@ -29,7 +30,7 @@
#define PT_REGS_SYSCALL_RET(r) PT_REGS_EAX(r)
#define PT_FIX_EXEC_STACK(sp) do ; while(0)
#define user_mode(r)
((r)->regs.is_user
)
#define user_mode(r)
UPT_IS_USER(&(r)->regs
)
#endif
...
...
include/asm-um/ucontext.h
0 → 100644
View file @
366fdb90
#ifndef _ASM_UM_UCONTEXT_H
#define _ASM_UM_UCONTEXT_H
#include "asm/arch/ucontext.h"
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment