aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-27 21:29:53 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-27 21:29:53 -0400
commitfa453a625de5b8ee9ada0a5b329df3f88751c615 (patch)
tree7a9e04d4a44bb929e96bd9bebb7b97cb733d1ecb /arch/um
parent30eebb54b13ef198a3f1a143ee9dd68f295c60de (diff)
parent3463ff4439661d8107ac024329b5fe01d6e5117b (diff)
Merge branch 'for-linus-3.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
Pull UML changes from Richard Weinberger: "Mostly bug fixes and cleanups" * 'for-linus-3.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml: (35 commits) um: Update defconfig um: Switch to large mcmodel on x86_64 MTD: Relax dependencies um: Wire CONFIG_GENERIC_IO up um: Serve io_remap_pfn_range() Introduce CONFIG_GENERIC_IO um: allow SUBARCH=x86 um: most of the SUBARCH uses can be killed um: deadlock in line_write_interrupt() um: don't bother trying to rebuild CHECKFLAGS for USER_OBJS um: use the right ifdef around exports in user_syms.c um: a bunch of headers can be killed by using generic-y um: ptrace-generic.h doesn't need user.h um: kill HOST_TASK_PID um: remove pointless include of asm/fixmap.h from asm/pgtable.h um: asm-offsets.h might as well come from underlying arch... um: merge processor_{32,64}.h a bit... um: switch close_chan() to struct line um: race fix: initialize delayed_work *before* registering IRQ um: line->have_irq is never checked... ...
Diffstat (limited to 'arch/um')
-rw-r--r--arch/um/Kconfig.common1
-rw-r--r--arch/um/Makefile5
-rw-r--r--arch/um/defconfig655
-rw-r--r--arch/um/drivers/chan.h18
-rw-r--r--arch/um/drivers/chan_kern.c198
-rw-r--r--arch/um/drivers/chan_user.h2
-rw-r--r--arch/um/drivers/line.c258
-rw-r--r--arch/um/drivers/line.h29
-rw-r--r--arch/um/drivers/mconsole_kern.c2
-rw-r--r--arch/um/drivers/net_kern.c2
-rw-r--r--arch/um/drivers/port_kern.c4
-rw-r--r--arch/um/drivers/random.c2
-rw-r--r--arch/um/drivers/ssl.c41
-rw-r--r--arch/um/drivers/stdio_console.c46
-rw-r--r--arch/um/drivers/ubd.h (renamed from arch/um/drivers/ubd_user.h)0
-rw-r--r--arch/um/drivers/ubd_kern.c46
-rw-r--r--arch/um/drivers/ubd_user.c8
-rw-r--r--arch/um/drivers/xterm_kern.c2
-rw-r--r--arch/um/include/asm/Kbuild2
-rw-r--r--arch/um/include/asm/asm-offsets.h1
-rw-r--r--arch/um/include/asm/auxvec.h4
-rw-r--r--arch/um/include/asm/current.h13
-rw-r--r--arch/um/include/asm/delay.h18
-rw-r--r--arch/um/include/asm/io.h57
-rw-r--r--arch/um/include/asm/mutex.h9
-rw-r--r--arch/um/include/asm/param.h20
-rw-r--r--arch/um/include/asm/pci.h6
-rw-r--r--arch/um/include/asm/pgalloc.h3
-rw-r--r--arch/um/include/asm/pgtable.h2
-rw-r--r--arch/um/include/asm/ptrace-generic.h1
-rw-r--r--arch/um/include/shared/common-offsets.h2
-rw-r--r--arch/um/include/shared/kern_util.h2
-rw-r--r--arch/um/kernel/Makefile2
-rw-r--r--arch/um/kernel/process.c4
-rw-r--r--arch/um/kernel/sigio.c2
-rw-r--r--arch/um/kernel/time.c2
-rw-r--r--arch/um/os-Linux/Makefile2
-rw-r--r--arch/um/os-Linux/user_syms.c2
-rw-r--r--arch/um/scripts/Makefile.rules7
39 files changed, 781 insertions, 699 deletions
diff --git a/arch/um/Kconfig.common b/arch/um/Kconfig.common
index b37ae706af3e..20a49ba93cb9 100644
--- a/arch/um/Kconfig.common
+++ b/arch/um/Kconfig.common
@@ -9,6 +9,7 @@ config UML
9 select HAVE_GENERIC_HARDIRQS 9 select HAVE_GENERIC_HARDIRQS
10 select GENERIC_IRQ_SHOW 10 select GENERIC_IRQ_SHOW
11 select GENERIC_CPU_DEVICES 11 select GENERIC_CPU_DEVICES
12 select GENERIC_IO
12 13
13config MMU 14config MMU
14 bool 15 bool
diff --git a/arch/um/Makefile b/arch/um/Makefile
index 28688e6d96d7..55c0661e2b5d 100644
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -28,6 +28,7 @@ ifeq ($(SUBARCH),i386)
28endif 28endif
29ifeq ($(SUBARCH),x86_64) 29ifeq ($(SUBARCH),x86_64)
30 HEADER_ARCH := x86 30 HEADER_ARCH := x86
31 KBUILD_CFLAGS += -mcmodel=large
31endif 32endif
32 33
33HOST_DIR := arch/$(HEADER_ARCH) 34HOST_DIR := arch/$(HEADER_ARCH)
@@ -50,7 +51,7 @@ KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_DIR)/um
50# 51#
51# These apply to USER_CFLAGS to. 52# These apply to USER_CFLAGS to.
52 53
53KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ 54KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ \
54 $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \ 55 $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \
55 -Din6addr_loopback=kernel_in6addr_loopback \ 56 -Din6addr_loopback=kernel_in6addr_loopback \
56 -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr 57 -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr
@@ -99,7 +100,7 @@ KBUILD_KCONFIG := $(HOST_DIR)/um/Kconfig
99 100
100archheaders: 101archheaders:
101 $(Q)$(MAKE) -C '$(srctree)' KBUILD_SRC= \ 102 $(Q)$(MAKE) -C '$(srctree)' KBUILD_SRC= \
102 ARCH=$(SUBARCH) O='$(objtree)' archheaders 103 ARCH=$(HEADER_ARCH) O='$(objtree)' archheaders
103 104
104archprepare: include/generated/user_constants.h 105archprepare: include/generated/user_constants.h
105 106
diff --git a/arch/um/defconfig b/arch/um/defconfig
index 761f5e1a657e..fdc97e2c3d73 100644
--- a/arch/um/defconfig
+++ b/arch/um/defconfig
@@ -1,10 +1,8 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated file; DO NOT EDIT.
3# Linux kernel version: 2.6.24 3# User Mode Linux/i386 3.3.0 Kernel Configuration
4# Thu Feb 7 11:48:55 2008
5# 4#
6CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" 5CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig"
7CONFIG_GENERIC_HARDIRQS=y
8CONFIG_UML=y 6CONFIG_UML=y
9CONFIG_MMU=y 7CONFIG_MMU=y
10CONFIG_NO_IOMEM=y 8CONFIG_NO_IOMEM=y
@@ -20,12 +18,10 @@ CONFIG_HZ=100
20# 18#
21# UML-specific options 19# UML-specific options
22# 20#
23# CONFIG_STATIC_LINK is not set
24 21
25# 22#
26# Host processor type and features 23# Host processor type and features
27# 24#
28# CONFIG_M386 is not set
29# CONFIG_M486 is not set 25# CONFIG_M486 is not set
30# CONFIG_M586 is not set 26# CONFIG_M586 is not set
31# CONFIG_M586TSC is not set 27# CONFIG_M586TSC is not set
@@ -41,17 +37,17 @@ CONFIG_M686=y
41# CONFIG_MCRUSOE is not set 37# CONFIG_MCRUSOE is not set
42# CONFIG_MEFFICEON is not set 38# CONFIG_MEFFICEON is not set
43# CONFIG_MWINCHIPC6 is not set 39# CONFIG_MWINCHIPC6 is not set
44# CONFIG_MWINCHIP2 is not set
45# CONFIG_MWINCHIP3D is not set 40# CONFIG_MWINCHIP3D is not set
41# CONFIG_MELAN is not set
46# CONFIG_MGEODEGX1 is not set 42# CONFIG_MGEODEGX1 is not set
47# CONFIG_MGEODE_LX is not set 43# CONFIG_MGEODE_LX is not set
48# CONFIG_MCYRIXIII is not set 44# CONFIG_MCYRIXIII is not set
49# CONFIG_MVIAC3_2 is not set 45# CONFIG_MVIAC3_2 is not set
50# CONFIG_MVIAC7 is not set 46# CONFIG_MVIAC7 is not set
51# CONFIG_MPSC is not set
52# CONFIG_MCORE2 is not set 47# CONFIG_MCORE2 is not set
53# CONFIG_GENERIC_CPU is not set 48# CONFIG_MATOM is not set
54# CONFIG_X86_GENERIC is not set 49# CONFIG_X86_GENERIC is not set
50CONFIG_X86_INTERNODE_CACHE_SHIFT=5
55CONFIG_X86_CMPXCHG=y 51CONFIG_X86_CMPXCHG=y
56CONFIG_X86_L1_CACHE_SHIFT=5 52CONFIG_X86_L1_CACHE_SHIFT=5
57CONFIG_X86_XADD=y 53CONFIG_X86_XADD=y
@@ -60,47 +56,59 @@ CONFIG_X86_WP_WORKS_OK=y
60CONFIG_X86_INVLPG=y 56CONFIG_X86_INVLPG=y
61CONFIG_X86_BSWAP=y 57CONFIG_X86_BSWAP=y
62CONFIG_X86_POPAD_OK=y 58CONFIG_X86_POPAD_OK=y
63CONFIG_X86_GOOD_APIC=y
64CONFIG_X86_USE_PPRO_CHECKSUM=y 59CONFIG_X86_USE_PPRO_CHECKSUM=y
65CONFIG_X86_TSC=y 60CONFIG_X86_TSC=y
61CONFIG_X86_CMPXCHG64=y
66CONFIG_X86_CMOV=y 62CONFIG_X86_CMOV=y
67CONFIG_X86_MINIMUM_CPU_FAMILY=4 63CONFIG_X86_MINIMUM_CPU_FAMILY=5
68CONFIG_X86_DEBUGCTLMSR=y 64CONFIG_CPU_SUP_INTEL=y
65CONFIG_CPU_SUP_CYRIX_32=y
66CONFIG_CPU_SUP_AMD=y
67CONFIG_CPU_SUP_CENTAUR=y
68CONFIG_CPU_SUP_TRANSMETA_32=y
69CONFIG_CPU_SUP_UMC_32=y
69CONFIG_UML_X86=y 70CONFIG_UML_X86=y
70CONFIG_X86_32=y
71CONFIG_RWSEM_XCHGADD_ALGORITHM=y
72# CONFIG_64BIT is not set 71# CONFIG_64BIT is not set
73CONFIG_SEMAPHORE_SLEEPERS=y 72CONFIG_X86_32=y
73# CONFIG_X86_64 is not set
74# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
75CONFIG_RWSEM_GENERIC_SPINLOCK=y
74# CONFIG_3_LEVEL_PGTABLES is not set 76# CONFIG_3_LEVEL_PGTABLES is not set
75CONFIG_ARCH_HAS_SC_SIGNALS=y 77CONFIG_ARCH_HAS_SC_SIGNALS=y
76CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y 78CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y
77CONFIG_GENERIC_HWEIGHT=y 79CONFIG_GENERIC_HWEIGHT=y
80# CONFIG_STATIC_LINK is not set
78CONFIG_SELECT_MEMORY_MODEL=y 81CONFIG_SELECT_MEMORY_MODEL=y
79CONFIG_FLATMEM_MANUAL=y 82CONFIG_FLATMEM_MANUAL=y
80# CONFIG_DISCONTIGMEM_MANUAL is not set
81# CONFIG_SPARSEMEM_MANUAL is not set
82CONFIG_FLATMEM=y 83CONFIG_FLATMEM=y
83CONFIG_FLAT_NODE_MEM_MAP=y 84CONFIG_FLAT_NODE_MEM_MAP=y
84# CONFIG_SPARSEMEM_STATIC is not set 85CONFIG_PAGEFLAGS_EXTENDED=y
85# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
86CONFIG_SPLIT_PTLOCK_CPUS=4 86CONFIG_SPLIT_PTLOCK_CPUS=4
87# CONFIG_RESOURCES_64BIT is not set 87# CONFIG_COMPACTION is not set
88# CONFIG_PHYS_ADDR_T_64BIT is not set
88CONFIG_ZONE_DMA_FLAG=0 89CONFIG_ZONE_DMA_FLAG=0
89CONFIG_VIRT_TO_BUS=y 90CONFIG_VIRT_TO_BUS=y
91# CONFIG_KSM is not set
92CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
93CONFIG_NEED_PER_CPU_KM=y
94# CONFIG_CLEANCACHE is not set
90CONFIG_TICK_ONESHOT=y 95CONFIG_TICK_ONESHOT=y
91CONFIG_NO_HZ=y 96CONFIG_NO_HZ=y
92CONFIG_HIGH_RES_TIMERS=y 97CONFIG_HIGH_RES_TIMERS=y
93CONFIG_GENERIC_CLOCKEVENTS_BUILD=y 98CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
94CONFIG_LD_SCRIPT_DYN=y 99CONFIG_LD_SCRIPT_DYN=y
95CONFIG_BINFMT_ELF=y 100CONFIG_BINFMT_ELF=y
101CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
102CONFIG_HAVE_AOUT=y
96# CONFIG_BINFMT_AOUT is not set 103# CONFIG_BINFMT_AOUT is not set
97CONFIG_BINFMT_MISC=m 104CONFIG_BINFMT_MISC=m
98CONFIG_HOSTFS=y 105CONFIG_HOSTFS=y
99# CONFIG_HPPFS is not set 106# CONFIG_HPPFS is not set
100CONFIG_MCONSOLE=y 107CONFIG_MCONSOLE=y
101CONFIG_MAGIC_SYSRQ=y 108CONFIG_MAGIC_SYSRQ=y
102# CONFIG_HIGHMEM is not set
103CONFIG_KERNEL_STACK_ORDER=0 109CONFIG_KERNEL_STACK_ORDER=0
110# CONFIG_MMAPPER is not set
111CONFIG_NO_DMA=y
104 112
105# 113#
106# General setup 114# General setup
@@ -108,99 +116,169 @@ CONFIG_KERNEL_STACK_ORDER=0
108CONFIG_EXPERIMENTAL=y 116CONFIG_EXPERIMENTAL=y
109CONFIG_BROKEN_ON_SMP=y 117CONFIG_BROKEN_ON_SMP=y
110CONFIG_INIT_ENV_ARG_LIMIT=128 118CONFIG_INIT_ENV_ARG_LIMIT=128
119CONFIG_CROSS_COMPILE=""
111CONFIG_LOCALVERSION="" 120CONFIG_LOCALVERSION=""
112CONFIG_LOCALVERSION_AUTO=y 121CONFIG_LOCALVERSION_AUTO=y
122CONFIG_DEFAULT_HOSTNAME="(none)"
113CONFIG_SWAP=y 123CONFIG_SWAP=y
114CONFIG_SYSVIPC=y 124CONFIG_SYSVIPC=y
115CONFIG_SYSVIPC_SYSCTL=y 125CONFIG_SYSVIPC_SYSCTL=y
116CONFIG_POSIX_MQUEUE=y 126CONFIG_POSIX_MQUEUE=y
127CONFIG_POSIX_MQUEUE_SYSCTL=y
117CONFIG_BSD_PROCESS_ACCT=y 128CONFIG_BSD_PROCESS_ACCT=y
118# CONFIG_BSD_PROCESS_ACCT_V3 is not set 129# CONFIG_BSD_PROCESS_ACCT_V3 is not set
130# CONFIG_FHANDLE is not set
119# CONFIG_TASKSTATS is not set 131# CONFIG_TASKSTATS is not set
120# CONFIG_USER_NS is not set
121# CONFIG_PID_NS is not set
122# CONFIG_AUDIT is not set 132# CONFIG_AUDIT is not set
133CONFIG_HAVE_GENERIC_HARDIRQS=y
134
135#
136# IRQ subsystem
137#
138CONFIG_GENERIC_HARDIRQS=y
139CONFIG_GENERIC_IRQ_SHOW=y
140
141#
142# RCU Subsystem
143#
144CONFIG_TINY_RCU=y
145# CONFIG_PREEMPT_RCU is not set
146# CONFIG_RCU_TRACE is not set
147# CONFIG_TREE_RCU_TRACE is not set
123CONFIG_IKCONFIG=y 148CONFIG_IKCONFIG=y
124CONFIG_IKCONFIG_PROC=y 149CONFIG_IKCONFIG_PROC=y
125CONFIG_LOG_BUF_SHIFT=14 150CONFIG_LOG_BUF_SHIFT=14
126# CONFIG_CGROUPS is not set 151CONFIG_CGROUPS=y
152# CONFIG_CGROUP_DEBUG is not set
153CONFIG_CGROUP_FREEZER=y
154CONFIG_CGROUP_DEVICE=y
155CONFIG_CPUSETS=y
156CONFIG_PROC_PID_CPUSET=y
157CONFIG_CGROUP_CPUACCT=y
158CONFIG_RESOURCE_COUNTERS=y
159CONFIG_CGROUP_MEM_RES_CTLR=y
160CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
161# CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set
162# CONFIG_CGROUP_MEM_RES_CTLR_KMEM is not set
163CONFIG_CGROUP_SCHED=y
127CONFIG_FAIR_GROUP_SCHED=y 164CONFIG_FAIR_GROUP_SCHED=y
128CONFIG_FAIR_USER_SCHED=y 165# CONFIG_CFS_BANDWIDTH is not set
129# CONFIG_FAIR_CGROUP_SCHED is not set 166# CONFIG_RT_GROUP_SCHED is not set
167CONFIG_BLK_CGROUP=m
168# CONFIG_DEBUG_BLK_CGROUP is not set
169# CONFIG_CHECKPOINT_RESTORE is not set
170CONFIG_NAMESPACES=y
171CONFIG_UTS_NS=y
172CONFIG_IPC_NS=y
173# CONFIG_USER_NS is not set
174# CONFIG_PID_NS is not set
175CONFIG_NET_NS=y
176# CONFIG_SCHED_AUTOGROUP is not set
177CONFIG_MM_OWNER=y
130CONFIG_SYSFS_DEPRECATED=y 178CONFIG_SYSFS_DEPRECATED=y
179# CONFIG_SYSFS_DEPRECATED_V2 is not set
131# CONFIG_RELAY is not set 180# CONFIG_RELAY is not set
132# CONFIG_BLK_DEV_INITRD is not set 181# CONFIG_BLK_DEV_INITRD is not set
133CONFIG_CC_OPTIMIZE_FOR_SIZE=y 182CONFIG_CC_OPTIMIZE_FOR_SIZE=y
134CONFIG_SYSCTL=y 183CONFIG_SYSCTL=y
184CONFIG_ANON_INODES=y
135# CONFIG_EXPERT is not set 185# CONFIG_EXPERT is not set
136CONFIG_UID16=y 186CONFIG_UID16=y
137CONFIG_SYSCTL_SYSCALL=y 187# CONFIG_SYSCTL_SYSCALL is not set
138CONFIG_KALLSYMS=y 188CONFIG_KALLSYMS=y
139# CONFIG_KALLSYMS_ALL is not set 189# CONFIG_KALLSYMS_ALL is not set
140CONFIG_KALLSYMS_EXTRA_PASS=y
141CONFIG_HOTPLUG=y 190CONFIG_HOTPLUG=y
142CONFIG_PRINTK=y 191CONFIG_PRINTK=y
143CONFIG_BUG=y 192CONFIG_BUG=y
144CONFIG_ELF_CORE=y 193CONFIG_ELF_CORE=y
145CONFIG_BASE_FULL=y 194CONFIG_BASE_FULL=y
146CONFIG_FUTEX=y 195CONFIG_FUTEX=y
147CONFIG_ANON_INODES=y
148CONFIG_EPOLL=y 196CONFIG_EPOLL=y
149CONFIG_SIGNALFD=y 197CONFIG_SIGNALFD=y
150CONFIG_TIMERFD=y 198CONFIG_TIMERFD=y
151CONFIG_EVENTFD=y 199CONFIG_EVENTFD=y
152CONFIG_SHMEM=y 200CONFIG_SHMEM=y
201CONFIG_AIO=y
202# CONFIG_EMBEDDED is not set
203
204#
205# Kernel Performance Events And Counters
206#
153CONFIG_VM_EVENT_COUNTERS=y 207CONFIG_VM_EVENT_COUNTERS=y
208CONFIG_COMPAT_BRK=y
154CONFIG_SLAB=y 209CONFIG_SLAB=y
155# CONFIG_SLUB is not set 210# CONFIG_SLUB is not set
156# CONFIG_SLOB is not set
157# CONFIG_PROFILING is not set 211# CONFIG_PROFILING is not set
158# CONFIG_MARKERS is not set 212
159# CONFIG_HAVE_OPROFILE is not set 213#
160# CONFIG_HAVE_KPROBES is not set 214# GCOV-based kernel profiling
161CONFIG_PROC_PAGE_MONITOR=y 215#
216# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
162CONFIG_SLABINFO=y 217CONFIG_SLABINFO=y
163CONFIG_RT_MUTEXES=y 218CONFIG_RT_MUTEXES=y
164# CONFIG_TINY_SHMEM is not set
165CONFIG_BASE_SMALL=0 219CONFIG_BASE_SMALL=0
166CONFIG_MODULES=y 220CONFIG_MODULES=y
221# CONFIG_MODULE_FORCE_LOAD is not set
167CONFIG_MODULE_UNLOAD=y 222CONFIG_MODULE_UNLOAD=y
168# CONFIG_MODULE_FORCE_UNLOAD is not set 223# CONFIG_MODULE_FORCE_UNLOAD is not set
169# CONFIG_MODVERSIONS is not set 224# CONFIG_MODVERSIONS is not set
170# CONFIG_MODULE_SRCVERSION_ALL is not set 225# CONFIG_MODULE_SRCVERSION_ALL is not set
171CONFIG_KMOD=y
172CONFIG_BLOCK=y 226CONFIG_BLOCK=y
173# CONFIG_LBD is not set 227CONFIG_LBDAF=y
174# CONFIG_BLK_DEV_IO_TRACE is not set
175# CONFIG_LSF is not set
176# CONFIG_BLK_DEV_BSG is not set 228# CONFIG_BLK_DEV_BSG is not set
229# CONFIG_BLK_DEV_BSGLIB is not set
230# CONFIG_BLK_DEV_INTEGRITY is not set
231
232#
233# Partition Types
234#
235# CONFIG_PARTITION_ADVANCED is not set
236CONFIG_MSDOS_PARTITION=y
177 237
178# 238#
179# IO Schedulers 239# IO Schedulers
180# 240#
181CONFIG_IOSCHED_NOOP=y 241CONFIG_IOSCHED_NOOP=y
182CONFIG_IOSCHED_AS=y
183CONFIG_IOSCHED_DEADLINE=y 242CONFIG_IOSCHED_DEADLINE=y
184CONFIG_IOSCHED_CFQ=y 243CONFIG_IOSCHED_CFQ=m
185CONFIG_DEFAULT_AS=y 244# CONFIG_CFQ_GROUP_IOSCHED is not set
186# CONFIG_DEFAULT_DEADLINE is not set 245CONFIG_DEFAULT_DEADLINE=y
187# CONFIG_DEFAULT_CFQ is not set 246# CONFIG_DEFAULT_CFQ is not set
188# CONFIG_DEFAULT_NOOP is not set 247# CONFIG_DEFAULT_NOOP is not set
189CONFIG_DEFAULT_IOSCHED="anticipatory" 248CONFIG_DEFAULT_IOSCHED="deadline"
190CONFIG_CLASSIC_RCU=y 249# CONFIG_INLINE_SPIN_TRYLOCK is not set
191# CONFIG_PREEMPT_RCU is not set 250# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
192CONFIG_BLK_DEV=y 251# CONFIG_INLINE_SPIN_LOCK is not set
193CONFIG_BLK_DEV_UBD=y 252# CONFIG_INLINE_SPIN_LOCK_BH is not set
194# CONFIG_BLK_DEV_UBD_SYNC is not set 253# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
195CONFIG_BLK_DEV_COW_COMMON=y 254# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
196CONFIG_BLK_DEV_LOOP=m 255CONFIG_INLINE_SPIN_UNLOCK=y
197# CONFIG_BLK_DEV_CRYPTOLOOP is not set 256# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
198CONFIG_BLK_DEV_NBD=m 257CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
199# CONFIG_BLK_DEV_RAM is not set 258# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
200# CONFIG_ATA_OVER_ETH is not set 259# CONFIG_INLINE_READ_TRYLOCK is not set
260# CONFIG_INLINE_READ_LOCK is not set
261# CONFIG_INLINE_READ_LOCK_BH is not set
262# CONFIG_INLINE_READ_LOCK_IRQ is not set
263# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
264CONFIG_INLINE_READ_UNLOCK=y
265# CONFIG_INLINE_READ_UNLOCK_BH is not set
266CONFIG_INLINE_READ_UNLOCK_IRQ=y
267# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
268# CONFIG_INLINE_WRITE_TRYLOCK is not set
269# CONFIG_INLINE_WRITE_LOCK is not set
270# CONFIG_INLINE_WRITE_LOCK_BH is not set
271# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
272# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
273CONFIG_INLINE_WRITE_UNLOCK=y
274# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
275CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
276# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
277# CONFIG_MUTEX_SPIN_ON_OWNER is not set
278CONFIG_FREEZER=y
201 279
202# 280#
203# Character Devices 281# UML Character Devices
204# 282#
205CONFIG_STDERR_CONSOLE=y 283CONFIG_STDERR_CONSOLE=y
206CONFIG_STDIO_CONSOLE=y 284CONFIG_STDIO_CONSOLE=y
@@ -214,40 +292,191 @@ CONFIG_XTERM_CHAN=y
214CONFIG_CON_ZERO_CHAN="fd:0,fd:1" 292CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
215CONFIG_CON_CHAN="xterm" 293CONFIG_CON_CHAN="xterm"
216CONFIG_SSL_CHAN="pts" 294CONFIG_SSL_CHAN="pts"
217CONFIG_UNIX98_PTYS=y
218CONFIG_LEGACY_PTYS=y
219# CONFIG_RAW_DRIVER is not set
220CONFIG_LEGACY_PTY_COUNT=32
221# CONFIG_WATCHDOG is not set
222CONFIG_UML_SOUND=m 295CONFIG_UML_SOUND=m
223CONFIG_SOUND=m 296CONFIG_SOUND=m
297CONFIG_SOUND_OSS_CORE=y
224CONFIG_HOSTAUDIO=m 298CONFIG_HOSTAUDIO=m
225# CONFIG_HW_RANDOM is not set 299
226CONFIG_UML_RANDOM=y 300#
227# CONFIG_MMAPPER is not set 301# Device Drivers
302#
228 303
229# 304#
230# Generic Driver Options 305# Generic Driver Options
231# 306#
232CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 307CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
308CONFIG_DEVTMPFS=y
309CONFIG_DEVTMPFS_MOUNT=y
233CONFIG_STANDALONE=y 310CONFIG_STANDALONE=y
234CONFIG_PREVENT_FIRMWARE_BUILD=y 311CONFIG_PREVENT_FIRMWARE_BUILD=y
235# CONFIG_FW_LOADER is not set 312CONFIG_FW_LOADER=y
313CONFIG_FIRMWARE_IN_KERNEL=y
314CONFIG_EXTRA_FIRMWARE=""
236# CONFIG_DEBUG_DRIVER is not set 315# CONFIG_DEBUG_DRIVER is not set
237# CONFIG_DEBUG_DEVRES is not set 316# CONFIG_DEBUG_DEVRES is not set
238# CONFIG_SYS_HYPERVISOR is not set 317# CONFIG_SYS_HYPERVISOR is not set
318CONFIG_GENERIC_CPU_DEVICES=y
319# CONFIG_DMA_SHARED_BUFFER is not set
320# CONFIG_CONNECTOR is not set
321# CONFIG_MTD is not set
322CONFIG_BLK_DEV=y
323CONFIG_BLK_DEV_UBD=y
324# CONFIG_BLK_DEV_UBD_SYNC is not set
325CONFIG_BLK_DEV_COW_COMMON=y
326CONFIG_BLK_DEV_LOOP=m
327CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
328# CONFIG_BLK_DEV_CRYPTOLOOP is not set
329
330#
331# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
332#
333CONFIG_BLK_DEV_NBD=m
334# CONFIG_BLK_DEV_RAM is not set
335# CONFIG_ATA_OVER_ETH is not set
336# CONFIG_BLK_DEV_RBD is not set
337
338#
339# Misc devices
340#
341# CONFIG_ENCLOSURE_SERVICES is not set
342# CONFIG_C2PORT is not set
343
344#
345# EEPROM support
346#
347# CONFIG_EEPROM_93CX6 is not set
348
349#
350# Texas Instruments shared transport line discipline
351#
352
353#
354# Altera FPGA firmware download module
355#
356
357#
358# SCSI device support
359#
360CONFIG_SCSI_MOD=y
361# CONFIG_RAID_ATTRS is not set
362# CONFIG_SCSI is not set
363# CONFIG_SCSI_DMA is not set
364# CONFIG_SCSI_NETLINK is not set
365# CONFIG_MD is not set
366CONFIG_NETDEVICES=y
367CONFIG_NET_CORE=y
368# CONFIG_BONDING is not set
369CONFIG_DUMMY=m
370# CONFIG_EQUALIZER is not set
371# CONFIG_MII is not set
372# CONFIG_NET_TEAM is not set
373# CONFIG_MACVLAN is not set
374# CONFIG_NETCONSOLE is not set
375# CONFIG_NETPOLL is not set
376# CONFIG_NET_POLL_CONTROLLER is not set
377CONFIG_TUN=m
378# CONFIG_VETH is not set
379
380#
381# CAIF transport drivers
382#
383CONFIG_ETHERNET=y
384CONFIG_NET_VENDOR_CHELSIO=y
385CONFIG_NET_VENDOR_INTEL=y
386CONFIG_NET_VENDOR_I825XX=y
387CONFIG_NET_VENDOR_MARVELL=y
388CONFIG_NET_VENDOR_NATSEMI=y
389CONFIG_NET_VENDOR_8390=y
390# CONFIG_PHYLIB is not set
391CONFIG_PPP=m
392# CONFIG_PPP_BSDCOMP is not set
393# CONFIG_PPP_DEFLATE is not set
394# CONFIG_PPP_FILTER is not set
395# CONFIG_PPP_MPPE is not set
396# CONFIG_PPP_MULTILINK is not set
397# CONFIG_PPPOE is not set
398# CONFIG_PPP_ASYNC is not set
399# CONFIG_PPP_SYNC_TTY is not set
400CONFIG_SLIP=m
401CONFIG_SLHC=m
402# CONFIG_SLIP_COMPRESSED is not set
403# CONFIG_SLIP_SMART is not set
404# CONFIG_SLIP_MODE_SLIP6 is not set
405CONFIG_WLAN=y
406# CONFIG_HOSTAP is not set
407
408#
409# Enable WiMAX (Networking options) to see the WiMAX drivers
410#
411# CONFIG_WAN is not set
412
413#
414# Character devices
415#
416CONFIG_UNIX98_PTYS=y
417# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
418CONFIG_LEGACY_PTYS=y
419CONFIG_LEGACY_PTY_COUNT=32
420# CONFIG_N_GSM is not set
421# CONFIG_TRACE_SINK is not set
422CONFIG_DEVKMEM=y
423# CONFIG_HW_RANDOM is not set
424CONFIG_UML_RANDOM=y
425# CONFIG_R3964 is not set
426# CONFIG_NSC_GPIO is not set
427# CONFIG_RAW_DRIVER is not set
428
429#
430# PPS support
431#
432# CONFIG_PPS is not set
433
434#
435# PPS generators support
436#
437
438#
439# PTP clock support
440#
441
442#
443# Enable Device Drivers -> PPS to see the PTP clock options.
444#
445# CONFIG_POWER_SUPPLY is not set
446# CONFIG_THERMAL is not set
447# CONFIG_WATCHDOG is not set
448# CONFIG_REGULATOR is not set
449CONFIG_SOUND_OSS_CORE_PRECLAIM=y
450# CONFIG_MEMSTICK is not set
451# CONFIG_NEW_LEDS is not set
452# CONFIG_ACCESSIBILITY is not set
453# CONFIG_AUXDISPLAY is not set
454# CONFIG_UIO is not set
455
456#
457# Virtio drivers
458#
459# CONFIG_VIRTIO_BALLOON is not set
460
461#
462# Microsoft Hyper-V guest support
463#
464# CONFIG_STAGING is not set
239 465
240# 466#
241# Networking 467# Hardware Spinlock drivers
242# 468#
469CONFIG_IOMMU_SUPPORT=y
470# CONFIG_VIRT_DRIVERS is not set
471# CONFIG_PM_DEVFREQ is not set
243CONFIG_NET=y 472CONFIG_NET=y
244 473
245# 474#
246# Networking options 475# Networking options
247# 476#
248CONFIG_PACKET=y 477CONFIG_PACKET=y
249CONFIG_PACKET_MMAP=y
250CONFIG_UNIX=y 478CONFIG_UNIX=y
479# CONFIG_UNIX_DIAG is not set
251CONFIG_XFRM=y 480CONFIG_XFRM=y
252# CONFIG_XFRM_USER is not set 481# CONFIG_XFRM_USER is not set
253# CONFIG_XFRM_SUB_POLICY is not set 482# CONFIG_XFRM_SUB_POLICY is not set
@@ -257,10 +486,9 @@ CONFIG_XFRM=y
257CONFIG_INET=y 486CONFIG_INET=y
258# CONFIG_IP_MULTICAST is not set 487# CONFIG_IP_MULTICAST is not set
259# CONFIG_IP_ADVANCED_ROUTER is not set 488# CONFIG_IP_ADVANCED_ROUTER is not set
260CONFIG_IP_FIB_HASH=y
261# CONFIG_IP_PNP is not set 489# CONFIG_IP_PNP is not set
262# CONFIG_NET_IPIP is not set 490# CONFIG_NET_IPIP is not set
263# CONFIG_NET_IPGRE is not set 491# CONFIG_NET_IPGRE_DEMUX is not set
264# CONFIG_ARPD is not set 492# CONFIG_ARPD is not set
265# CONFIG_SYN_COOKIES is not set 493# CONFIG_SYN_COOKIES is not set
266# CONFIG_INET_AH is not set 494# CONFIG_INET_AH is not set
@@ -274,20 +502,23 @@ CONFIG_INET_XFRM_MODE_BEET=y
274# CONFIG_INET_LRO is not set 502# CONFIG_INET_LRO is not set
275CONFIG_INET_DIAG=y 503CONFIG_INET_DIAG=y
276CONFIG_INET_TCP_DIAG=y 504CONFIG_INET_TCP_DIAG=y
505# CONFIG_INET_UDP_DIAG is not set
277# CONFIG_TCP_CONG_ADVANCED is not set 506# CONFIG_TCP_CONG_ADVANCED is not set
278CONFIG_TCP_CONG_CUBIC=y 507CONFIG_TCP_CONG_CUBIC=y
279CONFIG_DEFAULT_TCP_CONG="cubic" 508CONFIG_DEFAULT_TCP_CONG="cubic"
280# CONFIG_TCP_MD5SIG is not set 509# CONFIG_TCP_MD5SIG is not set
281# CONFIG_IPV6 is not set 510# CONFIG_IPV6 is not set
282# CONFIG_INET6_XFRM_TUNNEL is not set
283# CONFIG_INET6_TUNNEL is not set
284# CONFIG_NETWORK_SECMARK is not set 511# CONFIG_NETWORK_SECMARK is not set
512# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
285# CONFIG_NETFILTER is not set 513# CONFIG_NETFILTER is not set
286# CONFIG_IP_DCCP is not set 514# CONFIG_IP_DCCP is not set
287# CONFIG_IP_SCTP is not set 515# CONFIG_IP_SCTP is not set
516# CONFIG_RDS is not set
288# CONFIG_TIPC is not set 517# CONFIG_TIPC is not set
289# CONFIG_ATM is not set 518# CONFIG_ATM is not set
519# CONFIG_L2TP is not set
290# CONFIG_BRIDGE is not set 520# CONFIG_BRIDGE is not set
521# CONFIG_NET_DSA is not set
291# CONFIG_VLAN_8021Q is not set 522# CONFIG_VLAN_8021Q is not set
292# CONFIG_DECNET is not set 523# CONFIG_DECNET is not set
293# CONFIG_LLC2 is not set 524# CONFIG_LLC2 is not set
@@ -297,7 +528,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
297# CONFIG_LAPB is not set 528# CONFIG_LAPB is not set
298# CONFIG_ECONET is not set 529# CONFIG_ECONET is not set
299# CONFIG_WAN_ROUTER is not set 530# CONFIG_WAN_ROUTER is not set
531# CONFIG_PHONET is not set
532# CONFIG_IEEE802154 is not set
300# CONFIG_NET_SCHED is not set 533# CONFIG_NET_SCHED is not set
534# CONFIG_DCB is not set
535# CONFIG_BATMAN_ADV is not set
536# CONFIG_OPENVSWITCH is not set
537# CONFIG_NETPRIO_CGROUP is not set
538CONFIG_BQL=y
301 539
302# 540#
303# Network testing 541# Network testing
@@ -308,16 +546,19 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
308# CONFIG_IRDA is not set 546# CONFIG_IRDA is not set
309# CONFIG_BT is not set 547# CONFIG_BT is not set
310# CONFIG_AF_RXRPC is not set 548# CONFIG_AF_RXRPC is not set
549CONFIG_WIRELESS=y
550# CONFIG_CFG80211 is not set
551# CONFIG_LIB80211 is not set
311 552
312# 553#
313# Wireless 554# CFG80211 needs to be enabled for MAC80211
314# 555#
315# CONFIG_CFG80211 is not set 556# CONFIG_WIMAX is not set
316# CONFIG_WIRELESS_EXT is not set
317# CONFIG_MAC80211 is not set
318# CONFIG_IEEE80211 is not set
319# CONFIG_RFKILL is not set 557# CONFIG_RFKILL is not set
320# CONFIG_NET_9P is not set 558# CONFIG_NET_9P is not set
559# CONFIG_CAIF is not set
560# CONFIG_CEPH_LIB is not set
561# CONFIG_NFC is not set
321 562
322# 563#
323# UML Network Devices 564# UML Network Devices
@@ -331,76 +572,51 @@ CONFIG_UML_NET_DAEMON=y
331CONFIG_UML_NET_MCAST=y 572CONFIG_UML_NET_MCAST=y
332# CONFIG_UML_NET_PCAP is not set 573# CONFIG_UML_NET_PCAP is not set
333CONFIG_UML_NET_SLIRP=y 574CONFIG_UML_NET_SLIRP=y
334CONFIG_NETDEVICES=y
335# CONFIG_NETDEVICES_MULTIQUEUE is not set
336CONFIG_DUMMY=m
337# CONFIG_BONDING is not set
338# CONFIG_MACVLAN is not set
339# CONFIG_EQUALIZER is not set
340CONFIG_TUN=m
341# CONFIG_VETH is not set
342
343#
344# Wireless LAN
345#
346# CONFIG_WLAN_PRE80211 is not set
347# CONFIG_WLAN_80211 is not set
348# CONFIG_WAN is not set
349CONFIG_PPP=m
350# CONFIG_PPP_MULTILINK is not set
351# CONFIG_PPP_FILTER is not set
352# CONFIG_PPP_ASYNC is not set
353# CONFIG_PPP_SYNC_TTY is not set
354# CONFIG_PPP_DEFLATE is not set
355# CONFIG_PPP_BSDCOMP is not set
356# CONFIG_PPP_MPPE is not set
357# CONFIG_PPPOE is not set
358# CONFIG_PPPOL2TP is not set
359CONFIG_SLIP=m
360# CONFIG_SLIP_COMPRESSED is not set
361CONFIG_SLHC=m
362# CONFIG_SLIP_SMART is not set
363# CONFIG_SLIP_MODE_SLIP6 is not set
364# CONFIG_NETCONSOLE is not set
365# CONFIG_NETPOLL is not set
366# CONFIG_NET_POLL_CONTROLLER is not set
367# CONFIG_CONNECTOR is not set
368 575
369# 576#
370# File systems 577# File systems
371# 578#
372CONFIG_EXT2_FS=y 579# CONFIG_EXT2_FS is not set
373# CONFIG_EXT2_FS_XATTR is not set 580# CONFIG_EXT3_FS is not set
374# CONFIG_EXT2_FS_XIP is not set 581CONFIG_EXT4_FS=y
375CONFIG_EXT3_FS=y 582CONFIG_EXT4_USE_FOR_EXT23=y
376# CONFIG_EXT3_FS_XATTR is not set 583CONFIG_EXT4_FS_XATTR=y
377# CONFIG_EXT4DEV_FS is not set 584# CONFIG_EXT4_FS_POSIX_ACL is not set
378CONFIG_JBD=y 585# CONFIG_EXT4_FS_SECURITY is not set
586# CONFIG_EXT4_DEBUG is not set
587CONFIG_JBD2=y
588CONFIG_FS_MBCACHE=y
379CONFIG_REISERFS_FS=y 589CONFIG_REISERFS_FS=y
380# CONFIG_REISERFS_CHECK is not set 590# CONFIG_REISERFS_CHECK is not set
381# CONFIG_REISERFS_PROC_INFO is not set 591# CONFIG_REISERFS_PROC_INFO is not set
382# CONFIG_REISERFS_FS_XATTR is not set 592# CONFIG_REISERFS_FS_XATTR is not set
383# CONFIG_JFS_FS is not set 593# CONFIG_JFS_FS is not set
384# CONFIG_FS_POSIX_ACL is not set
385# CONFIG_XFS_FS is not set 594# CONFIG_XFS_FS is not set
386# CONFIG_GFS2_FS is not set 595# CONFIG_GFS2_FS is not set
387# CONFIG_OCFS2_FS is not set 596# CONFIG_BTRFS_FS is not set
388# CONFIG_MINIX_FS is not set 597# CONFIG_NILFS2_FS is not set
389# CONFIG_ROMFS_FS is not set 598# CONFIG_FS_POSIX_ACL is not set
390CONFIG_INOTIFY=y 599CONFIG_FILE_LOCKING=y
600CONFIG_FSNOTIFY=y
601CONFIG_DNOTIFY=y
391CONFIG_INOTIFY_USER=y 602CONFIG_INOTIFY_USER=y
603# CONFIG_FANOTIFY is not set
392CONFIG_QUOTA=y 604CONFIG_QUOTA=y
393# CONFIG_QUOTA_NETLINK_INTERFACE is not set 605# CONFIG_QUOTA_NETLINK_INTERFACE is not set
394CONFIG_PRINT_QUOTA_WARNING=y 606CONFIG_PRINT_QUOTA_WARNING=y
607# CONFIG_QUOTA_DEBUG is not set
395# CONFIG_QFMT_V1 is not set 608# CONFIG_QFMT_V1 is not set
396# CONFIG_QFMT_V2 is not set 609# CONFIG_QFMT_V2 is not set
397CONFIG_QUOTACTL=y 610CONFIG_QUOTACTL=y
398CONFIG_DNOTIFY=y
399CONFIG_AUTOFS_FS=m
400CONFIG_AUTOFS4_FS=m 611CONFIG_AUTOFS4_FS=m
401# CONFIG_FUSE_FS is not set 612# CONFIG_FUSE_FS is not set
402 613
403# 614#
615# Caches
616#
617# CONFIG_FSCACHE is not set
618
619#
404# CD-ROM/DVD Filesystems 620# CD-ROM/DVD Filesystems
405# 621#
406CONFIG_ISO9660_FS=m 622CONFIG_ISO9660_FS=m
@@ -421,15 +637,14 @@ CONFIG_JOLIET=y
421CONFIG_PROC_FS=y 637CONFIG_PROC_FS=y
422CONFIG_PROC_KCORE=y 638CONFIG_PROC_KCORE=y
423CONFIG_PROC_SYSCTL=y 639CONFIG_PROC_SYSCTL=y
640CONFIG_PROC_PAGE_MONITOR=y
424CONFIG_SYSFS=y 641CONFIG_SYSFS=y
425CONFIG_TMPFS=y 642CONFIG_TMPFS=y
426# CONFIG_TMPFS_POSIX_ACL is not set 643# CONFIG_TMPFS_POSIX_ACL is not set
644# CONFIG_TMPFS_XATTR is not set
427# CONFIG_HUGETLB_PAGE is not set 645# CONFIG_HUGETLB_PAGE is not set
428# CONFIG_CONFIGFS_FS is not set 646# CONFIG_CONFIGFS_FS is not set
429 647CONFIG_MISC_FILESYSTEMS=y
430#
431# Miscellaneous filesystems
432#
433# CONFIG_ADFS_FS is not set 648# CONFIG_ADFS_FS is not set
434# CONFIG_AFFS_FS is not set 649# CONFIG_AFFS_FS is not set
435# CONFIG_HFS_FS is not set 650# CONFIG_HFS_FS is not set
@@ -437,26 +652,26 @@ CONFIG_TMPFS=y
437# CONFIG_BEFS_FS is not set 652# CONFIG_BEFS_FS is not set
438# CONFIG_BFS_FS is not set 653# CONFIG_BFS_FS is not set
439# CONFIG_EFS_FS is not set 654# CONFIG_EFS_FS is not set
655# CONFIG_LOGFS is not set
440# CONFIG_CRAMFS is not set 656# CONFIG_CRAMFS is not set
657# CONFIG_SQUASHFS is not set
441# CONFIG_VXFS_FS is not set 658# CONFIG_VXFS_FS is not set
659# CONFIG_MINIX_FS is not set
660# CONFIG_OMFS_FS is not set
442# CONFIG_HPFS_FS is not set 661# CONFIG_HPFS_FS is not set
443# CONFIG_QNX4FS_FS is not set 662# CONFIG_QNX4FS_FS is not set
663# CONFIG_ROMFS_FS is not set
664# CONFIG_PSTORE is not set
444# CONFIG_SYSV_FS is not set 665# CONFIG_SYSV_FS is not set
445# CONFIG_UFS_FS is not set 666# CONFIG_UFS_FS is not set
446CONFIG_NETWORK_FILESYSTEMS=y 667CONFIG_NETWORK_FILESYSTEMS=y
447# CONFIG_NFS_FS is not set 668# CONFIG_NFS_FS is not set
448# CONFIG_NFSD is not set 669# CONFIG_NFSD is not set
449# CONFIG_SMB_FS is not set 670# CONFIG_CEPH_FS is not set
450# CONFIG_CIFS is not set 671# CONFIG_CIFS is not set
451# CONFIG_NCP_FS is not set 672# CONFIG_NCP_FS is not set
452# CONFIG_CODA_FS is not set 673# CONFIG_CODA_FS is not set
453# CONFIG_AFS_FS is not set 674# CONFIG_AFS_FS is not set
454
455#
456# Partition Types
457#
458# CONFIG_PARTITION_ADVANCED is not set
459CONFIG_MSDOS_PARTITION=y
460CONFIG_NLS=y 675CONFIG_NLS=y
461CONFIG_NLS_DEFAULT="iso8859-1" 676CONFIG_NLS_DEFAULT="iso8859-1"
462# CONFIG_NLS_CODEPAGE_437 is not set 677# CONFIG_NLS_CODEPAGE_437 is not set
@@ -497,119 +712,191 @@ CONFIG_NLS_DEFAULT="iso8859-1"
497# CONFIG_NLS_KOI8_R is not set 712# CONFIG_NLS_KOI8_R is not set
498# CONFIG_NLS_KOI8_U is not set 713# CONFIG_NLS_KOI8_U is not set
499# CONFIG_NLS_UTF8 is not set 714# CONFIG_NLS_UTF8 is not set
500# CONFIG_DLM is not set
501 715
502# 716#
503# Security options 717# Security options
504# 718#
505# CONFIG_KEYS is not set 719# CONFIG_KEYS is not set
720# CONFIG_SECURITY_DMESG_RESTRICT is not set
506# CONFIG_SECURITY is not set 721# CONFIG_SECURITY is not set
507# CONFIG_SECURITY_FILE_CAPABILITIES is not set 722# CONFIG_SECURITYFS is not set
723CONFIG_DEFAULT_SECURITY_DAC=y
724CONFIG_DEFAULT_SECURITY=""
508CONFIG_CRYPTO=y 725CONFIG_CRYPTO=y
509# CONFIG_CRYPTO_SEQIV is not set 726
727#
728# Crypto core or helper
729#
730# CONFIG_CRYPTO_FIPS is not set
731CONFIG_CRYPTO_ALGAPI=m
732CONFIG_CRYPTO_ALGAPI2=m
733CONFIG_CRYPTO_RNG=m
734CONFIG_CRYPTO_RNG2=m
510# CONFIG_CRYPTO_MANAGER is not set 735# CONFIG_CRYPTO_MANAGER is not set
736# CONFIG_CRYPTO_MANAGER2 is not set
737# CONFIG_CRYPTO_USER is not set
738# CONFIG_CRYPTO_GF128MUL is not set
739# CONFIG_CRYPTO_NULL is not set
740# CONFIG_CRYPTO_CRYPTD is not set
741# CONFIG_CRYPTO_AUTHENC is not set
742# CONFIG_CRYPTO_TEST is not set
743
744#
745# Authenticated Encryption with Associated Data
746#
747# CONFIG_CRYPTO_CCM is not set
748# CONFIG_CRYPTO_GCM is not set
749# CONFIG_CRYPTO_SEQIV is not set
750
751#
752# Block modes
753#
754# CONFIG_CRYPTO_CBC is not set
755# CONFIG_CRYPTO_CTR is not set
756# CONFIG_CRYPTO_CTS is not set
757# CONFIG_CRYPTO_ECB is not set
758# CONFIG_CRYPTO_LRW is not set
759# CONFIG_CRYPTO_PCBC is not set
760# CONFIG_CRYPTO_XTS is not set
761
762#
763# Hash modes
764#
511# CONFIG_CRYPTO_HMAC is not set 765# CONFIG_CRYPTO_HMAC is not set
512# CONFIG_CRYPTO_XCBC is not set 766# CONFIG_CRYPTO_XCBC is not set
513# CONFIG_CRYPTO_NULL is not set 767# CONFIG_CRYPTO_VMAC is not set
768
769#
770# Digest
771#
772# CONFIG_CRYPTO_CRC32C is not set
773# CONFIG_CRYPTO_GHASH is not set
514# CONFIG_CRYPTO_MD4 is not set 774# CONFIG_CRYPTO_MD4 is not set
515# CONFIG_CRYPTO_MD5 is not set 775# CONFIG_CRYPTO_MD5 is not set
776# CONFIG_CRYPTO_MICHAEL_MIC is not set
777# CONFIG_CRYPTO_RMD128 is not set
778# CONFIG_CRYPTO_RMD160 is not set
779# CONFIG_CRYPTO_RMD256 is not set
780# CONFIG_CRYPTO_RMD320 is not set
516# CONFIG_CRYPTO_SHA1 is not set 781# CONFIG_CRYPTO_SHA1 is not set
517# CONFIG_CRYPTO_SHA256 is not set 782# CONFIG_CRYPTO_SHA256 is not set
518# CONFIG_CRYPTO_SHA512 is not set 783# CONFIG_CRYPTO_SHA512 is not set
519# CONFIG_CRYPTO_WP512 is not set
520# CONFIG_CRYPTO_TGR192 is not set 784# CONFIG_CRYPTO_TGR192 is not set
521# CONFIG_CRYPTO_GF128MUL is not set 785# CONFIG_CRYPTO_WP512 is not set
522# CONFIG_CRYPTO_ECB is not set 786
523# CONFIG_CRYPTO_CBC is not set 787#
524# CONFIG_CRYPTO_PCBC is not set 788# Ciphers
525# CONFIG_CRYPTO_LRW is not set 789#
526# CONFIG_CRYPTO_XTS is not set 790CONFIG_CRYPTO_AES=m
527# CONFIG_CRYPTO_CTR is not set
528# CONFIG_CRYPTO_GCM is not set
529# CONFIG_CRYPTO_CCM is not set
530# CONFIG_CRYPTO_CRYPTD is not set
531# CONFIG_CRYPTO_DES is not set
532# CONFIG_CRYPTO_FCRYPT is not set
533# CONFIG_CRYPTO_BLOWFISH is not set
534# CONFIG_CRYPTO_TWOFISH is not set
535# CONFIG_CRYPTO_TWOFISH_586 is not set
536# CONFIG_CRYPTO_SERPENT is not set
537# CONFIG_CRYPTO_AES is not set
538# CONFIG_CRYPTO_AES_586 is not set 791# CONFIG_CRYPTO_AES_586 is not set
792# CONFIG_CRYPTO_ANUBIS is not set
793# CONFIG_CRYPTO_ARC4 is not set
794# CONFIG_CRYPTO_BLOWFISH is not set
795# CONFIG_CRYPTO_CAMELLIA is not set
539# CONFIG_CRYPTO_CAST5 is not set 796# CONFIG_CRYPTO_CAST5 is not set
540# CONFIG_CRYPTO_CAST6 is not set 797# CONFIG_CRYPTO_CAST6 is not set
541# CONFIG_CRYPTO_TEA is not set 798# CONFIG_CRYPTO_DES is not set
542# CONFIG_CRYPTO_ARC4 is not set 799# CONFIG_CRYPTO_FCRYPT is not set
543# CONFIG_CRYPTO_KHAZAD is not set 800# CONFIG_CRYPTO_KHAZAD is not set
544# CONFIG_CRYPTO_ANUBIS is not set
545# CONFIG_CRYPTO_SEED is not set
546# CONFIG_CRYPTO_SALSA20 is not set 801# CONFIG_CRYPTO_SALSA20 is not set
547# CONFIG_CRYPTO_SALSA20_586 is not set 802# CONFIG_CRYPTO_SALSA20_586 is not set
803# CONFIG_CRYPTO_SEED is not set
804# CONFIG_CRYPTO_SERPENT is not set
805# CONFIG_CRYPTO_TEA is not set
806# CONFIG_CRYPTO_TWOFISH is not set
807# CONFIG_CRYPTO_TWOFISH_586 is not set
808
809#
810# Compression
811#
548# CONFIG_CRYPTO_DEFLATE is not set 812# CONFIG_CRYPTO_DEFLATE is not set
549# CONFIG_CRYPTO_MICHAEL_MIC is not set 813# CONFIG_CRYPTO_ZLIB is not set
550# CONFIG_CRYPTO_CRC32C is not set
551# CONFIG_CRYPTO_CAMELLIA is not set
552# CONFIG_CRYPTO_TEST is not set
553# CONFIG_CRYPTO_AUTHENC is not set
554# CONFIG_CRYPTO_LZO is not set 814# CONFIG_CRYPTO_LZO is not set
815
816#
817# Random Number Generation
818#
819CONFIG_CRYPTO_ANSI_CPRNG=m
820# CONFIG_CRYPTO_USER_API_HASH is not set
821# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
555CONFIG_CRYPTO_HW=y 822CONFIG_CRYPTO_HW=y
823# CONFIG_BINARY_PRINTF is not set
556 824
557# 825#
558# Library routines 826# Library routines
559# 827#
560CONFIG_BITREVERSE=m 828CONFIG_BITREVERSE=y
829CONFIG_GENERIC_FIND_FIRST_BIT=y
830CONFIG_GENERIC_IO=y
561# CONFIG_CRC_CCITT is not set 831# CONFIG_CRC_CCITT is not set
562# CONFIG_CRC16 is not set 832CONFIG_CRC16=y
833# CONFIG_CRC_T10DIF is not set
563# CONFIG_CRC_ITU_T is not set 834# CONFIG_CRC_ITU_T is not set
564CONFIG_CRC32=m 835CONFIG_CRC32=y
565# CONFIG_CRC7 is not set 836# CONFIG_CRC7 is not set
566# CONFIG_LIBCRC32C is not set 837# CONFIG_LIBCRC32C is not set
567CONFIG_PLIST=y 838# CONFIG_CRC8 is not set
568 839# CONFIG_XZ_DEC is not set
569# 840# CONFIG_XZ_DEC_BCJ is not set
570# SCSI device support 841CONFIG_DQL=y
571# 842CONFIG_NLATTR=y
572# CONFIG_RAID_ATTRS is not set 843# CONFIG_AVERAGE is not set
573# CONFIG_SCSI is not set 844# CONFIG_CORDIC is not set
574# CONFIG_SCSI_DMA is not set
575# CONFIG_SCSI_NETLINK is not set
576# CONFIG_MD is not set
577# CONFIG_INPUT is not set
578 845
579# 846#
580# Kernel hacking 847# Kernel hacking
581# 848#
582# CONFIG_PRINTK_TIME is not set 849# CONFIG_PRINTK_TIME is not set
850CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
583CONFIG_ENABLE_WARN_DEPRECATED=y 851CONFIG_ENABLE_WARN_DEPRECATED=y
584CONFIG_ENABLE_MUST_CHECK=y 852CONFIG_ENABLE_MUST_CHECK=y
853CONFIG_FRAME_WARN=1024
854# CONFIG_STRIP_ASM_SYMS is not set
585# CONFIG_UNUSED_SYMBOLS is not set 855# CONFIG_UNUSED_SYMBOLS is not set
586# CONFIG_DEBUG_FS is not set 856# CONFIG_DEBUG_FS is not set
857# CONFIG_DEBUG_SECTION_MISMATCH is not set
587CONFIG_DEBUG_KERNEL=y 858CONFIG_DEBUG_KERNEL=y
588# CONFIG_DEBUG_SHIRQ is not set 859# CONFIG_DEBUG_SHIRQ is not set
589CONFIG_DETECT_SOFTLOCKUP=y 860# CONFIG_LOCKUP_DETECTOR is not set
861# CONFIG_HARDLOCKUP_DETECTOR is not set
862# CONFIG_DETECT_HUNG_TASK is not set
590CONFIG_SCHED_DEBUG=y 863CONFIG_SCHED_DEBUG=y
591# CONFIG_SCHEDSTATS is not set 864# CONFIG_SCHEDSTATS is not set
592# CONFIG_TIMER_STATS is not set 865# CONFIG_TIMER_STATS is not set
866# CONFIG_DEBUG_OBJECTS is not set
593# CONFIG_DEBUG_SLAB is not set 867# CONFIG_DEBUG_SLAB is not set
594# CONFIG_DEBUG_RT_MUTEXES is not set 868# CONFIG_DEBUG_RT_MUTEXES is not set
595# CONFIG_RT_MUTEX_TESTER is not set 869# CONFIG_RT_MUTEX_TESTER is not set
596# CONFIG_DEBUG_SPINLOCK is not set 870# CONFIG_DEBUG_SPINLOCK is not set
597# CONFIG_DEBUG_MUTEXES is not set 871# CONFIG_DEBUG_MUTEXES is not set
598# CONFIG_DEBUG_SPINLOCK_SLEEP is not set 872# CONFIG_SPARSE_RCU_POINTER is not set
873# CONFIG_DEBUG_ATOMIC_SLEEP is not set
599# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set 874# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
875# CONFIG_DEBUG_STACK_USAGE is not set
600# CONFIG_DEBUG_KOBJECT is not set 876# CONFIG_DEBUG_KOBJECT is not set
601CONFIG_DEBUG_BUGVERBOSE=y 877CONFIG_DEBUG_BUGVERBOSE=y
602CONFIG_DEBUG_INFO=y 878CONFIG_DEBUG_INFO=y
879# CONFIG_DEBUG_INFO_REDUCED is not set
603# CONFIG_DEBUG_VM is not set 880# CONFIG_DEBUG_VM is not set
881# CONFIG_DEBUG_WRITECOUNT is not set
882CONFIG_DEBUG_MEMORY_INIT=y
604# CONFIG_DEBUG_LIST is not set 883# CONFIG_DEBUG_LIST is not set
884# CONFIG_TEST_LIST_SORT is not set
605# CONFIG_DEBUG_SG is not set 885# CONFIG_DEBUG_SG is not set
886# CONFIG_DEBUG_NOTIFIERS is not set
887# CONFIG_DEBUG_CREDENTIALS is not set
606CONFIG_FRAME_POINTER=y 888CONFIG_FRAME_POINTER=y
607CONFIG_FORCED_INLINING=y
608# CONFIG_BOOT_PRINTK_DELAY is not set 889# CONFIG_BOOT_PRINTK_DELAY is not set
609# CONFIG_RCU_TORTURE_TEST is not set 890# CONFIG_RCU_TORTURE_TEST is not set
610# CONFIG_BACKTRACE_SELF_TEST is not set 891# CONFIG_BACKTRACE_SELF_TEST is not set
892# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
893# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
611# CONFIG_FAULT_INJECTION is not set 894# CONFIG_FAULT_INJECTION is not set
895# CONFIG_SYSCTL_SYSCALL_CHECK is not set
896# CONFIG_DEBUG_PAGEALLOC is not set
897# CONFIG_ATOMIC64_SELFTEST is not set
612# CONFIG_SAMPLES is not set 898# CONFIG_SAMPLES is not set
899# CONFIG_TEST_KSTRTOX is not set
613# CONFIG_GPROF is not set 900# CONFIG_GPROF is not set
614# CONFIG_GCOV is not set 901# CONFIG_GCOV is not set
615# CONFIG_DEBUG_STACK_USAGE is not set 902CONFIG_EARLY_PRINTK=y
diff --git a/arch/um/drivers/chan.h b/arch/um/drivers/chan.h
index 8df0fd9024dc..02b5a76e98d9 100644
--- a/arch/um/drivers/chan.h
+++ b/arch/um/drivers/chan.h
@@ -27,24 +27,24 @@ struct chan {
27 void *data; 27 void *data;
28}; 28};
29 29
30extern void chan_interrupt(struct list_head *chans, struct delayed_work *task, 30extern void chan_interrupt(struct line *line,
31 struct tty_struct *tty, int irq); 31 struct tty_struct *tty, int irq);
32extern int parse_chan_pair(char *str, struct line *line, int device, 32extern int parse_chan_pair(char *str, struct line *line, int device,
33 const struct chan_opts *opts, char **error_out); 33 const struct chan_opts *opts, char **error_out);
34extern int write_chan(struct list_head *chans, const char *buf, int len, 34extern int write_chan(struct chan *chan, const char *buf, int len,
35 int write_irq); 35 int write_irq);
36extern int console_write_chan(struct list_head *chans, const char *buf, 36extern int console_write_chan(struct chan *chan, const char *buf,
37 int len); 37 int len);
38extern int console_open_chan(struct line *line, struct console *co); 38extern int console_open_chan(struct line *line, struct console *co);
39extern void deactivate_chan(struct list_head *chans, int irq); 39extern void deactivate_chan(struct chan *chan, int irq);
40extern void reactivate_chan(struct list_head *chans, int irq); 40extern void reactivate_chan(struct chan *chan, int irq);
41extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty); 41extern void chan_enable_winch(struct chan *chan, struct tty_struct *tty);
42extern int enable_chan(struct line *line); 42extern int enable_chan(struct line *line);
43extern void close_chan(struct list_head *chans, int delay_free_irq); 43extern void close_chan(struct line *line);
44extern int chan_window_size(struct list_head *chans, 44extern int chan_window_size(struct line *line,
45 unsigned short *rows_out, 45 unsigned short *rows_out,
46 unsigned short *cols_out); 46 unsigned short *cols_out);
47extern int chan_config_string(struct list_head *chans, char *str, int size, 47extern int chan_config_string(struct line *line, char *str, int size,
48 char **error_out); 48 char **error_out);
49 49
50#endif 50#endif
diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c
index 420e2c800799..ca4c7ebfd0aa 100644
--- a/arch/um/drivers/chan_kern.c
+++ b/arch/um/drivers/chan_kern.c
@@ -140,18 +140,18 @@ static int open_chan(struct list_head *chans)
140 return err; 140 return err;
141} 141}
142 142
143void chan_enable_winch(struct list_head *chans, struct tty_struct *tty) 143void chan_enable_winch(struct chan *chan, struct tty_struct *tty)
144{ 144{
145 struct list_head *ele; 145 if (chan && chan->primary && chan->ops->winch)
146 struct chan *chan; 146 register_winch(chan->fd, tty);
147}
147 148
148 list_for_each(ele, chans) { 149static void line_timer_cb(struct work_struct *work)
149 chan = list_entry(ele, struct chan, list); 150{
150 if (chan->primary && chan->output && chan->ops->winch) { 151 struct line *line = container_of(work, struct line, task.work);
151 register_winch(chan->fd, tty); 152
152 return; 153 if (!line->throttled)
153 } 154 chan_interrupt(line, line->tty, line->driver->read_irq);
154 }
155} 155}
156 156
157int enable_chan(struct line *line) 157int enable_chan(struct line *line)
@@ -160,6 +160,8 @@ int enable_chan(struct line *line)
160 struct chan *chan; 160 struct chan *chan;
161 int err; 161 int err;
162 162
163 INIT_DELAYED_WORK(&line->task, line_timer_cb);
164
163 list_for_each(ele, &line->chan_list) { 165 list_for_each(ele, &line->chan_list) {
164 chan = list_entry(ele, struct chan, list); 166 chan = list_entry(ele, struct chan, list);
165 err = open_one_chan(chan); 167 err = open_one_chan(chan);
@@ -183,7 +185,7 @@ int enable_chan(struct line *line)
183 return 0; 185 return 0;
184 186
185 out_close: 187 out_close:
186 close_chan(&line->chan_list, 0); 188 close_chan(line);
187 return err; 189 return err;
188} 190}
189 191
@@ -244,7 +246,7 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
244 chan->fd = -1; 246 chan->fd = -1;
245} 247}
246 248
247void close_chan(struct list_head *chans, int delay_free_irq) 249void close_chan(struct line *line)
248{ 250{
249 struct chan *chan; 251 struct chan *chan;
250 252
@@ -253,77 +255,50 @@ void close_chan(struct list_head *chans, int delay_free_irq)
253 * state. Then, the first one opened will have the original state, 255 * state. Then, the first one opened will have the original state,
254 * so it must be the last closed. 256 * so it must be the last closed.
255 */ 257 */
256 list_for_each_entry_reverse(chan, chans, list) { 258 list_for_each_entry_reverse(chan, &line->chan_list, list) {
257 close_one_chan(chan, delay_free_irq); 259 close_one_chan(chan, 0);
258 } 260 }
259} 261}
260 262
261void deactivate_chan(struct list_head *chans, int irq) 263void deactivate_chan(struct chan *chan, int irq)
262{ 264{
263 struct list_head *ele; 265 if (chan && chan->enabled)
264 266 deactivate_fd(chan->fd, irq);
265 struct chan *chan;
266 list_for_each(ele, chans) {
267 chan = list_entry(ele, struct chan, list);
268
269 if (chan->enabled && chan->input)
270 deactivate_fd(chan->fd, irq);
271 }
272} 267}
273 268
274void reactivate_chan(struct list_head *chans, int irq) 269void reactivate_chan(struct chan *chan, int irq)
275{ 270{
276 struct list_head *ele; 271 if (chan && chan->enabled)
277 struct chan *chan; 272 reactivate_fd(chan->fd, irq);
278
279 list_for_each(ele, chans) {
280 chan = list_entry(ele, struct chan, list);
281
282 if (chan->enabled && chan->input)
283 reactivate_fd(chan->fd, irq);
284 }
285} 273}
286 274
287int write_chan(struct list_head *chans, const char *buf, int len, 275int write_chan(struct chan *chan, const char *buf, int len,
288 int write_irq) 276 int write_irq)
289{ 277{
290 struct list_head *ele;
291 struct chan *chan = NULL;
292 int n, ret = 0; 278 int n, ret = 0;
293 279
294 if (len == 0) 280 if (len == 0 || !chan || !chan->ops->write)
295 return 0; 281 return 0;
296 282
297 list_for_each(ele, chans) { 283 n = chan->ops->write(chan->fd, buf, len, chan->data);
298 chan = list_entry(ele, struct chan, list); 284 if (chan->primary) {
299 if (!chan->output || (chan->ops->write == NULL)) 285 ret = n;
300 continue; 286 if ((ret == -EAGAIN) || ((ret >= 0) && (ret < len)))
301 287 reactivate_fd(chan->fd, write_irq);
302 n = chan->ops->write(chan->fd, buf, len, chan->data);
303 if (chan->primary) {
304 ret = n;
305 if ((ret == -EAGAIN) || ((ret >= 0) && (ret < len)))
306 reactivate_fd(chan->fd, write_irq);
307 }
308 } 288 }
309 return ret; 289 return ret;
310} 290}
311 291
312int console_write_chan(struct list_head *chans, const char *buf, int len) 292int console_write_chan(struct chan *chan, const char *buf, int len)
313{ 293{
314 struct list_head *ele;
315 struct chan *chan;
316 int n, ret = 0; 294 int n, ret = 0;
317 295
318 list_for_each(ele, chans) { 296 if (!chan || !chan->ops->console_write)
319 chan = list_entry(ele, struct chan, list); 297 return 0;
320 if (!chan->output || (chan->ops->console_write == NULL))
321 continue;
322 298
323 n = chan->ops->console_write(chan->fd, buf, len); 299 n = chan->ops->console_write(chan->fd, buf, len);
324 if (chan->primary) 300 if (chan->primary)
325 ret = n; 301 ret = n;
326 }
327 return ret; 302 return ret;
328} 303}
329 304
@@ -340,20 +315,24 @@ int console_open_chan(struct line *line, struct console *co)
340 return 0; 315 return 0;
341} 316}
342 317
343int chan_window_size(struct list_head *chans, unsigned short *rows_out, 318int chan_window_size(struct line *line, unsigned short *rows_out,
344 unsigned short *cols_out) 319 unsigned short *cols_out)
345{ 320{
346 struct list_head *ele;
347 struct chan *chan; 321 struct chan *chan;
348 322
349 list_for_each(ele, chans) { 323 chan = line->chan_in;
350 chan = list_entry(ele, struct chan, list); 324 if (chan && chan->primary) {
351 if (chan->primary) { 325 if (chan->ops->window_size == NULL)
352 if (chan->ops->window_size == NULL) 326 return 0;
353 return 0; 327 return chan->ops->window_size(chan->fd, chan->data,
354 return chan->ops->window_size(chan->fd, chan->data, 328 rows_out, cols_out);
355 rows_out, cols_out); 329 }
356 } 330 chan = line->chan_out;
331 if (chan && chan->primary) {
332 if (chan->ops->window_size == NULL)
333 return 0;
334 return chan->ops->window_size(chan->fd, chan->data,
335 rows_out, cols_out);
357 } 336 }
358 return 0; 337 return 0;
359} 338}
@@ -429,21 +408,15 @@ static int chan_pair_config_string(struct chan *in, struct chan *out,
429 return n; 408 return n;
430} 409}
431 410
432int chan_config_string(struct list_head *chans, char *str, int size, 411int chan_config_string(struct line *line, char *str, int size,
433 char **error_out) 412 char **error_out)
434{ 413{
435 struct list_head *ele; 414 struct chan *in = line->chan_in, *out = line->chan_out;
436 struct chan *chan, *in = NULL, *out = NULL;
437 415
438 list_for_each(ele, chans) { 416 if (in && !in->primary)
439 chan = list_entry(ele, struct chan, list); 417 in = NULL;
440 if (!chan->primary) 418 if (out && !out->primary)
441 continue; 419 out = NULL;
442 if (chan->input)
443 in = chan;
444 if (chan->output)
445 out = chan;
446 }
447 420
448 return chan_pair_config_string(in, out, str, size, error_out); 421 return chan_pair_config_string(in, out, str, size, error_out);
449} 422}
@@ -547,10 +520,14 @@ int parse_chan_pair(char *str, struct line *line, int device,
547 char *in, *out; 520 char *in, *out;
548 521
549 if (!list_empty(chans)) { 522 if (!list_empty(chans)) {
523 line->chan_in = line->chan_out = NULL;
550 free_chan(chans); 524 free_chan(chans);
551 INIT_LIST_HEAD(chans); 525 INIT_LIST_HEAD(chans);
552 } 526 }
553 527
528 if (!str)
529 return 0;
530
554 out = strchr(str, ','); 531 out = strchr(str, ',');
555 if (out != NULL) { 532 if (out != NULL) {
556 in = str; 533 in = str;
@@ -562,6 +539,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
562 539
563 new->input = 1; 540 new->input = 1;
564 list_add(&new->list, chans); 541 list_add(&new->list, chans);
542 line->chan_in = new;
565 543
566 new = parse_chan(line, out, device, opts, error_out); 544 new = parse_chan(line, out, device, opts, error_out);
567 if (new == NULL) 545 if (new == NULL)
@@ -569,6 +547,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
569 547
570 list_add(&new->list, chans); 548 list_add(&new->list, chans);
571 new->output = 1; 549 new->output = 1;
550 line->chan_out = new;
572 } 551 }
573 else { 552 else {
574 new = parse_chan(line, str, device, opts, error_out); 553 new = parse_chan(line, str, device, opts, error_out);
@@ -578,43 +557,42 @@ int parse_chan_pair(char *str, struct line *line, int device,
578 list_add(&new->list, chans); 557 list_add(&new->list, chans);
579 new->input = 1; 558 new->input = 1;
580 new->output = 1; 559 new->output = 1;
560 line->chan_in = line->chan_out = new;
581 } 561 }
582 return 0; 562 return 0;
583} 563}
584 564
585void chan_interrupt(struct list_head *chans, struct delayed_work *task, 565void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
586 struct tty_struct *tty, int irq)
587{ 566{
588 struct list_head *ele, *next; 567 struct chan *chan = line->chan_in;
589 struct chan *chan;
590 int err; 568 int err;
591 char c; 569 char c;
592 570
593 list_for_each_safe(ele, next, chans) { 571 if (!chan || !chan->ops->read)
594 chan = list_entry(ele, struct chan, list); 572 goto out;
595 if (!chan->input || (chan->ops->read == NULL)) 573
596 continue; 574 do {
597 do { 575 if (tty && !tty_buffer_request_room(tty, 1)) {
598 if (tty && !tty_buffer_request_room(tty, 1)) { 576 schedule_delayed_work(&line->task, 1);
599 schedule_delayed_work(task, 1); 577 goto out;
600 goto out;
601 }
602 err = chan->ops->read(chan->fd, &c, chan->data);
603 if (err > 0)
604 tty_receive_char(tty, c);
605 } while (err > 0);
606
607 if (err == 0)
608 reactivate_fd(chan->fd, irq);
609 if (err == -EIO) {
610 if (chan->primary) {
611 if (tty != NULL)
612 tty_hangup(tty);
613 close_chan(chans, 1);
614 return;
615 }
616 else close_one_chan(chan, 1);
617 } 578 }
579 err = chan->ops->read(chan->fd, &c, chan->data);
580 if (err > 0)
581 tty_receive_char(tty, c);
582 } while (err > 0);
583
584 if (err == 0)
585 reactivate_fd(chan->fd, irq);
586 if (err == -EIO) {
587 if (chan->primary) {
588 if (tty != NULL)
589 tty_hangup(tty);
590 if (line->chan_out != chan)
591 close_one_chan(line->chan_out, 1);
592 }
593 close_one_chan(chan, 1);
594 if (chan->primary)
595 return;
618 } 596 }
619 out: 597 out:
620 if (tty) 598 if (tty)
diff --git a/arch/um/drivers/chan_user.h b/arch/um/drivers/chan_user.h
index 9b9ced85b703..6257b7a6e1af 100644
--- a/arch/um/drivers/chan_user.h
+++ b/arch/um/drivers/chan_user.h
@@ -14,8 +14,6 @@ struct chan_opts {
14 const int raw; 14 const int raw;
15}; 15};
16 16
17enum chan_init_pri { INIT_STATIC, INIT_ALL, INIT_ONE };
18
19struct chan_ops { 17struct chan_ops {
20 char *type; 18 char *type;
21 void *(*init)(char *, int, const struct chan_opts *); 19 void *(*init)(char *, int, const struct chan_opts *);
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
index c1cf2206b84b..4ab0d9c0911c 100644
--- a/arch/um/drivers/line.c
+++ b/arch/um/drivers/line.c
@@ -21,19 +21,10 @@ static irqreturn_t line_interrupt(int irq, void *data)
21 struct line *line = chan->line; 21 struct line *line = chan->line;
22 22
23 if (line) 23 if (line)
24 chan_interrupt(&line->chan_list, &line->task, line->tty, irq); 24 chan_interrupt(line, line->tty, irq);
25 return IRQ_HANDLED; 25 return IRQ_HANDLED;
26} 26}
27 27
28static void line_timer_cb(struct work_struct *work)
29{
30 struct line *line = container_of(work, struct line, task.work);
31
32 if (!line->throttled)
33 chan_interrupt(&line->chan_list, &line->task, line->tty,
34 line->driver->read_irq);
35}
36
37/* 28/*
38 * Returns the free space inside the ring buffer of this line. 29 * Returns the free space inside the ring buffer of this line.
39 * 30 *
@@ -145,7 +136,7 @@ static int flush_buffer(struct line *line)
145 /* line->buffer + LINE_BUFSIZE is the end of the buffer! */ 136 /* line->buffer + LINE_BUFSIZE is the end of the buffer! */
146 count = line->buffer + LINE_BUFSIZE - line->head; 137 count = line->buffer + LINE_BUFSIZE - line->head;
147 138
148 n = write_chan(&line->chan_list, line->head, count, 139 n = write_chan(line->chan_out, line->head, count,
149 line->driver->write_irq); 140 line->driver->write_irq);
150 if (n < 0) 141 if (n < 0)
151 return n; 142 return n;
@@ -162,7 +153,7 @@ static int flush_buffer(struct line *line)
162 } 153 }
163 154
164 count = line->tail - line->head; 155 count = line->tail - line->head;
165 n = write_chan(&line->chan_list, line->head, count, 156 n = write_chan(line->chan_out, line->head, count,
166 line->driver->write_irq); 157 line->driver->write_irq);
167 158
168 if (n < 0) 159 if (n < 0)
@@ -206,7 +197,7 @@ int line_write(struct tty_struct *tty, const unsigned char *buf, int len)
206 if (line->head != line->tail) 197 if (line->head != line->tail)
207 ret = buffer_data(line, buf, len); 198 ret = buffer_data(line, buf, len);
208 else { 199 else {
209 n = write_chan(&line->chan_list, buf, len, 200 n = write_chan(line->chan_out, buf, len,
210 line->driver->write_irq); 201 line->driver->write_irq);
211 if (n < 0) { 202 if (n < 0) {
212 ret = n; 203 ret = n;
@@ -318,7 +309,7 @@ void line_throttle(struct tty_struct *tty)
318{ 309{
319 struct line *line = tty->driver_data; 310 struct line *line = tty->driver_data;
320 311
321 deactivate_chan(&line->chan_list, line->driver->read_irq); 312 deactivate_chan(line->chan_in, line->driver->read_irq);
322 line->throttled = 1; 313 line->throttled = 1;
323} 314}
324 315
@@ -327,8 +318,7 @@ void line_unthrottle(struct tty_struct *tty)
327 struct line *line = tty->driver_data; 318 struct line *line = tty->driver_data;
328 319
329 line->throttled = 0; 320 line->throttled = 0;
330 chan_interrupt(&line->chan_list, &line->task, tty, 321 chan_interrupt(line, tty, line->driver->read_irq);
331 line->driver->read_irq);
332 322
333 /* 323 /*
334 * Maybe there is enough stuff pending that calling the interrupt 324 * Maybe there is enough stuff pending that calling the interrupt
@@ -336,7 +326,7 @@ void line_unthrottle(struct tty_struct *tty)
336 * again and we shouldn't turn the interrupt back on. 326 * again and we shouldn't turn the interrupt back on.
337 */ 327 */
338 if (!line->throttled) 328 if (!line->throttled)
339 reactivate_chan(&line->chan_list, line->driver->read_irq); 329 reactivate_chan(line->chan_in, line->driver->read_irq);
340} 330}
341 331
342static irqreturn_t line_write_interrupt(int irq, void *data) 332static irqreturn_t line_write_interrupt(int irq, void *data)
@@ -347,13 +337,14 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
347 int err; 337 int err;
348 338
349 /* 339 /*
350 * Interrupts are disabled here because we registered the interrupt with 340 * Interrupts are disabled here because genirq keep irqs disabled when
351 * IRQF_DISABLED (see line_setup_irq). 341 * calling the action handler.
352 */ 342 */
353 343
354 spin_lock(&line->lock); 344 spin_lock(&line->lock);
355 err = flush_buffer(line); 345 err = flush_buffer(line);
356 if (err == 0) { 346 if (err == 0) {
347 spin_unlock(&line->lock);
357 return IRQ_NONE; 348 return IRQ_NONE;
358 } else if (err < 0) { 349 } else if (err < 0) {
359 line->head = line->buffer; 350 line->head = line->buffer;
@@ -371,7 +362,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
371int line_setup_irq(int fd, int input, int output, struct line *line, void *data) 362int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
372{ 363{
373 const struct line_driver *driver = line->driver; 364 const struct line_driver *driver = line->driver;
374 int err = 0, flags = IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM; 365 int err = 0, flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM;
375 366
376 if (input) 367 if (input)
377 err = um_request_irq(driver->read_irq, fd, IRQ_READ, 368 err = um_request_irq(driver->read_irq, fd, IRQ_READ,
@@ -383,7 +374,6 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
383 err = um_request_irq(driver->write_irq, fd, IRQ_WRITE, 374 err = um_request_irq(driver->write_irq, fd, IRQ_WRITE,
384 line_write_interrupt, flags, 375 line_write_interrupt, flags,
385 driver->write_irq_name, data); 376 driver->write_irq_name, data);
386 line->have_irq = 1;
387 return err; 377 return err;
388} 378}
389 379
@@ -409,7 +399,7 @@ int line_open(struct line *lines, struct tty_struct *tty)
409 struct line *line = &lines[tty->index]; 399 struct line *line = &lines[tty->index];
410 int err = -ENODEV; 400 int err = -ENODEV;
411 401
412 spin_lock(&line->count_lock); 402 mutex_lock(&line->count_lock);
413 if (!line->valid) 403 if (!line->valid)
414 goto out_unlock; 404 goto out_unlock;
415 405
@@ -421,25 +411,19 @@ int line_open(struct line *lines, struct tty_struct *tty)
421 tty->driver_data = line; 411 tty->driver_data = line;
422 line->tty = tty; 412 line->tty = tty;
423 413
424 spin_unlock(&line->count_lock);
425 err = enable_chan(line); 414 err = enable_chan(line);
426 if (err) /* line_close() will be called by our caller */ 415 if (err) /* line_close() will be called by our caller */
427 return err; 416 goto out_unlock;
428
429 INIT_DELAYED_WORK(&line->task, line_timer_cb);
430 417
431 if (!line->sigio) { 418 if (!line->sigio) {
432 chan_enable_winch(&line->chan_list, tty); 419 chan_enable_winch(line->chan_out, tty);
433 line->sigio = 1; 420 line->sigio = 1;
434 } 421 }
435 422
436 chan_window_size(&line->chan_list, &tty->winsize.ws_row, 423 chan_window_size(line, &tty->winsize.ws_row,
437 &tty->winsize.ws_col); 424 &tty->winsize.ws_col);
438
439 return 0;
440
441out_unlock: 425out_unlock:
442 spin_unlock(&line->count_lock); 426 mutex_unlock(&line->count_lock);
443 return err; 427 return err;
444} 428}
445 429
@@ -459,7 +443,7 @@ void line_close(struct tty_struct *tty, struct file * filp)
459 /* We ignore the error anyway! */ 443 /* We ignore the error anyway! */
460 flush_buffer(line); 444 flush_buffer(line);
461 445
462 spin_lock(&line->count_lock); 446 mutex_lock(&line->count_lock);
463 BUG_ON(!line->valid); 447 BUG_ON(!line->valid);
464 448
465 if (--line->count) 449 if (--line->count)
@@ -468,17 +452,13 @@ void line_close(struct tty_struct *tty, struct file * filp)
468 line->tty = NULL; 452 line->tty = NULL;
469 tty->driver_data = NULL; 453 tty->driver_data = NULL;
470 454
471 spin_unlock(&line->count_lock);
472
473 if (line->sigio) { 455 if (line->sigio) {
474 unregister_winch(tty); 456 unregister_winch(tty);
475 line->sigio = 0; 457 line->sigio = 0;
476 } 458 }
477 459
478 return;
479
480out_unlock: 460out_unlock:
481 spin_unlock(&line->count_lock); 461 mutex_unlock(&line->count_lock);
482} 462}
483 463
484void close_lines(struct line *lines, int nlines) 464void close_lines(struct line *lines, int nlines)
@@ -486,34 +466,60 @@ void close_lines(struct line *lines, int nlines)
486 int i; 466 int i;
487 467
488 for(i = 0; i < nlines; i++) 468 for(i = 0; i < nlines; i++)
489 close_chan(&lines[i].chan_list, 0); 469 close_chan(&lines[i]);
490} 470}
491 471
492static int setup_one_line(struct line *lines, int n, char *init, int init_prio, 472int setup_one_line(struct line *lines, int n, char *init,
493 char **error_out) 473 const struct chan_opts *opts, char **error_out)
494{ 474{
495 struct line *line = &lines[n]; 475 struct line *line = &lines[n];
476 struct tty_driver *driver = line->driver->driver;
496 int err = -EINVAL; 477 int err = -EINVAL;
497 478
498 spin_lock(&line->count_lock); 479 mutex_lock(&line->count_lock);
499 480
500 if (line->count) { 481 if (line->count) {
501 *error_out = "Device is already open"; 482 *error_out = "Device is already open";
502 goto out; 483 goto out;
503 } 484 }
504 485
505 if (line->init_pri <= init_prio) { 486 if (!strcmp(init, "none")) {
506 line->init_pri = init_prio; 487 if (line->valid) {
507 if (!strcmp(init, "none")) 488 line->valid = 0;
489 kfree(line->init_str);
490 tty_unregister_device(driver, n);
491 parse_chan_pair(NULL, line, n, opts, error_out);
492 err = 0;
493 }
494 } else {
495 char *new = kstrdup(init, GFP_KERNEL);
496 if (!new) {
497 *error_out = "Failed to allocate memory";
498 return -ENOMEM;
499 }
500 if (line->valid) {
501 tty_unregister_device(driver, n);
502 kfree(line->init_str);
503 }
504 line->init_str = new;
505 line->valid = 1;
506 err = parse_chan_pair(new, line, n, opts, error_out);
507 if (!err) {
508 struct device *d = tty_register_device(driver, n, NULL);
509 if (IS_ERR(d)) {
510 *error_out = "Failed to register device";
511 err = PTR_ERR(d);
512 parse_chan_pair(NULL, line, n, opts, error_out);
513 }
514 }
515 if (err) {
516 line->init_str = NULL;
508 line->valid = 0; 517 line->valid = 0;
509 else { 518 kfree(new);
510 line->init_str = init;
511 line->valid = 1;
512 } 519 }
513 } 520 }
514 err = 0;
515out: 521out:
516 spin_unlock(&line->count_lock); 522 mutex_unlock(&line->count_lock);
517 return err; 523 return err;
518} 524}
519 525
@@ -524,54 +530,43 @@ out:
524 * @error_out is an error string in the case of failure; 530 * @error_out is an error string in the case of failure;
525 */ 531 */
526 532
527int line_setup(struct line *lines, unsigned int num, char *init, 533int line_setup(char **conf, unsigned int num, char **def,
528 char **error_out) 534 char *init, char *name)
529{ 535{
530 int i, n, err; 536 char *error;
531 char *end;
532 537
533 if (*init == '=') { 538 if (*init == '=') {
534 /* 539 /*
535 * We said con=/ssl= instead of con#=, so we are configuring all 540 * We said con=/ssl= instead of con#=, so we are configuring all
536 * consoles at once. 541 * consoles at once.
537 */ 542 */
538 n = -1; 543 *def = init + 1;
539 } 544 } else {
540 else { 545 char *end;
541 n = simple_strtoul(init, &end, 0); 546 unsigned n = simple_strtoul(init, &end, 0);
547
542 if (*end != '=') { 548 if (*end != '=') {
543 *error_out = "Couldn't parse device number"; 549 error = "Couldn't parse device number";
544 return -EINVAL; 550 goto out;
545 } 551 }
546 init = end; 552 if (n >= num) {
547 } 553 error = "Device number out of range";
548 init++; 554 goto out;
549
550 if (n >= (signed int) num) {
551 *error_out = "Device number out of range";
552 return -EINVAL;
553 }
554 else if (n >= 0) {
555 err = setup_one_line(lines, n, init, INIT_ONE, error_out);
556 if (err)
557 return err;
558 }
559 else {
560 for(i = 0; i < num; i++) {
561 err = setup_one_line(lines, i, init, INIT_ALL,
562 error_out);
563 if (err)
564 return err;
565 } 555 }
556 conf[n] = end + 1;
566 } 557 }
567 return n == -1 ? num : n; 558 return 0;
559
560out:
561 printk(KERN_ERR "Failed to set up %s with "
562 "configuration string \"%s\" : %s\n", name, init, error);
563 return -EINVAL;
568} 564}
569 565
570int line_config(struct line *lines, unsigned int num, char *str, 566int line_config(struct line *lines, unsigned int num, char *str,
571 const struct chan_opts *opts, char **error_out) 567 const struct chan_opts *opts, char **error_out)
572{ 568{
573 struct line *line; 569 char *end;
574 char *new;
575 int n; 570 int n;
576 571
577 if (*str == '=') { 572 if (*str == '=') {
@@ -579,17 +574,17 @@ int line_config(struct line *lines, unsigned int num, char *str,
579 return -EINVAL; 574 return -EINVAL;
580 } 575 }
581 576
582 new = kstrdup(str, GFP_KERNEL); 577 n = simple_strtoul(str, &end, 0);
583 if (new == NULL) { 578 if (*end++ != '=') {
584 *error_out = "Failed to allocate memory"; 579 *error_out = "Couldn't parse device number";
585 return -ENOMEM; 580 return -EINVAL;
581 }
582 if (n >= num) {
583 *error_out = "Device number out of range";
584 return -EINVAL;
586 } 585 }
587 n = line_setup(lines, num, new, error_out);
588 if (n < 0)
589 return n;
590 586
591 line = &lines[n]; 587 return setup_one_line(lines, n, end, opts, error_out);
592 return parse_chan_pair(line->init_str, line, n, opts, error_out);
593} 588}
594 589
595int line_get_config(char *name, struct line *lines, unsigned int num, char *str, 590int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
@@ -612,13 +607,13 @@ int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
612 607
613 line = &lines[dev]; 608 line = &lines[dev];
614 609
615 spin_lock(&line->count_lock); 610 mutex_lock(&line->count_lock);
616 if (!line->valid) 611 if (!line->valid)
617 CONFIG_CHUNK(str, size, n, "none", 1); 612 CONFIG_CHUNK(str, size, n, "none", 1);
618 else if (line->tty == NULL) 613 else if (line->tty == NULL)
619 CONFIG_CHUNK(str, size, n, line->init_str, 1); 614 CONFIG_CHUNK(str, size, n, line->init_str, 1);
620 else n = chan_config_string(&line->chan_list, str, size, error_out); 615 else n = chan_config_string(line, str, size, error_out);
621 spin_unlock(&line->count_lock); 616 mutex_unlock(&line->count_lock);
622 617
623 return n; 618 return n;
624} 619}
@@ -640,25 +635,23 @@ int line_id(char **str, int *start_out, int *end_out)
640 635
641int line_remove(struct line *lines, unsigned int num, int n, char **error_out) 636int line_remove(struct line *lines, unsigned int num, int n, char **error_out)
642{ 637{
643 int err; 638 if (n >= num) {
644 char config[sizeof("conxxxx=none\0")]; 639 *error_out = "Device number out of range";
645 640 return -EINVAL;
646 sprintf(config, "%d=none", n); 641 }
647 err = line_setup(lines, num, config, error_out); 642 return setup_one_line(lines, n, "none", NULL, error_out);
648 if (err >= 0)
649 err = 0;
650 return err;
651} 643}
652 644
653struct tty_driver *register_lines(struct line_driver *line_driver, 645int register_lines(struct line_driver *line_driver,
654 const struct tty_operations *ops, 646 const struct tty_operations *ops,
655 struct line *lines, int nlines) 647 struct line *lines, int nlines)
656{ 648{
657 int i;
658 struct tty_driver *driver = alloc_tty_driver(nlines); 649 struct tty_driver *driver = alloc_tty_driver(nlines);
650 int err;
651 int i;
659 652
660 if (!driver) 653 if (!driver)
661 return NULL; 654 return -ENOMEM;
662 655
663 driver->driver_name = line_driver->name; 656 driver->driver_name = line_driver->name;
664 driver->name = line_driver->device_name; 657 driver->name = line_driver->device_name;
@@ -666,54 +659,33 @@ struct tty_driver *register_lines(struct line_driver *line_driver,
666 driver->minor_start = line_driver->minor_start; 659 driver->minor_start = line_driver->minor_start;
667 driver->type = line_driver->type; 660 driver->type = line_driver->type;
668 driver->subtype = line_driver->subtype; 661 driver->subtype = line_driver->subtype;
669 driver->flags = TTY_DRIVER_REAL_RAW; 662 driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
670 driver->init_termios = tty_std_termios; 663 driver->init_termios = tty_std_termios;
664
665 for (i = 0; i < nlines; i++) {
666 spin_lock_init(&lines[i].lock);
667 mutex_init(&lines[i].count_lock);
668 lines[i].driver = line_driver;
669 INIT_LIST_HEAD(&lines[i].chan_list);
670 }
671 tty_set_operations(driver, ops); 671 tty_set_operations(driver, ops);
672 672
673 if (tty_register_driver(driver)) { 673 err = tty_register_driver(driver);
674 if (err) {
674 printk(KERN_ERR "register_lines : can't register %s driver\n", 675 printk(KERN_ERR "register_lines : can't register %s driver\n",
675 line_driver->name); 676 line_driver->name);
676 put_tty_driver(driver); 677 put_tty_driver(driver);
677 return NULL; 678 return err;
678 }
679
680 for(i = 0; i < nlines; i++) {
681 if (!lines[i].valid)
682 tty_unregister_device(driver, i);
683 } 679 }
684 680
681 line_driver->driver = driver;
685 mconsole_register_dev(&line_driver->mc); 682 mconsole_register_dev(&line_driver->mc);
686 return driver; 683 return 0;
687} 684}
688 685
689static DEFINE_SPINLOCK(winch_handler_lock); 686static DEFINE_SPINLOCK(winch_handler_lock);
690static LIST_HEAD(winch_handlers); 687static LIST_HEAD(winch_handlers);
691 688
692void lines_init(struct line *lines, int nlines, struct chan_opts *opts)
693{
694 struct line *line;
695 char *error;
696 int i;
697
698 for(i = 0; i < nlines; i++) {
699 line = &lines[i];
700 INIT_LIST_HEAD(&line->chan_list);
701
702 if (line->init_str == NULL)
703 continue;
704
705 line->init_str = kstrdup(line->init_str, GFP_KERNEL);
706 if (line->init_str == NULL)
707 printk(KERN_ERR "lines_init - kstrdup returned NULL\n");
708
709 if (parse_chan_pair(line->init_str, line, i, opts, &error)) {
710 printk(KERN_ERR "parse_chan_pair failed for "
711 "device %d : %s\n", i, error);
712 line->valid = 0;
713 }
714 }
715}
716
717struct winch { 689struct winch {
718 struct list_head list; 690 struct list_head list;
719 int fd; 691 int fd;
@@ -777,7 +749,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
777 if (tty != NULL) { 749 if (tty != NULL) {
778 line = tty->driver_data; 750 line = tty->driver_data;
779 if (line != NULL) { 751 if (line != NULL) {
780 chan_window_size(&line->chan_list, &tty->winsize.ws_row, 752 chan_window_size(line, &tty->winsize.ws_row,
781 &tty->winsize.ws_col); 753 &tty->winsize.ws_col);
782 kill_pgrp(tty->pgrp, SIGWINCH, 1); 754 kill_pgrp(tty->pgrp, SIGWINCH, 1);
783 } 755 }
@@ -807,7 +779,7 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty,
807 .stack = stack }); 779 .stack = stack });
808 780
809 if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, 781 if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
810 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 782 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
811 "winch", winch) < 0) { 783 "winch", winch) < 0) {
812 printk(KERN_ERR "register_winch_irq - failed to register " 784 printk(KERN_ERR "register_winch_irq - failed to register "
813 "IRQ\n"); 785 "IRQ\n");
diff --git a/arch/um/drivers/line.h b/arch/um/drivers/line.h
index 63df3ca02ac2..0a1834719dba 100644
--- a/arch/um/drivers/line.h
+++ b/arch/um/drivers/line.h
@@ -15,7 +15,7 @@
15#include "chan_user.h" 15#include "chan_user.h"
16#include "mconsole_kern.h" 16#include "mconsole_kern.h"
17 17
18/* There's only one modifiable field in this - .mc.list */ 18/* There's only two modifiable fields in this - .mc.list and .driver */
19struct line_driver { 19struct line_driver {
20 const char *name; 20 const char *name;
21 const char *device_name; 21 const char *device_name;
@@ -28,17 +28,18 @@ struct line_driver {
28 const int write_irq; 28 const int write_irq;
29 const char *write_irq_name; 29 const char *write_irq_name;
30 struct mc_device mc; 30 struct mc_device mc;
31 struct tty_driver *driver;
31}; 32};
32 33
33struct line { 34struct line {
34 struct tty_struct *tty; 35 struct tty_struct *tty;
35 spinlock_t count_lock; 36 struct mutex count_lock;
36 unsigned long count; 37 unsigned long count;
37 int valid; 38 int valid;
38 39
39 char *init_str; 40 char *init_str;
40 int init_pri;
41 struct list_head chan_list; 41 struct list_head chan_list;
42 struct chan *chan_in, *chan_out;
42 43
43 /*This lock is actually, mostly, local to*/ 44 /*This lock is actually, mostly, local to*/
44 spinlock_t lock; 45 spinlock_t lock;
@@ -55,21 +56,12 @@ struct line {
55 int sigio; 56 int sigio;
56 struct delayed_work task; 57 struct delayed_work task;
57 const struct line_driver *driver; 58 const struct line_driver *driver;
58 int have_irq;
59}; 59};
60 60
61#define LINE_INIT(str, d) \
62 { .count_lock = __SPIN_LOCK_UNLOCKED((str).count_lock), \
63 .init_str = str, \
64 .init_pri = INIT_STATIC, \
65 .valid = 1, \
66 .lock = __SPIN_LOCK_UNLOCKED((str).lock), \
67 .driver = d }
68
69extern void line_close(struct tty_struct *tty, struct file * filp); 61extern void line_close(struct tty_struct *tty, struct file * filp);
70extern int line_open(struct line *lines, struct tty_struct *tty); 62extern int line_open(struct line *lines, struct tty_struct *tty);
71extern int line_setup(struct line *lines, unsigned int sizeof_lines, 63extern int line_setup(char **conf, unsigned nlines, char **def,
72 char *init, char **error_out); 64 char *init, char *name);
73extern int line_write(struct tty_struct *tty, const unsigned char *buf, 65extern int line_write(struct tty_struct *tty, const unsigned char *buf,
74 int len); 66 int len);
75extern int line_put_char(struct tty_struct *tty, unsigned char ch); 67extern int line_put_char(struct tty_struct *tty, unsigned char ch);
@@ -87,10 +79,11 @@ extern char *add_xterm_umid(char *base);
87extern int line_setup_irq(int fd, int input, int output, struct line *line, 79extern int line_setup_irq(int fd, int input, int output, struct line *line,
88 void *data); 80 void *data);
89extern void line_close_chan(struct line *line); 81extern void line_close_chan(struct line *line);
90extern struct tty_driver *register_lines(struct line_driver *line_driver, 82extern int register_lines(struct line_driver *line_driver,
91 const struct tty_operations *driver, 83 const struct tty_operations *driver,
92 struct line *lines, int nlines); 84 struct line *lines, int nlines);
93extern void lines_init(struct line *lines, int nlines, struct chan_opts *opts); 85extern int setup_one_line(struct line *lines, int n, char *init,
86 const struct chan_opts *opts, char **error_out);
94extern void close_lines(struct line *lines, int nlines); 87extern void close_lines(struct line *lines, int nlines);
95 88
96extern int line_config(struct line *lines, unsigned int sizeof_lines, 89extern int line_config(struct line *lines, unsigned int sizeof_lines,
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
index c70e047eed72..e672bd6d43e3 100644
--- a/arch/um/drivers/mconsole_kern.c
+++ b/arch/um/drivers/mconsole_kern.c
@@ -773,7 +773,7 @@ static int __init mconsole_init(void)
773 register_reboot_notifier(&reboot_notifier); 773 register_reboot_notifier(&reboot_notifier);
774 774
775 err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt, 775 err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt,
776 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 776 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
777 "mconsole", (void *)sock); 777 "mconsole", (void *)sock);
778 if (err) { 778 if (err) {
779 printk(KERN_ERR "Failed to get IRQ for management console\n"); 779 printk(KERN_ERR "Failed to get IRQ for management console\n");
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c
index d2996183e584..95f4416e6d9f 100644
--- a/arch/um/drivers/net_kern.c
+++ b/arch/um/drivers/net_kern.c
@@ -161,7 +161,7 @@ static int uml_net_open(struct net_device *dev)
161 } 161 }
162 162
163 err = um_request_irq(dev->irq, lp->fd, IRQ_READ, uml_net_interrupt, 163 err = um_request_irq(dev->irq, lp->fd, IRQ_READ, uml_net_interrupt,
164 IRQF_DISABLED | IRQF_SHARED, dev->name, dev); 164 IRQF_SHARED, dev->name, dev);
165 if (err != 0) { 165 if (err != 0) {
166 printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err); 166 printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err);
167 err = -ENETUNREACH; 167 err = -ENETUNREACH;
diff --git a/arch/um/drivers/port_kern.c b/arch/um/drivers/port_kern.c
index a11573be0961..e31680e662a4 100644
--- a/arch/um/drivers/port_kern.c
+++ b/arch/um/drivers/port_kern.c
@@ -100,7 +100,7 @@ static int port_accept(struct port_list *port)
100 .port = port }); 100 .port = port });
101 101
102 if (um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt, 102 if (um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt,
103 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 103 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
104 "telnetd", conn)) { 104 "telnetd", conn)) {
105 printk(KERN_ERR "port_accept : failed to get IRQ for " 105 printk(KERN_ERR "port_accept : failed to get IRQ for "
106 "telnetd\n"); 106 "telnetd\n");
@@ -184,7 +184,7 @@ void *port_data(int port_num)
184 } 184 }
185 185
186 if (um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt, 186 if (um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt,
187 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 187 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
188 "port", port)) { 188 "port", port)) {
189 printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num); 189 printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num);
190 goto out_close; 190 goto out_close;
diff --git a/arch/um/drivers/random.c b/arch/um/drivers/random.c
index 981085a93f30..b25296e6218a 100644
--- a/arch/um/drivers/random.c
+++ b/arch/um/drivers/random.c
@@ -131,7 +131,7 @@ static int __init rng_init (void)
131 random_fd = err; 131 random_fd = err;
132 132
133 err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt, 133 err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt,
134 IRQF_DISABLED | IRQF_SAMPLE_RANDOM, "random", 134 IRQF_SAMPLE_RANDOM, "random",
135 NULL); 135 NULL);
136 if (err) 136 if (err)
137 goto err_out_cleanup_hw; 137 goto err_out_cleanup_hw;
diff --git a/arch/um/drivers/ssl.c b/arch/um/drivers/ssl.c
index 9d8c20af6f80..e09801a1327b 100644
--- a/arch/um/drivers/ssl.c
+++ b/arch/um/drivers/ssl.c
@@ -20,12 +20,6 @@
20 20
21static const int ssl_version = 1; 21static const int ssl_version = 1;
22 22
23/* Referenced only by tty_driver below - presumably it's locked correctly
24 * by the tty driver.
25 */
26
27static struct tty_driver *ssl_driver;
28
29#define NR_PORTS 64 23#define NR_PORTS 64
30 24
31static void ssl_announce(char *dev_name, int dev) 25static void ssl_announce(char *dev_name, int dev)
@@ -71,8 +65,9 @@ static struct line_driver driver = {
71/* The array is initialized by line_init, at initcall time. The 65/* The array is initialized by line_init, at initcall time. The
72 * elements are locked individually as needed. 66 * elements are locked individually as needed.
73 */ 67 */
74static struct line serial_lines[NR_PORTS] = 68static char *conf[NR_PORTS];
75 { [0 ... NR_PORTS - 1] = LINE_INIT(CONFIG_SSL_CHAN, &driver) }; 69static char *def_conf = CONFIG_SSL_CHAN;
70static struct line serial_lines[NR_PORTS];
76 71
77static int ssl_config(char *str, char **error_out) 72static int ssl_config(char *str, char **error_out)
78{ 73{
@@ -156,14 +151,14 @@ static void ssl_console_write(struct console *c, const char *string,
156 unsigned long flags; 151 unsigned long flags;
157 152
158 spin_lock_irqsave(&line->lock, flags); 153 spin_lock_irqsave(&line->lock, flags);
159 console_write_chan(&line->chan_list, string, len); 154 console_write_chan(line->chan_out, string, len);
160 spin_unlock_irqrestore(&line->lock, flags); 155 spin_unlock_irqrestore(&line->lock, flags);
161} 156}
162 157
163static struct tty_driver *ssl_console_device(struct console *c, int *index) 158static struct tty_driver *ssl_console_device(struct console *c, int *index)
164{ 159{
165 *index = c->index; 160 *index = c->index;
166 return ssl_driver; 161 return driver.driver;
167} 162}
168 163
169static int ssl_console_setup(struct console *co, char *options) 164static int ssl_console_setup(struct console *co, char *options)
@@ -186,17 +181,30 @@ static struct console ssl_cons = {
186static int ssl_init(void) 181static int ssl_init(void)
187{ 182{
188 char *new_title; 183 char *new_title;
184 int err;
185 int i;
189 186
190 printk(KERN_INFO "Initializing software serial port version %d\n", 187 printk(KERN_INFO "Initializing software serial port version %d\n",
191 ssl_version); 188 ssl_version);
192 ssl_driver = register_lines(&driver, &ssl_ops, serial_lines, 189
190 err = register_lines(&driver, &ssl_ops, serial_lines,
193 ARRAY_SIZE(serial_lines)); 191 ARRAY_SIZE(serial_lines));
192 if (err)
193 return err;
194 194
195 new_title = add_xterm_umid(opts.xterm_title); 195 new_title = add_xterm_umid(opts.xterm_title);
196 if (new_title != NULL) 196 if (new_title != NULL)
197 opts.xterm_title = new_title; 197 opts.xterm_title = new_title;
198 198
199 lines_init(serial_lines, ARRAY_SIZE(serial_lines), &opts); 199 for (i = 0; i < NR_PORTS; i++) {
200 char *error;
201 char *s = conf[i];
202 if (!s)
203 s = def_conf;
204 if (setup_one_line(serial_lines, i, s, &opts, &error))
205 printk(KERN_ERR "setup_one_line failed for "
206 "device %d : %s\n", i, error);
207 }
200 208
201 ssl_init_done = 1; 209 ssl_init_done = 1;
202 register_console(&ssl_cons); 210 register_console(&ssl_cons);
@@ -214,14 +222,7 @@ __uml_exitcall(ssl_exit);
214 222
215static int ssl_chan_setup(char *str) 223static int ssl_chan_setup(char *str)
216{ 224{
217 char *error; 225 line_setup(conf, NR_PORTS, &def_conf, str, "serial line");
218 int ret;
219
220 ret = line_setup(serial_lines, ARRAY_SIZE(serial_lines), str, &error);
221 if(ret < 0)
222 printk(KERN_ERR "Failed to set up serial line with "
223 "configuration string \"%s\" : %s\n", str, error);
224
225 return 1; 226 return 1;
226} 227}
227 228
diff --git a/arch/um/drivers/stdio_console.c b/arch/um/drivers/stdio_console.c
index 088776f01908..7663541c372e 100644
--- a/arch/um/drivers/stdio_console.c
+++ b/arch/um/drivers/stdio_console.c
@@ -27,12 +27,6 @@
27 27
28#define MAX_TTYS (16) 28#define MAX_TTYS (16)
29 29
30/* Referenced only by tty_driver below - presumably it's locked correctly
31 * by the tty driver.
32 */
33
34static struct tty_driver *console_driver;
35
36static void stdio_announce(char *dev_name, int dev) 30static void stdio_announce(char *dev_name, int dev)
37{ 31{
38 printk(KERN_INFO "Virtual console %d assigned device '%s'\n", dev, 32 printk(KERN_INFO "Virtual console %d assigned device '%s'\n", dev,
@@ -76,9 +70,9 @@ static struct line_driver driver = {
76/* The array is initialized by line_init, at initcall time. The 70/* The array is initialized by line_init, at initcall time. The
77 * elements are locked individually as needed. 71 * elements are locked individually as needed.
78 */ 72 */
79static struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver), 73static char *vt_conf[MAX_TTYS];
80 [ 1 ... MAX_TTYS - 1 ] = 74static char *def_conf;
81 LINE_INIT(CONFIG_CON_CHAN, &driver) }; 75static struct line vts[MAX_TTYS];
82 76
83static int con_config(char *str, char **error_out) 77static int con_config(char *str, char **error_out)
84{ 78{
@@ -130,14 +124,14 @@ static void uml_console_write(struct console *console, const char *string,
130 unsigned long flags; 124 unsigned long flags;
131 125
132 spin_lock_irqsave(&line->lock, flags); 126 spin_lock_irqsave(&line->lock, flags);
133 console_write_chan(&line->chan_list, string, len); 127 console_write_chan(line->chan_out, string, len);
134 spin_unlock_irqrestore(&line->lock, flags); 128 spin_unlock_irqrestore(&line->lock, flags);
135} 129}
136 130
137static struct tty_driver *uml_console_device(struct console *c, int *index) 131static struct tty_driver *uml_console_device(struct console *c, int *index)
138{ 132{
139 *index = c->index; 133 *index = c->index;
140 return console_driver; 134 return driver.driver;
141} 135}
142 136
143static int uml_console_setup(struct console *co, char *options) 137static int uml_console_setup(struct console *co, char *options)
@@ -160,18 +154,31 @@ static struct console stdiocons = {
160static int stdio_init(void) 154static int stdio_init(void)
161{ 155{
162 char *new_title; 156 char *new_title;
157 int err;
158 int i;
163 159
164 console_driver = register_lines(&driver, &console_ops, vts, 160 err = register_lines(&driver, &console_ops, vts,
165 ARRAY_SIZE(vts)); 161 ARRAY_SIZE(vts));
166 if (console_driver == NULL) 162 if (err)
167 return -1; 163 return err;
164
168 printk(KERN_INFO "Initialized stdio console driver\n"); 165 printk(KERN_INFO "Initialized stdio console driver\n");
169 166
170 new_title = add_xterm_umid(opts.xterm_title); 167 new_title = add_xterm_umid(opts.xterm_title);
171 if(new_title != NULL) 168 if(new_title != NULL)
172 opts.xterm_title = new_title; 169 opts.xterm_title = new_title;
173 170
174 lines_init(vts, ARRAY_SIZE(vts), &opts); 171 for (i = 0; i < MAX_TTYS; i++) {
172 char *error;
173 char *s = vt_conf[i];
174 if (!s)
175 s = def_conf;
176 if (!s)
177 s = i ? CONFIG_CON_CHAN : CONFIG_CON_ZERO_CHAN;
178 if (setup_one_line(vts, i, s, &opts, &error))
179 printk(KERN_ERR "setup_one_line failed for "
180 "device %d : %s\n", i, error);
181 }
175 182
176 con_init_done = 1; 183 con_init_done = 1;
177 register_console(&stdiocons); 184 register_console(&stdiocons);
@@ -189,14 +196,7 @@ __uml_exitcall(console_exit);
189 196
190static int console_chan_setup(char *str) 197static int console_chan_setup(char *str)
191{ 198{
192 char *error; 199 line_setup(vt_conf, MAX_TTYS, &def_conf, str, "console");
193 int ret;
194
195 ret = line_setup(vts, ARRAY_SIZE(vts), str, &error);
196 if(ret < 0)
197 printk(KERN_ERR "Failed to set up console with "
198 "configuration string \"%s\" : %s\n", str, error);
199
200 return 1; 200 return 1;
201} 201}
202__setup("con", console_chan_setup); 202__setup("con", console_chan_setup);
diff --git a/arch/um/drivers/ubd_user.h b/arch/um/drivers/ubd.h
index 3845051f1b10..3845051f1b10 100644
--- a/arch/um/drivers/ubd_user.h
+++ b/arch/um/drivers/ubd.h
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 944453a3ec99..20505cafa299 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -19,40 +19,26 @@
19 19
20#define UBD_SHIFT 4 20#define UBD_SHIFT 4
21 21
22#include "linux/kernel.h" 22#include <linux/module.h>
23#include "linux/module.h" 23#include <linux/init.h>
24#include "linux/blkdev.h" 24#include <linux/blkdev.h>
25#include "linux/ata.h" 25#include <linux/ata.h>
26#include "linux/hdreg.h" 26#include <linux/hdreg.h>
27#include "linux/init.h" 27#include <linux/cdrom.h>
28#include "linux/cdrom.h" 28#include <linux/proc_fs.h>
29#include "linux/proc_fs.h" 29#include <linux/seq_file.h>
30#include "linux/seq_file.h" 30#include <linux/ctype.h>
31#include "linux/ctype.h" 31#include <linux/slab.h>
32#include "linux/capability.h" 32#include <linux/vmalloc.h>
33#include "linux/mm.h" 33#include <linux/platform_device.h>
34#include "linux/slab.h" 34#include <linux/scatterlist.h>
35#include "linux/vmalloc.h" 35#include <asm/tlbflush.h>
36#include "linux/mutex.h"
37#include "linux/blkpg.h"
38#include "linux/genhd.h"
39#include "linux/spinlock.h"
40#include "linux/platform_device.h"
41#include "linux/scatterlist.h"
42#include "asm/segment.h"
43#include "asm/uaccess.h"
44#include "asm/irq.h"
45#include "asm/types.h"
46#include "asm/tlbflush.h"
47#include "mem_user.h"
48#include "kern_util.h" 36#include "kern_util.h"
49#include "mconsole_kern.h" 37#include "mconsole_kern.h"
50#include "init.h" 38#include "init.h"
51#include "irq_user.h"
52#include "irq_kern.h" 39#include "irq_kern.h"
53#include "ubd_user.h" 40#include "ubd.h"
54#include "os.h" 41#include "os.h"
55#include "mem.h"
56#include "cow.h" 42#include "cow.h"
57 43
58enum ubd_req { UBD_READ, UBD_WRITE }; 44enum ubd_req { UBD_READ, UBD_WRITE };
@@ -1115,7 +1101,7 @@ static int __init ubd_driver_init(void){
1115 return 0; 1101 return 0;
1116 } 1102 }
1117 err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, 1103 err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr,
1118 IRQF_DISABLED, "ubd", ubd_devs); 1104 0, "ubd", ubd_devs);
1119 if(err != 0) 1105 if(err != 0)
1120 printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err); 1106 printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err);
1121 return 0; 1107 return 0;
diff --git a/arch/um/drivers/ubd_user.c b/arch/um/drivers/ubd_user.c
index 007b94d97726..ffe02c431dea 100644
--- a/arch/um/drivers/ubd_user.c
+++ b/arch/um/drivers/ubd_user.c
@@ -15,14 +15,12 @@
15#include <sys/socket.h> 15#include <sys/socket.h>
16#include <sys/mman.h> 16#include <sys/mman.h>
17#include <sys/param.h> 17#include <sys/param.h>
18#include "asm/types.h"
19#include "ubd_user.h"
20#include "os.h"
21#include "cow.h"
22
23#include <endian.h> 18#include <endian.h>
24#include <byteswap.h> 19#include <byteswap.h>
25 20
21#include "ubd.h"
22#include "os.h"
23
26void ignore_sigwinch_sig(void) 24void ignore_sigwinch_sig(void)
27{ 25{
28 signal(SIGWINCH, SIG_IGN); 26 signal(SIGWINCH, SIG_IGN);
diff --git a/arch/um/drivers/xterm_kern.c b/arch/um/drivers/xterm_kern.c
index b646bccef37a..8bd130f0bda3 100644
--- a/arch/um/drivers/xterm_kern.c
+++ b/arch/um/drivers/xterm_kern.c
@@ -50,7 +50,7 @@ int xterm_fd(int socket, int *pid_out)
50 init_completion(&data->ready); 50 init_completion(&data->ready);
51 51
52 err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt, 52 err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
53 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 53 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
54 "xterm", data); 54 "xterm", data);
55 if (err) { 55 if (err) {
56 printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, " 56 printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, "
diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
index 451f4517b334..8419f5cf2ac7 100644
--- a/arch/um/include/asm/Kbuild
+++ b/arch/um/include/asm/Kbuild
@@ -1,3 +1,3 @@
1generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h 1generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h
2generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h 2generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h
3generic-y += ftrace.h 3generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h
diff --git a/arch/um/include/asm/asm-offsets.h b/arch/um/include/asm/asm-offsets.h
deleted file mode 100644
index d370ee36a182..000000000000
--- a/arch/um/include/asm/asm-offsets.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <generated/asm-offsets.h>
diff --git a/arch/um/include/asm/auxvec.h b/arch/um/include/asm/auxvec.h
deleted file mode 100644
index 1e5e1c2fc9b1..000000000000
--- a/arch/um/include/asm/auxvec.h
+++ /dev/null
@@ -1,4 +0,0 @@
1#ifndef __UM_AUXVEC_H
2#define __UM_AUXVEC_H
3
4#endif
diff --git a/arch/um/include/asm/current.h b/arch/um/include/asm/current.h
deleted file mode 100644
index c2191d9aa03d..000000000000
--- a/arch/um/include/asm/current.h
+++ /dev/null
@@ -1,13 +0,0 @@
1/*
2 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3 * Licensed under the GPL
4 */
5
6#ifndef __UM_CURRENT_H
7#define __UM_CURRENT_H
8
9#include "linux/thread_info.h"
10
11#define current (current_thread_info()->task)
12
13#endif
diff --git a/arch/um/include/asm/delay.h b/arch/um/include/asm/delay.h
deleted file mode 100644
index 8a5576d8eda5..000000000000
--- a/arch/um/include/asm/delay.h
+++ /dev/null
@@ -1,18 +0,0 @@
1#ifndef __UM_DELAY_H
2#define __UM_DELAY_H
3
4/* Undefined on purpose */
5extern void __bad_udelay(void);
6extern void __bad_ndelay(void);
7
8extern void __udelay(unsigned long usecs);
9extern void __ndelay(unsigned long usecs);
10extern void __delay(unsigned long loops);
11
12#define udelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \
13 __bad_udelay() : __udelay(n))
14
15#define ndelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \
16 __bad_ndelay() : __ndelay(n))
17
18#endif
diff --git a/arch/um/include/asm/io.h b/arch/um/include/asm/io.h
deleted file mode 100644
index 44e8b8c772ae..000000000000
--- a/arch/um/include/asm/io.h
+++ /dev/null
@@ -1,57 +0,0 @@
1#ifndef __UM_IO_H
2#define __UM_IO_H
3
4#include "asm/page.h"
5
6#define IO_SPACE_LIMIT 0xdeadbeef /* Sure hope nothing uses this */
7
8static inline int inb(unsigned long i) { return(0); }
9static inline void outb(char c, unsigned long i) { }
10
11/*
12 * Change virtual addresses to physical addresses and vv.
13 * These are pretty trivial
14 */
15static inline unsigned long virt_to_phys(volatile void * address)
16{
17 return __pa((void *) address);
18}
19
20static inline void * phys_to_virt(unsigned long address)
21{
22 return __va(address);
23}
24
25/*
26 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
27 * access
28 */
29#define xlate_dev_mem_ptr(p) __va(p)
30
31/*
32 * Convert a virtual cached pointer to an uncached pointer
33 */
34#define xlate_dev_kmem_ptr(p) p
35
36static inline void writeb(unsigned char b, volatile void __iomem *addr)
37{
38 *(volatile unsigned char __force *) addr = b;
39}
40static inline void writew(unsigned short b, volatile void __iomem *addr)
41{
42 *(volatile unsigned short __force *) addr = b;
43}
44static inline void writel(unsigned int b, volatile void __iomem *addr)
45{
46 *(volatile unsigned int __force *) addr = b;
47}
48static inline void writeq(unsigned int b, volatile void __iomem *addr)
49{
50 *(volatile unsigned long long __force *) addr = b;
51}
52#define __raw_writeb writeb
53#define __raw_writew writew
54#define __raw_writel writel
55#define __raw_writeq writeq
56
57#endif
diff --git a/arch/um/include/asm/mutex.h b/arch/um/include/asm/mutex.h
deleted file mode 100644
index 458c1f7fbc18..000000000000
--- a/arch/um/include/asm/mutex.h
+++ /dev/null
@@ -1,9 +0,0 @@
1/*
2 * Pull in the generic implementation for the mutex fastpath.
3 *
4 * TODO: implement optimized primitives instead, or leave the generic
5 * implementation in place, or pick the atomic_xchg() based generic
6 * implementation. (see asm-generic/mutex-xchg.h for details)
7 */
8
9#include <asm-generic/mutex-dec.h>
diff --git a/arch/um/include/asm/param.h b/arch/um/include/asm/param.h
deleted file mode 100644
index e44f4e60d16d..000000000000
--- a/arch/um/include/asm/param.h
+++ /dev/null
@@ -1,20 +0,0 @@
1#ifndef _UM_PARAM_H
2#define _UM_PARAM_H
3
4#define EXEC_PAGESIZE 4096
5
6#ifndef NOGROUP
7#define NOGROUP (-1)
8#endif
9
10#define MAXHOSTNAMELEN 64 /* max length of hostname */
11
12#ifdef __KERNEL__
13#define HZ CONFIG_HZ
14#define USER_HZ 100 /* .. some user interfaces are in "ticks" */
15#define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */
16#else
17#define HZ 100
18#endif
19
20#endif
diff --git a/arch/um/include/asm/pci.h b/arch/um/include/asm/pci.h
deleted file mode 100644
index b44cf59ede1e..000000000000
--- a/arch/um/include/asm/pci.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef __UM_PCI_H
2#define __UM_PCI_H
3
4#define PCI_DMA_BUS_IS_PHYS (1)
5
6#endif
diff --git a/arch/um/include/asm/pgalloc.h b/arch/um/include/asm/pgalloc.h
index 32c8ce4e1515..bf90b2aa2002 100644
--- a/arch/um/include/asm/pgalloc.h
+++ b/arch/um/include/asm/pgalloc.h
@@ -8,8 +8,7 @@
8#ifndef __UM_PGALLOC_H 8#ifndef __UM_PGALLOC_H
9#define __UM_PGALLOC_H 9#define __UM_PGALLOC_H
10 10
11#include "linux/mm.h" 11#include <linux/mm.h>
12#include "asm/fixmap.h"
13 12
14#define pmd_populate_kernel(mm, pmd, pte) \ 13#define pmd_populate_kernel(mm, pmd, pte) \
15 set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte))) 14 set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte)))
diff --git a/arch/um/include/asm/pgtable.h b/arch/um/include/asm/pgtable.h
index 41474fb5eee7..6a3f9845743e 100644
--- a/arch/um/include/asm/pgtable.h
+++ b/arch/um/include/asm/pgtable.h
@@ -69,6 +69,8 @@ extern unsigned long end_iomem;
69#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED) 69#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
70#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC) 70#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
71 71
72#define io_remap_pfn_range remap_pfn_range
73
72/* 74/*
73 * The i386 can't do page protection for execute, and considers that the same 75 * The i386 can't do page protection for execute, and considers that the same
74 * are read. 76 * are read.
diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptrace-generic.h
index f605d3c4844c..e786a6a3ec5e 100644
--- a/arch/um/include/asm/ptrace-generic.h
+++ b/arch/um/include/asm/ptrace-generic.h
@@ -9,7 +9,6 @@
9#ifndef __ASSEMBLY__ 9#ifndef __ASSEMBLY__
10 10
11#include <asm/ptrace-abi.h> 11#include <asm/ptrace-abi.h>
12#include <asm/user.h>
13#include "sysdep/ptrace.h" 12#include "sysdep/ptrace.h"
14 13
15struct pt_regs { 14struct pt_regs {
diff --git a/arch/um/include/shared/common-offsets.h b/arch/um/include/shared/common-offsets.h
index d7fe563aa7e7..40db8f71deae 100644
--- a/arch/um/include/shared/common-offsets.h
+++ b/arch/um/include/shared/common-offsets.h
@@ -2,8 +2,6 @@
2 2
3DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE); 3DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE);
4 4
5OFFSET(HOST_TASK_PID, task_struct, pid);
6
7DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE); 5DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE);
8DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK); 6DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK);
9DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT); 7DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT);
diff --git a/arch/um/include/shared/kern_util.h b/arch/um/include/shared/kern_util.h
index 0f1483852460..00965d06d2ca 100644
--- a/arch/um/include/shared/kern_util.h
+++ b/arch/um/include/shared/kern_util.h
@@ -48,7 +48,7 @@ extern void do_uml_exitcalls(void);
48 * GFP_ATOMIC. 48 * GFP_ATOMIC.
49 */ 49 */
50extern int __cant_sleep(void); 50extern int __cant_sleep(void);
51extern void *get_current(void); 51extern int get_current_pid(void);
52extern int copy_from_user_proc(void *to, void *from, int size); 52extern int copy_from_user_proc(void *to, void *from, int size);
53extern int cpu(void); 53extern int cpu(void);
54extern char *uml_strdup(const char *string); 54extern char *uml_strdup(const char *string);
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile
index bc494741b1f3..492bc4c1b62b 100644
--- a/arch/um/kernel/Makefile
+++ b/arch/um/kernel/Makefile
@@ -3,7 +3,7 @@
3# Licensed under the GPL 3# Licensed under the GPL
4# 4#
5 5
6CPPFLAGS_vmlinux.lds := -U$(SUBARCH) -DSTART=$(LDS_START) \ 6CPPFLAGS_vmlinux.lds := -DSTART=$(LDS_START) \
7 -DELF_ARCH=$(LDS_ELF_ARCH) \ 7 -DELF_ARCH=$(LDS_ELF_ARCH) \
8 -DELF_FORMAT=$(LDS_ELF_FORMAT) 8 -DELF_FORMAT=$(LDS_ELF_FORMAT)
9extra-y := vmlinux.lds 9extra-y := vmlinux.lds
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
index 69f24905abdc..f386d04a84a5 100644
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -126,9 +126,9 @@ void exit_thread(void)
126{ 126{
127} 127}
128 128
129void *get_current(void) 129int get_current_pid(void)
130{ 130{
131 return current; 131 return task_pid_nr(current);
132} 132}
133 133
134/* 134/*
diff --git a/arch/um/kernel/sigio.c b/arch/um/kernel/sigio.c
index 2b272b63b514..2a1639255763 100644
--- a/arch/um/kernel/sigio.c
+++ b/arch/um/kernel/sigio.c
@@ -25,7 +25,7 @@ int write_sigio_irq(int fd)
25 int err; 25 int err;
26 26
27 err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt, 27 err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt,
28 IRQF_DISABLED|IRQF_SAMPLE_RANDOM, "write sigio", 28 IRQF_SAMPLE_RANDOM, "write sigio",
29 NULL); 29 NULL);
30 if (err) { 30 if (err) {
31 printk(KERN_ERR "write_sigio_irq : um_request_irq failed, " 31 printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
index 82a6e22f1f35..d1a23fb3190d 100644
--- a/arch/um/kernel/time.c
+++ b/arch/um/kernel/time.c
@@ -82,7 +82,7 @@ static void __init setup_itimer(void)
82{ 82{
83 int err; 83 int err;
84 84
85 err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL); 85 err = request_irq(TIMER_IRQ, um_timer, 0, "timer", NULL);
86 if (err != 0) 86 if (err != 0)
87 printk(KERN_ERR "register_timer : request_irq failed - " 87 printk(KERN_ERR "register_timer : request_irq failed - "
88 "errno = %d\n", -err); 88 "errno = %d\n", -err);
diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile
index dd764101e488..08ff5094fcdd 100644
--- a/arch/um/os-Linux/Makefile
+++ b/arch/um/os-Linux/Makefile
@@ -13,8 +13,6 @@ USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \
13 main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \ 13 main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \
14 tty.o umid.o util.o 14 tty.o umid.o util.o
15 15
16CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH)
17
18HAVE_AIO_ABI := $(shell [ -r /usr/include/linux/aio_abi.h ] && \ 16HAVE_AIO_ABI := $(shell [ -r /usr/include/linux/aio_abi.h ] && \
19 echo -DHAVE_AIO_ABI ) 17 echo -DHAVE_AIO_ABI )
20CFLAGS_aio.o += $(HAVE_AIO_ABI) 18CFLAGS_aio.o += $(HAVE_AIO_ABI)
diff --git a/arch/um/os-Linux/user_syms.c b/arch/um/os-Linux/user_syms.c
index 45ffe46871e0..73926fa3f96b 100644
--- a/arch/um/os-Linux/user_syms.c
+++ b/arch/um/os-Linux/user_syms.c
@@ -45,7 +45,7 @@ EXPORT_SYMBOL(readdir64);
45extern void truncate64(void) __attribute__((weak)); 45extern void truncate64(void) __attribute__((weak));
46EXPORT_SYMBOL(truncate64); 46EXPORT_SYMBOL(truncate64);
47 47
48#ifdef SUBARCH_i386 48#ifdef CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA
49EXPORT_SYMBOL(vsyscall_ehdr); 49EXPORT_SYMBOL(vsyscall_ehdr);
50EXPORT_SYMBOL(vsyscall_end); 50EXPORT_SYMBOL(vsyscall_end);
51#endif 51#endif
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules
index 2eb2843b0634..d50270d26b42 100644
--- a/arch/um/scripts/Makefile.rules
+++ b/arch/um/scripts/Makefile.rules
@@ -9,8 +9,6 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
9 9
10$(USER_OBJS:.o=.%): \ 10$(USER_OBJS:.o=.%): \
11 c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) -include user.h $(CFLAGS_$(basetarget).o) 11 c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) -include user.h $(CFLAGS_$(basetarget).o)
12$(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \
13 -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF)
14 12
15# These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of 13# These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of
16# using it directly. 14# using it directly.
@@ -18,8 +16,9 @@ UNPROFILE_OBJS := $(foreach file,$(UNPROFILE_OBJS),$(obj)/$(file))
18 16
19$(UNPROFILE_OBJS:.o=.%): \ 17$(UNPROFILE_OBJS:.o=.%): \
20 c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o) 18 c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o)
21$(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ 19
22 -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF) 20$(USER_OBJS) $(UNPROFILE_OBJS): \
21 CHECKFLAGS := $(patsubst $(NOSTDINC_FLAGS),,$(CHECKFLAGS))
23 22
24# The stubs can't try to call mcount or update basic block data 23# The stubs can't try to call mcount or update basic block data
25define unprofile 24define unprofile