Commit fa453a62 authored by Linus Torvalds's avatar Linus Torvalds

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...
  ...
parents 30eebb54 3463ff44
...@@ -9,6 +9,7 @@ config UML ...@@ -9,6 +9,7 @@ config UML
select HAVE_GENERIC_HARDIRQS select HAVE_GENERIC_HARDIRQS
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select GENERIC_IO
config MMU config MMU
bool bool
......
...@@ -28,6 +28,7 @@ ifeq ($(SUBARCH),i386) ...@@ -28,6 +28,7 @@ ifeq ($(SUBARCH),i386)
endif endif
ifeq ($(SUBARCH),x86_64) ifeq ($(SUBARCH),x86_64)
HEADER_ARCH := x86 HEADER_ARCH := x86
KBUILD_CFLAGS += -mcmodel=large
endif endif
HOST_DIR := arch/$(HEADER_ARCH) HOST_DIR := arch/$(HEADER_ARCH)
...@@ -50,7 +51,7 @@ KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_DIR)/um ...@@ -50,7 +51,7 @@ KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_DIR)/um
# #
# These apply to USER_CFLAGS to. # These apply to USER_CFLAGS to.
KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ \
$(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \ $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \
-Din6addr_loopback=kernel_in6addr_loopback \ -Din6addr_loopback=kernel_in6addr_loopback \
-Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr
...@@ -99,7 +100,7 @@ KBUILD_KCONFIG := $(HOST_DIR)/um/Kconfig ...@@ -99,7 +100,7 @@ KBUILD_KCONFIG := $(HOST_DIR)/um/Kconfig
archheaders: archheaders:
$(Q)$(MAKE) -C '$(srctree)' KBUILD_SRC= \ $(Q)$(MAKE) -C '$(srctree)' KBUILD_SRC= \
ARCH=$(SUBARCH) O='$(objtree)' archheaders ARCH=$(HEADER_ARCH) O='$(objtree)' archheaders
archprepare: include/generated/user_constants.h archprepare: include/generated/user_constants.h
......
# #
# Automatically generated make config: don't edit # Automatically generated file; DO NOT EDIT.
# Linux kernel version: 2.6.24 # User Mode Linux/i386 3.3.0 Kernel Configuration
# Thu Feb 7 11:48:55 2008
# #
CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig"
CONFIG_GENERIC_HARDIRQS=y
CONFIG_UML=y CONFIG_UML=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_NO_IOMEM=y CONFIG_NO_IOMEM=y
...@@ -20,12 +18,10 @@ CONFIG_HZ=100 ...@@ -20,12 +18,10 @@ CONFIG_HZ=100
# #
# UML-specific options # UML-specific options
# #
# CONFIG_STATIC_LINK is not set
# #
# Host processor type and features # Host processor type and features
# #
# CONFIG_M386 is not set
# CONFIG_M486 is not set # CONFIG_M486 is not set
# CONFIG_M586 is not set # CONFIG_M586 is not set
# CONFIG_M586TSC is not set # CONFIG_M586TSC is not set
...@@ -41,17 +37,17 @@ CONFIG_M686=y ...@@ -41,17 +37,17 @@ CONFIG_M686=y
# CONFIG_MCRUSOE is not set # CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set # CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set # CONFIG_MWINCHIP3D is not set
# CONFIG_MELAN is not set
# CONFIG_MGEODEGX1 is not set # CONFIG_MGEODEGX1 is not set
# CONFIG_MGEODE_LX is not set # CONFIG_MGEODE_LX is not set
# CONFIG_MCYRIXIII is not set # CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set # CONFIG_MVIAC3_2 is not set
# CONFIG_MVIAC7 is not set # CONFIG_MVIAC7 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set # CONFIG_MCORE2 is not set
# CONFIG_GENERIC_CPU is not set # CONFIG_MATOM is not set
# CONFIG_X86_GENERIC is not set # CONFIG_X86_GENERIC is not set
CONFIG_X86_INTERNODE_CACHE_SHIFT=5
CONFIG_X86_CMPXCHG=y CONFIG_X86_CMPXCHG=y
CONFIG_X86_L1_CACHE_SHIFT=5 CONFIG_X86_L1_CACHE_SHIFT=5
CONFIG_X86_XADD=y CONFIG_X86_XADD=y
...@@ -60,47 +56,59 @@ CONFIG_X86_WP_WORKS_OK=y ...@@ -60,47 +56,59 @@ CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y CONFIG_X86_POPAD_OK=y
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_X86_TSC=y CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_X86_MINIMUM_CPU_FAMILY=5
CONFIG_X86_DEBUGCTLMSR=y CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_CYRIX_32=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_CPU_SUP_TRANSMETA_32=y
CONFIG_CPU_SUP_UMC_32=y
CONFIG_UML_X86=y CONFIG_UML_X86=y
CONFIG_X86_32=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
# CONFIG_64BIT is not set # CONFIG_64BIT is not set
CONFIG_SEMAPHORE_SLEEPERS=y CONFIG_X86_32=y
# CONFIG_X86_64 is not set
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_3_LEVEL_PGTABLES is not set # CONFIG_3_LEVEL_PGTABLES is not set
CONFIG_ARCH_HAS_SC_SIGNALS=y CONFIG_ARCH_HAS_SC_SIGNALS=y
CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y
CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_HWEIGHT=y
# CONFIG_STATIC_LINK is not set
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y CONFIG_FLATMEM_MANUAL=y
# CONFIG_DISCONTIGMEM_MANUAL is not set
# CONFIG_SPARSEMEM_MANUAL is not set
CONFIG_FLATMEM=y CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set CONFIG_PAGEFLAGS_EXTENDED=y
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_RESOURCES_64BIT is not set # CONFIG_COMPACTION is not set
# CONFIG_PHYS_ADDR_T_64BIT is not set
CONFIG_ZONE_DMA_FLAG=0 CONFIG_ZONE_DMA_FLAG=0
CONFIG_VIRT_TO_BUS=y CONFIG_VIRT_TO_BUS=y
# CONFIG_KSM is not set
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_NEED_PER_CPU_KM=y
# CONFIG_CLEANCACHE is not set
CONFIG_TICK_ONESHOT=y CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_HIGH_RES_TIMERS=y
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_LD_SCRIPT_DYN=y CONFIG_LD_SCRIPT_DYN=y
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
CONFIG_HAVE_AOUT=y
# CONFIG_BINFMT_AOUT is not set # CONFIG_BINFMT_AOUT is not set
CONFIG_BINFMT_MISC=m CONFIG_BINFMT_MISC=m
CONFIG_HOSTFS=y CONFIG_HOSTFS=y
# CONFIG_HPPFS is not set # CONFIG_HPPFS is not set
CONFIG_MCONSOLE=y CONFIG_MCONSOLE=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
# CONFIG_HIGHMEM is not set
CONFIG_KERNEL_STACK_ORDER=0 CONFIG_KERNEL_STACK_ORDER=0
# CONFIG_MMAPPER is not set
CONFIG_NO_DMA=y
# #
# General setup # General setup
...@@ -108,99 +116,169 @@ CONFIG_KERNEL_STACK_ORDER=0 ...@@ -108,99 +116,169 @@ CONFIG_KERNEL_STACK_ORDER=0
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=128 CONFIG_INIT_ENV_ARG_LIMIT=128
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y CONFIG_LOCALVERSION_AUTO=y
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT=y
# CONFIG_BSD_PROCESS_ACCT_V3 is not set # CONFIG_BSD_PROCESS_ACCT_V3 is not set
# CONFIG_FHANDLE is not set
# CONFIG_TASKSTATS is not set # CONFIG_TASKSTATS is not set
# CONFIG_USER_NS is not set
# CONFIG_PID_NS is not set
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
CONFIG_HAVE_GENERIC_HARDIRQS=y
#
# IRQ subsystem
#
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_SHOW=y
#
# RCU Subsystem
#
CONFIG_TINY_RCU=y
# CONFIG_PREEMPT_RCU is not set
# CONFIG_RCU_TRACE is not set
# CONFIG_TREE_RCU_TRACE is not set
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=14 CONFIG_LOG_BUF_SHIFT=14
# CONFIG_CGROUPS is not set CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_RESOURCE_COUNTERS=y
CONFIG_CGROUP_MEM_RES_CTLR=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
# CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set
# CONFIG_CGROUP_MEM_RES_CTLR_KMEM is not set
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y
CONFIG_FAIR_USER_SCHED=y # CONFIG_CFS_BANDWIDTH is not set
# CONFIG_FAIR_CGROUP_SCHED is not set # CONFIG_RT_GROUP_SCHED is not set
CONFIG_BLK_CGROUP=m
# CONFIG_DEBUG_BLK_CGROUP is not set
# CONFIG_CHECKPOINT_RESTORE is not set
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
# CONFIG_USER_NS is not set
# CONFIG_PID_NS is not set
CONFIG_NET_NS=y
# CONFIG_SCHED_AUTOGROUP is not set
CONFIG_MM_OWNER=y
CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED=y
# CONFIG_SYSFS_DEPRECATED_V2 is not set
# CONFIG_RELAY is not set # CONFIG_RELAY is not set
# CONFIG_BLK_DEV_INITRD is not set # CONFIG_BLK_DEV_INITRD is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
# CONFIG_EXPERT is not set # CONFIG_EXPERT is not set
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_ALL is not set
CONFIG_KALLSYMS_EXTRA_PASS=y
CONFIG_HOTPLUG=y CONFIG_HOTPLUG=y
CONFIG_PRINTK=y CONFIG_PRINTK=y
CONFIG_BUG=y CONFIG_BUG=y
CONFIG_ELF_CORE=y CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_ANON_INODES=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_SIGNALFD=y CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y CONFIG_TIMERFD=y
CONFIG_EVENTFD=y CONFIG_EVENTFD=y
CONFIG_SHMEM=y CONFIG_SHMEM=y
CONFIG_AIO=y
# CONFIG_EMBEDDED is not set
#
# Kernel Performance Events And Counters
#
CONFIG_VM_EVENT_COUNTERS=y CONFIG_VM_EVENT_COUNTERS=y
CONFIG_COMPAT_BRK=y
CONFIG_SLAB=y CONFIG_SLAB=y
# CONFIG_SLUB is not set # CONFIG_SLUB is not set
# CONFIG_SLOB is not set
# CONFIG_PROFILING is not set # CONFIG_PROFILING is not set
# CONFIG_MARKERS is not set
# CONFIG_HAVE_OPROFILE is not set #
# CONFIG_HAVE_KPROBES is not set # GCOV-based kernel profiling
CONFIG_PROC_PAGE_MONITOR=y #
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y CONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
CONFIG_MODULES=y CONFIG_MODULES=y
# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
CONFIG_BLOCK=y CONFIG_BLOCK=y
# CONFIG_LBD is not set CONFIG_LBDAF=y
# CONFIG_BLK_DEV_IO_TRACE is not set
# CONFIG_LSF is not set
# CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_BSG is not set
# CONFIG_BLK_DEV_BSGLIB is not set
# CONFIG_BLK_DEV_INTEGRITY is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
# #
# IO Schedulers # IO Schedulers
# #
CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y CONFIG_IOSCHED_CFQ=m
CONFIG_DEFAULT_AS=y # CONFIG_CFQ_GROUP_IOSCHED is not set
# CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_DEADLINE=y
# CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_CFQ is not set
# CONFIG_DEFAULT_NOOP is not set # CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="anticipatory" CONFIG_DEFAULT_IOSCHED="deadline"
CONFIG_CLASSIC_RCU=y # CONFIG_INLINE_SPIN_TRYLOCK is not set
# CONFIG_PREEMPT_RCU is not set # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
CONFIG_BLK_DEV=y # CONFIG_INLINE_SPIN_LOCK is not set
CONFIG_BLK_DEV_UBD=y # CONFIG_INLINE_SPIN_LOCK_BH is not set
# CONFIG_BLK_DEV_UBD_SYNC is not set # CONFIG_INLINE_SPIN_LOCK_IRQ is not set
CONFIG_BLK_DEV_COW_COMMON=y # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
CONFIG_BLK_DEV_LOOP=m CONFIG_INLINE_SPIN_UNLOCK=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_INLINE_SPIN_UNLOCK_BH is not set
CONFIG_BLK_DEV_NBD=m CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
# CONFIG_BLK_DEV_RAM is not set # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
# CONFIG_ATA_OVER_ETH is not set # CONFIG_INLINE_READ_TRYLOCK is not set
# CONFIG_INLINE_READ_LOCK is not set
# CONFIG_INLINE_READ_LOCK_BH is not set
# CONFIG_INLINE_READ_LOCK_IRQ is not set
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
CONFIG_INLINE_READ_UNLOCK=y
# CONFIG_INLINE_READ_UNLOCK_BH is not set
CONFIG_INLINE_READ_UNLOCK_IRQ=y
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
# CONFIG_INLINE_WRITE_TRYLOCK is not set
# CONFIG_INLINE_WRITE_LOCK is not set
# CONFIG_INLINE_WRITE_LOCK_BH is not set
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
CONFIG_INLINE_WRITE_UNLOCK=y
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
# CONFIG_MUTEX_SPIN_ON_OWNER is not set
CONFIG_FREEZER=y
# #
# Character Devices # UML Character Devices
# #
CONFIG_STDERR_CONSOLE=y CONFIG_STDERR_CONSOLE=y
CONFIG_STDIO_CONSOLE=y CONFIG_STDIO_CONSOLE=y
...@@ -214,40 +292,191 @@ CONFIG_XTERM_CHAN=y ...@@ -214,40 +292,191 @@ CONFIG_XTERM_CHAN=y
CONFIG_CON_ZERO_CHAN="fd:0,fd:1" CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
CONFIG_CON_CHAN="xterm" CONFIG_CON_CHAN="xterm"
CONFIG_SSL_CHAN="pts" CONFIG_SSL_CHAN="pts"
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
# CONFIG_RAW_DRIVER is not set
CONFIG_LEGACY_PTY_COUNT=32
# CONFIG_WATCHDOG is not set
CONFIG_UML_SOUND=m CONFIG_UML_SOUND=m
CONFIG_SOUND=m CONFIG_SOUND=m
CONFIG_SOUND_OSS_CORE=y
CONFIG_HOSTAUDIO=m CONFIG_HOSTAUDIO=m
# CONFIG_HW_RANDOM is not set
CONFIG_UML_RANDOM=y #
# CONFIG_MMAPPER is not set # Device Drivers
#
# #
# Generic Driver Options # Generic Driver Options
# #
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_STANDALONE=y CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_DEVRES is not set
# CONFIG_SYS_HYPERVISOR is not set # CONFIG_SYS_HYPERVISOR is not set
CONFIG_GENERIC_CPU_DEVICES=y
# CONFIG_DMA_SHARED_BUFFER is not set
# CONFIG_CONNECTOR is not set
# CONFIG_MTD is not set
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_UBD=y
# CONFIG_BLK_DEV_UBD_SYNC is not set
CONFIG_BLK_DEV_COW_COMMON=y
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
#
# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
#
CONFIG_BLK_DEV_NBD=m
# CONFIG_BLK_DEV_RAM is not set
# CONFIG_ATA_OVER_ETH is not set
# CONFIG_BLK_DEV_RBD is not set
#
# Misc devices
#
# CONFIG_ENCLOSURE_SERVICES is not set
# CONFIG_C2PORT is not set
#
# EEPROM support
#
# CONFIG_EEPROM_93CX6 is not set
#
# Texas Instruments shared transport line discipline
#
#
# Altera FPGA firmware download module
#
#
# SCSI device support
#
CONFIG_SCSI_MOD=y
# CONFIG_RAID_ATTRS is not set
# CONFIG_SCSI is not set
# CONFIG_SCSI_DMA is not set
# CONFIG_SCSI_NETLINK is not set
# CONFIG_MD is not set
CONFIG_NETDEVICES=y
CONFIG_NET_CORE=y
# CONFIG_BONDING is not set
CONFIG_DUMMY=m
# CONFIG_EQUALIZER is not set
# CONFIG_MII is not set
# CONFIG_NET_TEAM is not set
# CONFIG_MACVLAN is not set
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
CONFIG_TUN=m
# CONFIG_VETH is not set
#
# CAIF transport drivers
#
CONFIG_ETHERNET=y
CONFIG_NET_VENDOR_CHELSIO=y
CONFIG_NET_VENDOR_INTEL=y
CONFIG_NET_VENDOR_I825XX=y
CONFIG_NET_VENDOR_MARVELL=y
CONFIG_NET_VENDOR_NATSEMI=y
CONFIG_NET_VENDOR_8390=y
# CONFIG_PHYLIB is not set
CONFIG_PPP=m
# CONFIG_PPP_BSDCOMP is not set
# CONFIG_PPP_DEFLATE is not set
# CONFIG_PPP_FILTER is not set
# CONFIG_PPP_MPPE is not set
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPPOE is not set
# CONFIG_PPP_ASYNC is not set
# CONFIG_PPP_SYNC_TTY is not set
CONFIG_SLIP=m
CONFIG_SLHC=m
# CONFIG_SLIP_COMPRESSED is not set
# CONFIG_SLIP_SMART is not set
# CONFIG_SLIP_MODE_SLIP6 is not set
CONFIG_WLAN=y
# CONFIG_HOSTAP is not set
#
# Enable WiMAX (Networking options) to see the WiMAX drivers
#
# CONFIG_WAN is not set
#
# Character devices
#
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=32
# CONFIG_N_GSM is not set
# CONFIG_TRACE_SINK is not set
CONFIG_DEVKMEM=y
# CONFIG_HW_RANDOM is not set
CONFIG_UML_RANDOM=y
# CONFIG_R3964 is not set
# CONFIG_NSC_GPIO is not set
# CONFIG_RAW_DRIVER is not set
#
# PPS support
#
# CONFIG_PPS is not set
#
# PPS generators support
#
#
# PTP clock support
#
#
# Enable Device Drivers -> PPS to see the PTP clock options.
#
# CONFIG_POWER_SUPPLY is not set
# CONFIG_THERMAL is not set
# CONFIG_WATCHDOG is not set
# CONFIG_REGULATOR is not set
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
# CONFIG_MEMSTICK is not set
# CONFIG_NEW_LEDS is not set
# CONFIG_ACCESSIBILITY is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
#
# Virtio drivers
#
# CONFIG_VIRTIO_BALLOON is not set
#
# Microsoft Hyper-V guest support
#
# CONFIG_STAGING is not set
# #
# Networking # Hardware Spinlock drivers
# #
CONFIG_IOMMU_SUPPORT=y
# CONFIG_VIRT_DRIVERS is not set
# CONFIG_PM_DEVFREQ is not set
CONFIG_NET=y CONFIG_NET=y
# #
# Networking options # Networking options
# #
CONFIG_PACKET=y CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y CONFIG_UNIX=y
# CONFIG_UNIX_DIAG is not set
CONFIG_XFRM=y CONFIG_XFRM=y
# CONFIG_XFRM_USER is not set # CONFIG_XFRM_USER is not set
# CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_SUB_POLICY is not set
...@@ -257,10 +486,9 @@ CONFIG_XFRM=y ...@@ -257,10 +486,9 @@ CONFIG_XFRM=y
CONFIG_INET=y CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set # CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_FIB_HASH=y
# CONFIG_IP_PNP is not set # CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set # CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set # CONFIG_NET_IPGRE_DEMUX is not set
# CONFIG_ARPD is not set # CONFIG_ARPD is not set
# CONFIG_SYN_COOKIES is not set # CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set # CONFIG_INET_AH is not set
...@@ -274,20 +502,23 @@ CONFIG_INET_XFRM_MODE_BEET=y ...@@ -274,20 +502,23 @@ CONFIG_INET_XFRM_MODE_BEET=y
# CONFIG_INET_LRO is not set # CONFIG_INET_LRO is not set
CONFIG_INET_DIAG=y CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y CONFIG_INET_TCP_DIAG=y
# CONFIG_INET_UDP_DIAG is not set
# CONFIG_TCP_CONG_ADVANCED is not set # CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_CUBIC=y CONFIG_TCP_CONG_CUBIC=y
CONFIG_DEFAULT_TCP_CONG="cubic" CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_TCP_MD5SIG is not set # CONFIG_TCP_MD5SIG is not set
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_INET6_XFRM_TUNNEL is not set
# CONFIG_INET6_TUNNEL is not set
# CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_SECMARK is not set
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
# CONFIG_IP_DCCP is not set # CONFIG_IP_DCCP is not set
# CONFIG_IP_SCTP is not set # CONFIG_IP_SCTP is not set
# CONFIG_RDS is not set
# CONFIG_TIPC is not set # CONFIG_TIPC is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_L2TP is not set
# CONFIG_BRIDGE is not set # CONFIG_BRIDGE is not set
# CONFIG_NET_DSA is not set
# CONFIG_VLAN_8021Q is not set # CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set # CONFIG_DECNET is not set
# CONFIG_LLC2 is not set # CONFIG_LLC2 is not set
...@@ -297,7 +528,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic" ...@@ -297,7 +528,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_LAPB is not set # CONFIG_LAPB is not set
# CONFIG_ECONET is not set # CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set # CONFIG_WAN_ROUTER is not set
# CONFIG_PHONET is not set
# CONFIG_IEEE802154 is not set
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
# CONFIG_DCB is not set
# CONFIG_BATMAN_ADV is not set
# CONFIG_OPENVSWITCH is not set
# CONFIG_NETPRIO_CGROUP is not set
CONFIG_BQL=y
# #
# Network testing # Network testing
...@@ -308,16 +546,19 @@ CONFIG_DEFAULT_TCP_CONG="cubic" ...@@ -308,16 +546,19 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_IRDA is not set # CONFIG_IRDA is not set
# CONFIG_BT is not set # CONFIG_BT is not set
# CONFIG_AF_RXRPC is not set # CONFIG_AF_RXRPC is not set
CONFIG_WIRELESS=y
# CONFIG_CFG80211 is not set
# CONFIG_LIB80211 is not set
# #
# Wireless # CFG80211 needs to be enabled for MAC80211
# #
# CONFIG_CFG80211 is not set # CONFIG_WIMAX is not set
# CONFIG_WIRELESS_EXT is not set
# CONFIG_MAC80211 is not set
# CONFIG_IEEE80211 is not set
# CONFIG_RFKILL is not set # CONFIG_RFKILL is not set
# CONFIG_NET_9P is not set # CONFIG_NET_9P is not set
# CONFIG_CAIF is not set
# CONFIG_CEPH_LIB is not set
# CONFIG_NFC is not set
# #
# UML Network Devices # UML Network Devices
...@@ -331,75 +572,50 @@ CONFIG_UML_NET_DAEMON=y ...@@ -331,75 +572,50 @@ CONFIG_UML_NET_DAEMON=y
CONFIG_UML_NET_MCAST=y CONFIG_UML_NET_MCAST=y
# CONFIG_UML_NET_PCAP is not set # CONFIG_UML_NET_PCAP is not set
CONFIG_UML_NET_SLIRP=y CONFIG_UML_NET_SLIRP=y
CONFIG_NETDEVICES=y
# CONFIG_NETDEVICES_MULTIQUEUE is not set
CONFIG_DUMMY=m
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
# CONFIG_EQUALIZER is not set
CONFIG_TUN=m
# CONFIG_VETH is not set
#
# Wireless LAN
#
# CONFIG_WLAN_PRE80211 is not set
# CONFIG_WLAN_80211 is not set
# CONFIG_WAN is not set
CONFIG_PPP=m
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPP_FILTER is not set
# CONFIG_PPP_ASYNC is not set
# CONFIG_PPP_SYNC_TTY is not set
# CONFIG_PPP_DEFLATE is not set
# CONFIG_PPP_BSDCOMP is not set
# CONFIG_PPP_MPPE is not set
# CONFIG_PPPOE is not set
# CONFIG_PPPOL2TP is not set
CONFIG_SLIP=m
# CONFIG_SLIP_COMPRESSED is not set
CONFIG_SLHC=m
# CONFIG_SLIP_SMART is not set
# CONFIG_SLIP_MODE_SLIP6 is not set
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_CONNECTOR is not set
# #
# File systems # File systems
# #
CONFIG_EXT2_FS=y # CONFIG_EXT2_FS is not set
# CONFIG_EXT2_FS_XATTR is not set # CONFIG_EXT3_FS is not set
# CONFIG_EXT2_FS_XIP is not set CONFIG_EXT4_FS=y
CONFIG_EXT3_FS=y CONFIG_EXT4_USE_FOR_EXT23=y
# CONFIG_EXT3_FS_XATTR is not set CONFIG_EXT4_FS_XATTR=y
# CONFIG_EXT4DEV_FS is not set # CONFIG_EXT4_FS_POSIX_ACL is not set
CONFIG_JBD=y # CONFIG_EXT4_FS_SECURITY is not set
# CONFIG_EXT4_DEBUG is not set
CONFIG_JBD2=y
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=y CONFIG_REISERFS_FS=y
# CONFIG_REISERFS_CHECK is not set # CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set # CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_REISERFS_FS_XATTR is not set # CONFIG_REISERFS_FS_XATTR is not set
# CONFIG_JFS_FS is not set # CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set
# CONFIG_XFS_FS is not set # CONFIG_XFS_FS is not set
# CONFIG_GFS2_FS is not set # CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set
# CONFIG_MINIX_FS is not set # CONFIG_NILFS2_FS is not set
# CONFIG_ROMFS_FS is not set # CONFIG_FS_POSIX_ACL is not set
CONFIG_INOTIFY=y CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y CONFIG_INOTIFY_USER=y
# CONFIG_FANOTIFY is not set
CONFIG_QUOTA=y CONFIG_QUOTA=y
# CONFIG_QUOTA_NETLINK_INTERFACE is not set # CONFIG_QUOTA_NETLINK_INTERFACE is not set
CONFIG_PRINT_QUOTA_WARNING=y CONFIG_PRINT_QUOTA_WARNING=y
# CONFIG_QUOTA_DEBUG is not set
# CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V1 is not set
# CONFIG_QFMT_V2 is not set # CONFIG_QFMT_V2 is not set
CONFIG_QUOTACTL=y CONFIG_QUOTACTL=y
CONFIG_DNOTIFY=y
CONFIG_AUTOFS_FS=m
CONFIG_AUTOFS4_FS=m CONFIG_AUTOFS4_FS=m
# CONFIG_FUSE_FS is not set # CONFIG_FUSE_FS is not set
#
# Caches
#
# CONFIG_FSCACHE is not set
# #
# CD-ROM/DVD Filesystems # CD-ROM/DVD Filesystems
# #
...@@ -421,15 +637,14 @@ CONFIG_JOLIET=y ...@@ -421,15 +637,14 @@ CONFIG_JOLIET=y
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_PROC_SYSCTL=y CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_SYSFS=y CONFIG_SYSFS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set # CONFIG_TMPFS_POSIX_ACL is not set
# CONFIG_TMPFS_XATTR is not set
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
# CONFIG_CONFIGFS_FS is not set # CONFIG_CONFIGFS_FS is not set
CONFIG_MISC_FILESYSTEMS=y
#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set # CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set # CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set # CONFIG_HFS_FS is not set
...@@ -437,26 +652,26 @@ CONFIG_TMPFS=y ...@@ -437,26 +652,26 @@ CONFIG_TMPFS=y
# CONFIG_BEFS_FS is not set # CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set # CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set # CONFIG_EFS_FS is not set
# CONFIG_LOGFS is not set
# CONFIG_CRAMFS is not set # CONFIG_CRAMFS is not set
# CONFIG_SQUASHFS is not set
# CONFIG_VXFS_FS is not set # CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set # CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set # CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_PSTORE is not set
# CONFIG_SYSV_FS is not set # CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set # CONFIG_UFS_FS is not set
CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NETWORK_FILESYSTEMS=y
# CONFIG_NFS_FS is not set # CONFIG_NFS_FS is not set
# CONFIG_NFSD is not set # CONFIG_NFSD is not set
# CONFIG_SMB_FS is not set # CONFIG_CEPH_FS is not set
# CONFIG_CIFS is not set # CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set # CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set # CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set # CONFIG_AFS_FS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_437 is not set
...@@ -497,119 +712,191 @@ CONFIG_NLS_DEFAULT="iso8859-1" ...@@ -497,119 +712,191 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set # CONFIG_NLS_UTF8 is not set
# CONFIG_DLM is not set
# #
# Security options # Security options
# #
# CONFIG_KEYS is not set # CONFIG_KEYS is not set
# CONFIG_SECURITY_DMESG_RESTRICT is not set
# CONFIG_SECURITY is not set # CONFIG_SECURITY is not set
# CONFIG_SECURITY_FILE_CAPABILITIES is not set # CONFIG_SECURITYFS is not set
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_DEFAULT_SECURITY=""
CONFIG_CRYPTO=y CONFIG_CRYPTO=y
# CONFIG_CRYPTO_SEQIV is not set
#
# Crypto core or helper
#
# CONFIG_CRYPTO_FIPS is not set
CONFIG_CRYPTO_ALGAPI=m
CONFIG_CRYPTO_ALGAPI2=m
CONFIG_CRYPTO_RNG=m
CONFIG_CRYPTO_RNG2=m
# CONFIG_CRYPTO_MANAGER is not set # CONFIG_CRYPTO_MANAGER is not set
# CONFIG_CRYPTO_MANAGER2 is not set
# CONFIG_CRYPTO_USER is not set
# CONFIG_CRYPTO_GF128MUL is not set
# CONFIG_CRYPTO_NULL is not set
# CONFIG_CRYPTO_CRYPTD is not set
# CONFIG_CRYPTO_AUTHENC is not set
# CONFIG_CRYPTO_TEST is not set
#
# Authenticated Encryption with Associated Data
#
# CONFIG_CRYPTO_CCM is not set
# CONFIG_CRYPTO_GCM is not set
# CONFIG_CRYPTO_SEQIV is not set
#
# Block modes
#
# CONFIG_CRYPTO_CBC is not set
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
# CONFIG_CRYPTO_ECB is not set
# CONFIG_CRYPTO_LRW is not set
# CONFIG_CRYPTO_PCBC is not set
# CONFIG_CRYPTO_XTS is not set
#
# Hash modes
#
# CONFIG_CRYPTO_HMAC is not set # CONFIG_CRYPTO_HMAC is not set
# CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_XCBC is not set
# CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_VMAC is not set
#
# Digest
#
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_GHASH is not set
# CONFIG_CRYPTO_MD4 is not set # CONFIG_CRYPTO_MD4 is not set
# CONFIG_CRYPTO_MD5 is not set # CONFIG_CRYPTO_MD5 is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_RMD128 is not set
# CONFIG_CRYPTO_RMD160 is not set
# CONFIG_CRYPTO_RMD256 is not set
# CONFIG_CRYPTO_RMD320 is not set
# CONFIG_CRYPTO_SHA1 is not set # CONFIG_CRYPTO_SHA1 is not set
# CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_TGR192 is not set
# CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_ECB is not set
# CONFIG_CRYPTO_CBC is not set #
# CONFIG_CRYPTO_PCBC is not set # Ciphers
# CONFIG_CRYPTO_LRW is not set #
# CONFIG_CRYPTO_XTS is not set CONFIG_CRYPTO_AES=m
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_GCM is not set
# CONFIG_CRYPTO_CCM is not set
# CONFIG_CRYPTO_CRYPTD is not set
# CONFIG_CRYPTO_DES is not set
# CONFIG_CRYPTO_FCRYPT is not set
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_TWOFISH_586 is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_AES is not set
# CONFIG_CRYPTO_AES_586 is not set # CONFIG_CRYPTO_AES_586 is not set
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_CAMELLIA is not set
# CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_DES is not set
# CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_FCRYPT is not set
# CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20 is not set
# CONFIG_CRYPTO_SALSA20_586 is not set # CONFIG_CRYPTO_SALSA20_586 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_TWOFISH_586 is not set
#
# Compression
#
# CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_DEFLATE is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_ZLIB is not set
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_CAMELLIA is not set
# CONFIG_CRYPTO_TEST is not set
# CONFIG_CRYPTO_AUTHENC is not set
# CONFIG_CRYPTO_LZO is not set # CONFIG_CRYPTO_LZO is not set
#
# Random Number Generation
#
CONFIG_CRYPTO_ANSI_CPRNG=m
# CONFIG_CRYPTO_USER_API_HASH is not set
# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_HW=y
# CONFIG_BINARY_PRINTF is not set
# #
# Library routines # Library routines
# #
CONFIG_BITREVERSE=m CONFIG_BITREVERSE=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_GENERIC_IO=y
# CONFIG_CRC_CCITT is not set # CONFIG_CRC_CCITT is not set
# CONFIG_CRC16 is not set CONFIG_CRC16=y
# CONFIG_CRC_T10DIF is not set
# CONFIG_CRC_ITU_T is not set # CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=m CONFIG_CRC32=y
# CONFIG_CRC7 is not set # CONFIG_CRC7 is not set
# CONFIG_LIBCRC32C is not set # CONFIG_LIBCRC32C is not set
CONFIG_PLIST=y # CONFIG_CRC8 is not set
# CONFIG_XZ_DEC is not set
# # CONFIG_XZ_DEC_BCJ is not set
# SCSI device support CONFIG_DQL=y
# CONFIG_NLATTR=y
# CONFIG_RAID_ATTRS is not set # CONFIG_AVERAGE is not set
# CONFIG_SCSI is not set # CONFIG_CORDIC is not set
# CONFIG_SCSI_DMA is not set
# CONFIG_SCSI_NETLINK is not set
# CONFIG_MD is not set
# CONFIG_INPUT is not set
# #
# Kernel hacking # Kernel hacking
# #
# CONFIG_PRINTK_TIME is not set # CONFIG_PRINTK_TIME is not set
CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
CONFIG_ENABLE_WARN_DEPRECATED=y CONFIG_ENABLE_WARN_DEPRECATED=y
CONFIG_ENABLE_MUST_CHECK=y CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=1024
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_UNUSED_SYMBOLS is not set # CONFIG_UNUSED_SYMBOLS is not set
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_SECTION_MISMATCH is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set # CONFIG_DEBUG_SHIRQ is not set
CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_LOCKUP_DETECTOR is not set
# CONFIG_HARDLOCKUP_DETECTOR is not set
# CONFIG_DETECT_HUNG_TASK is not set
CONFIG_SCHED_DEBUG=y CONFIG_SCHED_DEBUG=y
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_TIMER_STATS is not set # CONFIG_TIMER_STATS is not set
# CONFIG_DEBUG_OBJECTS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set # CONFIG_RT_MUTEX_TESTER is not set
# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set # CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_SPARSE_RCU_POINTER is not set
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_WRITECOUNT is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_LIST is not set
# CONFIG_TEST_LIST_SORT is not set
# CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
CONFIG_FORCED_INLINING=y
# CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# CONFIG_FAULT_INJECTION is not set # CONFIG_FAULT_INJECTION is not set
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_ATOMIC64_SELFTEST is not set
# CONFIG_SAMPLES is not set # CONFIG_SAMPLES is not set
# CONFIG_TEST_KSTRTOX is not set
# CONFIG_GPROF is not set # CONFIG_GPROF is not set
# CONFIG_GCOV is not set # CONFIG_GCOV is not set
# CONFIG_DEBUG_STACK_USAGE is not set CONFIG_EARLY_PRINTK=y
...@@ -27,24 +27,24 @@ struct chan { ...@@ -27,24 +27,24 @@ struct chan {
void *data; void *data;
}; };
extern void chan_interrupt(struct list_head *chans, struct delayed_work *task, extern void chan_interrupt(struct line *line,
struct tty_struct *tty, int irq); struct tty_struct *tty, int irq);
extern int parse_chan_pair(char *str, struct line *line, int device, extern int parse_chan_pair(char *str, struct line *line, int device,
const struct chan_opts *opts, char **error_out); const struct chan_opts *opts, char **error_out);
extern int write_chan(struct list_head *chans, const char *buf, int len, extern int write_chan(struct chan *chan, const char *buf, int len,
int write_irq); int write_irq);
extern int console_write_chan(struct list_head *chans, const char *buf, extern int console_write_chan(struct chan *chan, const char *buf,
int len); int len);
extern int console_open_chan(struct line *line, struct console *co); extern int console_open_chan(struct line *line, struct console *co);
extern void deactivate_chan(struct list_head *chans, int irq); extern void deactivate_chan(struct chan *chan, int irq);
extern void reactivate_chan(struct list_head *chans, int irq); extern void reactivate_chan(struct chan *chan, int irq);
extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty); extern void chan_enable_winch(struct chan *chan, struct tty_struct *tty);
extern int enable_chan(struct line *line); extern int enable_chan(struct line *line);
extern void close_chan(struct list_head *chans, int delay_free_irq); extern void close_chan(struct line *line);
extern int chan_window_size(struct list_head *chans, extern int chan_window_size(struct line *line,
unsigned short *rows_out, unsigned short *rows_out,
unsigned short *cols_out); unsigned short *cols_out);
extern int chan_config_string(struct list_head *chans, char *str, int size, extern int chan_config_string(struct line *line, char *str, int size,
char **error_out); char **error_out);
#endif #endif
...@@ -140,18 +140,18 @@ static int open_chan(struct list_head *chans) ...@@ -140,18 +140,18 @@ static int open_chan(struct list_head *chans)
return err; return err;
} }
void chan_enable_winch(struct list_head *chans, struct tty_struct *tty) void chan_enable_winch(struct chan *chan, struct tty_struct *tty)
{ {
struct list_head *ele; if (chan && chan->primary && chan->ops->winch)
struct chan *chan; register_winch(chan->fd, tty);
}
list_for_each(ele, chans) { static void line_timer_cb(struct work_struct *work)
chan = list_entry(ele, struct chan, list); {
if (chan->primary && chan->output && chan->ops->winch) { struct line *line = container_of(work, struct line, task.work);
register_winch(chan->fd, tty);
return; if (!line->throttled)
} chan_interrupt(line, line->tty, line->driver->read_irq);
}
} }
int enable_chan(struct line *line) int enable_chan(struct line *line)
...@@ -160,6 +160,8 @@ int enable_chan(struct line *line) ...@@ -160,6 +160,8 @@ int enable_chan(struct line *line)
struct chan *chan; struct chan *chan;
int err; int err;
INIT_DELAYED_WORK(&line->task, line_timer_cb);
list_for_each(ele, &line->chan_list) { list_for_each(ele, &line->chan_list) {
chan = list_entry(ele, struct chan, list); chan = list_entry(ele, struct chan, list);
err = open_one_chan(chan); err = open_one_chan(chan);
...@@ -183,7 +185,7 @@ int enable_chan(struct line *line) ...@@ -183,7 +185,7 @@ int enable_chan(struct line *line)
return 0; return 0;
out_close: out_close:
close_chan(&line->chan_list, 0); close_chan(line);
return err; return err;
} }
...@@ -244,7 +246,7 @@ static void close_one_chan(struct chan *chan, int delay_free_irq) ...@@ -244,7 +246,7 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
chan->fd = -1; chan->fd = -1;
} }
void close_chan(struct list_head *chans, int delay_free_irq) void close_chan(struct line *line)
{ {
struct chan *chan; struct chan *chan;
...@@ -253,77 +255,50 @@ void close_chan(struct list_head *chans, int delay_free_irq) ...@@ -253,77 +255,50 @@ void close_chan(struct list_head *chans, int delay_free_irq)
* state. Then, the first one opened will have the original state, * state. Then, the first one opened will have the original state,
* so it must be the last closed. * so it must be the last closed.
*/ */
list_for_each_entry_reverse(chan, chans, list) { list_for_each_entry_reverse(chan, &line->chan_list, list) {
close_one_chan(chan, delay_free_irq); close_one_chan(chan, 0);
} }
} }
void deactivate_chan(struct list_head *chans, int irq) void deactivate_chan(struct chan *chan, int irq)
{ {
struct list_head *ele; if (chan && chan->enabled)
deactivate_fd(chan->fd, irq);
struct chan *chan;
list_for_each(ele, chans) {
chan = list_entry(ele, struct chan, list);
if (chan->enabled && chan->input)
deactivate_fd(chan->fd, irq);
}
} }
void reactivate_chan(struct list_head *chans, int irq) void reactivate_chan(struct chan *chan, int irq)
{ {
struct list_head *ele; if (chan && chan->enabled)
struct chan *chan; reactivate_fd(chan->fd, irq);
list_for_each(ele, chans) {
chan = list_entry(ele, struct chan, list);
if (chan->enabled && chan->input)
reactivate_fd(chan->fd, irq);
}
} }
int write_chan(struct list_head *chans, const char *buf, int len, int write_chan(struct chan *chan, const char *buf, int len,
int write_irq) int write_irq)
{ {
struct list_head *ele;
struct chan *chan = NULL;
int n, ret = 0; int n, ret = 0;
if (len == 0) if (len == 0 || !chan || !chan->ops->write)
return 0; return 0;
list_for_each(ele, chans) { n = chan->ops->write(chan->fd, buf, len, chan->data);
chan = list_entry(ele, struct chan, list); if (chan->primary) {
if (!chan->output || (chan->ops->write == NULL)) ret = n;
continue; if ((ret == -EAGAIN) || ((ret >= 0) && (ret < len)))
reactivate_fd(chan->fd, write_irq);
n = chan->ops->write(chan->fd, buf, len, chan->data);
if (chan->primary) {
ret = n;
if ((ret == -EAGAIN) || ((ret >= 0) && (ret < len)))
reactivate_fd(chan->fd, write_irq);
}
} }
return ret; return ret;
} }
int console_write_chan(struct list_head *chans, const char *buf, int len) int console_write_chan(struct chan *chan, const char *buf, int len)
{ {
struct list_head *ele;
struct chan *chan;
int n, ret = 0; int n, ret = 0;
list_for_each(ele, chans) { if (!chan || !chan->ops->console_write)
chan = list_entry(ele, struct chan, list); return 0;
if (!chan->output || (chan->ops->console_write == NULL))
continue;
n = chan->ops->console_write(chan->fd, buf, len); n = chan->ops->console_write(chan->fd, buf, len);
if (chan->primary) if (chan->primary)
ret = n; ret = n;
}
return ret; return ret;
} }
...@@ -340,20 +315,24 @@ int console_open_chan(struct line *line, struct console *co) ...@@ -340,20 +315,24 @@ int console_open_chan(struct line *line, struct console *co)
return 0; return 0;
} }
int chan_window_size(struct list_head *chans, unsigned short *rows_out, int chan_window_size(struct line *line, unsigned short *rows_out,
unsigned short *cols_out) unsigned short *cols_out)
{ {
struct list_head *ele;
struct chan *chan; struct chan *chan;
list_for_each(ele, chans) { chan = line->chan_in;
chan = list_entry(ele, struct chan, list); if (chan && chan->primary) {
if (chan->primary) { if (chan->ops->window_size == NULL)
if (chan->ops->window_size == NULL) return 0;
return 0; return chan->ops->window_size(chan->fd, chan->data,
return chan->ops->window_size(chan->fd, chan->data, rows_out, cols_out);
rows_out, cols_out); }
} chan = line->chan_out;
if (chan && chan->primary) {
if (chan->ops->window_size == NULL)
return 0;
return chan->ops->window_size(chan->fd, chan->data,
rows_out, cols_out);
} }
return 0; return 0;
} }
...@@ -429,21 +408,15 @@ static int chan_pair_config_string(struct chan *in, struct chan *out, ...@@ -429,21 +408,15 @@ static int chan_pair_config_string(struct chan *in, struct chan *out,
return n; return n;
} }
int chan_config_string(struct list_head *chans, char *str, int size, int chan_config_string(struct line *line, char *str, int size,
char **error_out) char **error_out)
{ {
struct list_head *ele; struct chan *in = line->chan_in, *out = line->chan_out;
struct chan *chan, *in = NULL, *out = NULL;
list_for_each(ele, chans) { if (in && !in->primary)
chan = list_entry(ele, struct chan, list); in = NULL;
if (!chan->primary) if (out && !out->primary)
continue; out = NULL;
if (chan->input)
in = chan;
if (chan->output)
out = chan;
}
return chan_pair_config_string(in, out, str, size, error_out); return chan_pair_config_string(in, out, str, size, error_out);
} }
...@@ -547,10 +520,14 @@ int parse_chan_pair(char *str, struct line *line, int device, ...@@ -547,10 +520,14 @@ int parse_chan_pair(char *str, struct line *line, int device,
char *in, *out; char *in, *out;
if (!list_empty(chans)) { if (!list_empty(chans)) {
line->chan_in = line->chan_out = NULL;
free_chan(chans); free_chan(chans);
INIT_LIST_HEAD(chans); INIT_LIST_HEAD(chans);
} }
if (!str)
return 0;
out = strchr(str, ','); out = strchr(str, ',');
if (out != NULL) { if (out != NULL) {
in = str; in = str;
...@@ -562,6 +539,7 @@ int parse_chan_pair(char *str, struct line *line, int device, ...@@ -562,6 +539,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
new->input = 1; new->input = 1;
list_add(&new->list, chans); list_add(&new->list, chans);
line->chan_in = new;
new = parse_chan(line, out, device, opts, error_out); new = parse_chan(line, out, device, opts, error_out);
if (new == NULL) if (new == NULL)
...@@ -569,6 +547,7 @@ int parse_chan_pair(char *str, struct line *line, int device, ...@@ -569,6 +547,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
list_add(&new->list, chans); list_add(&new->list, chans);
new->output = 1; new->output = 1;
line->chan_out = new;
} }
else { else {
new = parse_chan(line, str, device, opts, error_out); 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,43 +557,42 @@ int parse_chan_pair(char *str, struct line *line, int device,
list_add(&new->list, chans); list_add(&new->list, chans);
new->input = 1; new->input = 1;
new->output = 1; new->output = 1;
line->chan_in = line->chan_out = new;
} }
return 0; return 0;
} }
void chan_interrupt(struct list_head *chans, struct delayed_work *task, void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
struct tty_struct *tty, int irq)
{ {
struct list_head *ele, *next; struct chan *chan = line->chan_in;
struct chan *chan;
int err; int err;
char c; char c;
list_for_each_safe(ele, next, chans) { if (!chan || !chan->ops->read)
chan = list_entry(ele, struct chan, list); goto out;
if (!chan->input || (chan->ops->read == NULL))
continue; do {
do { if (tty && !tty_buffer_request_room(tty, 1)) {
if (tty && !tty_buffer_request_room(tty, 1)) { schedule_delayed_work(&line->task, 1);
schedule_delayed_work(task, 1); goto out;
goto out;
}
err = chan->ops->read(chan->fd, &c, chan->data);
if (err > 0)
tty_receive_char(tty, c);
} while (err > 0);
if (err == 0)
reactivate_fd(chan->fd, irq);
if (err == -EIO) {
if (chan->primary) {
if (tty != NULL)
tty_hangup(tty);
close_chan(chans, 1);
return;
}
else close_one_chan(chan, 1);
} }
err = chan->ops->read(chan->fd, &c, chan->data);
if (err > 0)
tty_receive_char(tty, c);
} while (err > 0);
if (err == 0)
reactivate_fd(chan->fd, irq);
if (err == -EIO) {
if (chan->primary) {
if (tty != NULL)
tty_hangup(tty);
if (line->chan_out != chan)
close_one_chan(line->chan_out, 1);
}
close_one_chan(chan, 1);
if (chan->primary)
return;
} }
out: out:
if (tty) if (tty)
......
...@@ -14,8 +14,6 @@ struct chan_opts { ...@@ -14,8 +14,6 @@ struct chan_opts {
const int raw; const int raw;
}; };
enum chan_init_pri { INIT_STATIC, INIT_ALL, INIT_ONE };
struct chan_ops { struct chan_ops {
char *type; char *type;
void *(*init)(char *, int, const struct chan_opts *); void *(*init)(char *, int, const struct chan_opts *);
......
...@@ -21,19 +21,10 @@ static irqreturn_t line_interrupt(int irq, void *data) ...@@ -21,19 +21,10 @@ static irqreturn_t line_interrupt(int irq, void *data)
struct line *line = chan->line; struct line *line = chan->line;
if (line) if (line)
chan_interrupt(&line->chan_list, &line->task, line->tty, irq); chan_interrupt(line, line->tty, irq);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void line_timer_cb(struct work_struct *work)
{
struct line *line = container_of(work, struct line, task.work);
if (!line->throttled)
chan_interrupt(&line->chan_list, &line->task, line->tty,
line->driver->read_irq);
}
/* /*
* Returns the free space inside the ring buffer of this line. * Returns the free space inside the ring buffer of this line.
* *
...@@ -145,7 +136,7 @@ static int flush_buffer(struct line *line) ...@@ -145,7 +136,7 @@ static int flush_buffer(struct line *line)
/* line->buffer + LINE_BUFSIZE is the end of the buffer! */ /* line->buffer + LINE_BUFSIZE is the end of the buffer! */
count = line->buffer + LINE_BUFSIZE - line->head; count = line->buffer + LINE_BUFSIZE - line->head;
n = write_chan(&line->chan_list, line->head, count, n = write_chan(line->chan_out, line->head, count,
line->driver->write_irq); line->driver->write_irq);
if (n < 0) if (n < 0)
return n; return n;
...@@ -162,7 +153,7 @@ static int flush_buffer(struct line *line) ...@@ -162,7 +153,7 @@ static int flush_buffer(struct line *line)
} }
count = line->tail - line->head; count = line->tail - line->head;
n = write_chan(&line->chan_list, line->head, count, n = write_chan(line->chan_out, line->head, count,
line->driver->write_irq); line->driver->write_irq);
if (n < 0) if (n < 0)
...@@ -206,7 +197,7 @@ int line_write(struct tty_struct *tty, const unsigned char *buf, int len) ...@@ -206,7 +197,7 @@ int line_write(struct tty_struct *tty, const unsigned char *buf, int len)
if (line->head != line->tail) if (line->head != line->tail)
ret = buffer_data(line, buf, len); ret = buffer_data(line, buf, len);
else { else {
n = write_chan(&line->chan_list, buf, len, n = write_chan(line->chan_out, buf, len,
line->driver->write_irq); line->driver->write_irq);
if (n < 0) { if (n < 0) {
ret = n; ret = n;
...@@ -318,7 +309,7 @@ void line_throttle(struct tty_struct *tty) ...@@ -318,7 +309,7 @@ void line_throttle(struct tty_struct *tty)
{ {
struct line *line = tty->driver_data; struct line *line = tty->driver_data;
deactivate_chan(&line->chan_list, line->driver->read_irq); deactivate_chan(line->chan_in, line->driver->read_irq);
line->throttled = 1; line->throttled = 1;
} }
...@@ -327,8 +318,7 @@ void line_unthrottle(struct tty_struct *tty) ...@@ -327,8 +318,7 @@ void line_unthrottle(struct tty_struct *tty)
struct line *line = tty->driver_data; struct line *line = tty->driver_data;
line->throttled = 0; line->throttled = 0;
chan_interrupt(&line->chan_list, &line->task, tty, chan_interrupt(line, tty, line->driver->read_irq);
line->driver->read_irq);
/* /*
* Maybe there is enough stuff pending that calling the interrupt * Maybe there is enough stuff pending that calling the interrupt
...@@ -336,7 +326,7 @@ void line_unthrottle(struct tty_struct *tty) ...@@ -336,7 +326,7 @@ void line_unthrottle(struct tty_struct *tty)
* again and we shouldn't turn the interrupt back on. * again and we shouldn't turn the interrupt back on.
*/ */
if (!line->throttled) if (!line->throttled)
reactivate_chan(&line->chan_list, line->driver->read_irq); reactivate_chan(line->chan_in, line->driver->read_irq);
} }
static irqreturn_t line_write_interrupt(int irq, void *data) static irqreturn_t line_write_interrupt(int irq, void *data)
...@@ -347,13 +337,14 @@ static irqreturn_t line_write_interrupt(int irq, void *data) ...@@ -347,13 +337,14 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
int err; int err;
/* /*
* Interrupts are disabled here because we registered the interrupt with * Interrupts are disabled here because genirq keep irqs disabled when
* IRQF_DISABLED (see line_setup_irq). * calling the action handler.
*/ */
spin_lock(&line->lock); spin_lock(&line->lock);
err = flush_buffer(line); err = flush_buffer(line);
if (err == 0) { if (err == 0) {
spin_unlock(&line->lock);
return IRQ_NONE; return IRQ_NONE;
} else if (err < 0) { } else if (err < 0) {
line->head = line->buffer; line->head = line->buffer;
...@@ -371,7 +362,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data) ...@@ -371,7 +362,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
int line_setup_irq(int fd, int input, int output, struct line *line, void *data) int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
{ {
const struct line_driver *driver = line->driver; const struct line_driver *driver = line->driver;
int err = 0, flags = IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM; int err = 0, flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM;
if (input) if (input)
err = um_request_irq(driver->read_irq, fd, IRQ_READ, 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,7 +374,6 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
err = um_request_irq(driver->write_irq, fd, IRQ_WRITE, err = um_request_irq(driver->write_irq, fd, IRQ_WRITE,
line_write_interrupt, flags, line_write_interrupt, flags,
driver->write_irq_name, data); driver->write_irq_name, data);
line->have_irq = 1;
return err; return err;
} }
...@@ -409,7 +399,7 @@ int line_open(struct line *lines, struct tty_struct *tty) ...@@ -409,7 +399,7 @@ int line_open(struct line *lines, struct tty_struct *tty)
struct line *line = &lines[tty->index]; struct line *line = &lines[tty->index];
int err = -ENODEV; int err = -ENODEV;
spin_lock(&line->count_lock); mutex_lock(&line->count_lock);
if (!line->valid) if (!line->valid)
goto out_unlock; goto out_unlock;
...@@ -421,25 +411,19 @@ int line_open(struct line *lines, struct tty_struct *tty) ...@@ -421,25 +411,19 @@ int line_open(struct line *lines, struct tty_struct *tty)
tty->driver_data = line; tty->driver_data = line;
line->tty = tty; line->tty = tty;
spin_unlock(&line->count_lock);
err = enable_chan(line); err = enable_chan(line);
if (err) /* line_close() will be called by our caller */ if (err) /* line_close() will be called by our caller */
return err; goto out_unlock;
INIT_DELAYED_WORK(&line->task, line_timer_cb);
if (!line->sigio) { if (!line->sigio) {
chan_enable_winch(&line->chan_list, tty); chan_enable_winch(line->chan_out, tty);
line->sigio = 1; line->sigio = 1;
} }
chan_window_size(&line->chan_list, &tty->winsize.ws_row, chan_window_size(line, &tty->winsize.ws_row,
&tty->winsize.ws_col); &tty->winsize.ws_col);
return 0;
out_unlock: out_unlock:
spin_unlock(&line->count_lock); mutex_unlock(&line->count_lock);
return err; return err;
} }
...@@ -459,7 +443,7 @@ void line_close(struct tty_struct *tty, struct file * filp) ...@@ -459,7 +443,7 @@ void line_close(struct tty_struct *tty, struct file * filp)
/* We ignore the error anyway! */ /* We ignore the error anyway! */
flush_buffer(line); flush_buffer(line);
spin_lock(&line->count_lock); mutex_lock(&line->count_lock);
BUG_ON(!line->valid); BUG_ON(!line->valid);
if (--line->count) if (--line->count)
...@@ -468,17 +452,13 @@ void line_close(struct tty_struct *tty, struct file * filp) ...@@ -468,17 +452,13 @@ void line_close(struct tty_struct *tty, struct file * filp)
line->tty = NULL; line->tty = NULL;
tty->driver_data = NULL; tty->driver_data = NULL;
spin_unlock(&line->count_lock);
if (line->sigio) { if (line->sigio) {
unregister_winch(tty); unregister_winch(tty);
line->sigio = 0; line->sigio = 0;
} }
return;
out_unlock: out_unlock:
spin_unlock(&line->count_lock); mutex_unlock(&line->count_lock);
} }
void close_lines(struct line *lines, int nlines) void close_lines(struct line *lines, int nlines)
...@@ -486,34 +466,60 @@ void close_lines(struct line *lines, int nlines) ...@@ -486,34 +466,60 @@ void close_lines(struct line *lines, int nlines)
int i; int i;
for(i = 0; i < nlines; i++) for(i = 0; i < nlines; i++)
close_chan(&lines[i].chan_list, 0); close_chan(&lines[i]);
} }
static int setup_one_line(struct line *lines, int n, char *init, int init_prio, int setup_one_line(struct line *lines, int n, char *init,
char **error_out) const struct chan_opts *opts, char **error_out)
{ {
struct line *line = &lines[n]; struct line *line = &lines[n];
struct tty_driver *driver = line->driver->driver;
int err = -EINVAL; int err = -EINVAL;
spin_lock(&line->count_lock); mutex_lock(&line->count_lock);
if (line->count) { if (line->count) {
*error_out = "Device is already open"; *error_out = "Device is already open";
goto out; goto out;
} }
if (line->init_pri <= init_prio) { if (!strcmp(init, "none")) {
line->init_pri = init_prio; if (line->valid) {
if (!strcmp(init, "none")) line->valid = 0;
kfree(line->init_str);
tty_unregister_device(driver, n);
parse_chan_pair(NULL, line, n, opts, error_out);
err = 0;
}
} else {
char *new = kstrdup(init, GFP_KERNEL);
if (!new) {
*error_out = "Failed to allocate memory";
return -ENOMEM;
}
if (line->valid) {
tty_unregister_device(driver, n);
kfree(line->init_str);
}
line->init_str = new;
line->valid = 1;
err = parse_chan_pair(new, line, n, opts, error_out);
if (!err) {
struct device *d = tty_register_device(driver, n, NULL);
if (IS_ERR(d)) {
*error_out = "Failed to register device";
err = PTR_ERR(d);
parse_chan_pair(NULL, line, n, opts, error_out);
}
}
if (err) {
line->init_str = NULL;
line->valid = 0; line->valid = 0;
else { kfree(new);
line->init_str = init;
line->valid = 1;
} }
} }
err = 0;
out: out:
spin_unlock(&line->count_lock); mutex_unlock(&line->count_lock);
return err; return err;
} }
...@@ -524,54 +530,43 @@ static int setup_one_line(struct line *lines, int n, char *init, int init_prio, ...@@ -524,54 +530,43 @@ static int setup_one_line(struct line *lines, int n, char *init, int init_prio,
* @error_out is an error string in the case of failure; * @error_out is an error string in the case of failure;
*/ */
int line_setup(struct line *lines, unsigned int num, char *init, int line_setup(char **conf, unsigned int num, char **def,
char **error_out) char *init, char *name)
{ {
int i, n, err; char *error;
char *end;
if (*init == '=') { if (*init == '=') {
/* /*
* We said con=/ssl= instead of con#=, so we are configuring all * We said con=/ssl= instead of con#=, so we are configuring all
* consoles at once. * consoles at once.
*/ */
n = -1; *def = init + 1;
} } else {
else { char *end;
n = simple_strtoul(init, &end, 0); unsigned n = simple_strtoul(init, &end, 0);
if (*end != '=') { if (*end != '=') {
*error_out = "Couldn't parse device number"; error = "Couldn't parse device number";
return -EINVAL; goto out;
} }
init = end; if (n >= num) {
} error = "Device number out of range";
init++; goto out;
if (n >= (signed int) num) {
*error_out = "Device number out of range";
return -EINVAL;
}
else if (n >= 0) {
err = setup_one_line(lines, n, init, INIT_ONE, error_out);
if (err)
return err;
}
else {
for(i = 0; i < num; i++) {
err = setup_one_line(lines, i, init, INIT_ALL,
error_out);
if (err)
return err;
} }
conf[n] = end + 1;
} }
return n == -1 ? num : n; return 0;
out:
printk(KERN_ERR "Failed to set up %s with "
"configuration string \"%s\" : %s\n", name, init, error);
return -EINVAL;
} }
int line_config(struct line *lines, unsigned int num, char *str, int line_config(struct line *lines, unsigned int num, char *str,
const struct chan_opts *opts, char **error_out) const struct chan_opts *opts, char **error_out)
{ {
struct line *line; char *end;
char *new;
int n; int n;
if (*str == '=') { if (*str == '=') {
...@@ -579,17 +574,17 @@ int line_config(struct line *lines, unsigned int num, char *str, ...@@ -579,17 +574,17 @@ int line_config(struct line *lines, unsigned int num, char *str,
return -EINVAL; return -EINVAL;
} }
new = kstrdup(str, GFP_KERNEL); n = simple_strtoul(str, &end, 0);
if (new == NULL) { if (*end++ != '=') {
*error_out = "Failed to allocate memory"; *error_out = "Couldn't parse device number";
return -ENOMEM; return -EINVAL;
}
if (n >= num) {
*error_out = "Device number out of range";
return -EINVAL;
} }
n = line_setup(lines, num, new, error_out);
if (n < 0)
return n;
line = &lines[n]; return setup_one_line(lines, n, end, opts, error_out);
return parse_chan_pair(line->init_str, line, n, opts, error_out);
} }
int line_get_config(char *name, struct line *lines, unsigned int num, char *str, int 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,13 +607,13 @@ int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
line = &lines[dev]; line = &lines[dev];
spin_lock(&line->count_lock); mutex_lock(&line->count_lock);
if (!line->valid) if (!line->valid)
CONFIG_CHUNK(str, size, n, "none", 1); CONFIG_CHUNK(str, size, n, "none", 1);
else if (line->tty == NULL) else if (line->tty == NULL)
CONFIG_CHUNK(str, size, n, line->init_str, 1); CONFIG_CHUNK(str, size, n, line->init_str, 1);
else n = chan_config_string(&line->chan_list, str, size, error_out); else n = chan_config_string(line, str, size, error_out);
spin_unlock(&line->count_lock); mutex_unlock(&line->count_lock);
return n; return n;
} }
...@@ -640,25 +635,23 @@ int line_id(char **str, int *start_out, int *end_out) ...@@ -640,25 +635,23 @@ int line_id(char **str, int *start_out, int *end_out)
int line_remove(struct line *lines, unsigned int num, int n, char **error_out) int line_remove(struct line *lines, unsigned int num, int n, char **error_out)
{ {
int err; if (n >= num) {
char config[sizeof("conxxxx=none\0")]; *error_out = "Device number out of range";
return -EINVAL;
sprintf(config, "%d=none", n); }
err = line_setup(lines, num, config, error_out); return setup_one_line(lines, n, "none", NULL, error_out);
if (err >= 0)
err = 0;
return err;
} }
struct tty_driver *register_lines(struct line_driver *line_driver, int register_lines(struct line_driver *line_driver,
const struct tty_operations *ops, const struct tty_operations *ops,
struct line *lines, int nlines) struct line *lines, int nlines)
{ {
int i;
struct tty_driver *driver = alloc_tty_driver(nlines); struct tty_driver *driver = alloc_tty_driver(nlines);
int err;
int i;
if (!driver) if (!driver)
return NULL; return -ENOMEM;
driver->driver_name = line_driver->name; driver->driver_name = line_driver->name;
driver->name = line_driver->device_name; driver->name = line_driver->device_name;
...@@ -666,54 +659,33 @@ struct tty_driver *register_lines(struct line_driver *line_driver, ...@@ -666,54 +659,33 @@ struct tty_driver *register_lines(struct line_driver *line_driver,
driver->minor_start = line_driver->minor_start; driver->minor_start = line_driver->minor_start;
driver->type = line_driver->type; driver->type = line_driver->type;
driver->subtype = line_driver->subtype; driver->subtype = line_driver->subtype;
driver->flags = TTY_DRIVER_REAL_RAW; driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
driver->init_termios = tty_std_termios; driver->init_termios = tty_std_termios;
for (i = 0; i < nlines; i++) {
spin_lock_init(&lines[i].lock);
mutex_init(&lines[i].count_lock);
lines[i].driver = line_driver;
INIT_LIST_HEAD(&lines[i].chan_list);
}
tty_set_operations(driver, ops); tty_set_operations(driver, ops);
if (tty_register_driver(driver)) { err = tty_register_driver(driver);
if (err) {
printk(KERN_ERR "register_lines : can't register %s driver\n", printk(KERN_ERR "register_lines : can't register %s driver\n",
line_driver->name); line_driver->name);
put_tty_driver(driver); put_tty_driver(driver);
return NULL; return err;
}
for(i = 0; i < nlines; i++) {
if (!lines[i].valid)
tty_unregister_device(driver, i);
} }
line_driver->driver = driver;
mconsole_register_dev(&line_driver->mc); mconsole_register_dev(&line_driver->mc);
return driver; return 0;
} }
static DEFINE_SPINLOCK(winch_handler_lock); static DEFINE_SPINLOCK(winch_handler_lock);
static LIST_HEAD(winch_handlers); static LIST_HEAD(winch_handlers);
void lines_init(struct line *lines, int nlines, struct chan_opts *opts)
{
struct line *line;
char *error;
int i;
for(i = 0; i < nlines; i++) {
line = &lines[i];
INIT_LIST_HEAD(&line->chan_list);
if (line->init_str == NULL)
continue;
line->init_str = kstrdup(line->init_str, GFP_KERNEL);
if (line->init_str == NULL)
printk(KERN_ERR "lines_init - kstrdup returned NULL\n");
if (parse_chan_pair(line->init_str, line, i, opts, &error)) {
printk(KERN_ERR "parse_chan_pair failed for "
"device %d : %s\n", i, error);
line->valid = 0;
}
}
}
struct winch { struct winch {
struct list_head list; struct list_head list;
int fd; int fd;
...@@ -777,7 +749,7 @@ static irqreturn_t winch_interrupt(int irq, void *data) ...@@ -777,7 +749,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
if (tty != NULL) { if (tty != NULL) {
line = tty->driver_data; line = tty->driver_data;
if (line != NULL) { if (line != NULL) {
chan_window_size(&line->chan_list, &tty->winsize.ws_row, chan_window_size(line, &tty->winsize.ws_row,
&tty->winsize.ws_col); &tty->winsize.ws_col);
kill_pgrp(tty->pgrp, SIGWINCH, 1); kill_pgrp(tty->pgrp, SIGWINCH, 1);
} }
...@@ -807,7 +779,7 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty, ...@@ -807,7 +779,7 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty,
.stack = stack }); .stack = stack });
if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, IRQF_SHARED | IRQF_SAMPLE_RANDOM,
"winch", winch) < 0) { "winch", winch) < 0) {
printk(KERN_ERR "register_winch_irq - failed to register " printk(KERN_ERR "register_winch_irq - failed to register "
"IRQ\n"); "IRQ\n");
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include "chan_user.h" #include "chan_user.h"
#include "mconsole_kern.h" #include "mconsole_kern.h"
/* There's only one modifiable field in this - .mc.list */ /* There's only two modifiable fields in this - .mc.list and .driver */
struct line_driver { struct line_driver {
const char *name; const char *name;
const char *device_name; const char *device_name;
...@@ -28,17 +28,18 @@ struct line_driver { ...@@ -28,17 +28,18 @@ struct line_driver {
const int write_irq; const int write_irq;
const char *write_irq_name; const char *write_irq_name;
struct mc_device mc; struct mc_device mc;
struct tty_driver *driver;
}; };
struct line { struct line {
struct tty_struct *tty; struct tty_struct *tty;
spinlock_t count_lock; struct mutex count_lock;
unsigned long count; unsigned long count;
int valid; int valid;
char *init_str; char *init_str;
int init_pri;
struct list_head chan_list; struct list_head chan_list;
struct chan *chan_in, *chan_out;
/*This lock is actually, mostly, local to*/ /*This lock is actually, mostly, local to*/
spinlock_t lock; spinlock_t lock;
...@@ -55,21 +56,12 @@ struct line { ...@@ -55,21 +56,12 @@ struct line {
int sigio; int sigio;
struct delayed_work task; struct delayed_work task;
const struct line_driver *driver; const struct line_driver *driver;
int have_irq;
}; };
#define LINE_INIT(str, d) \
{ .count_lock = __SPIN_LOCK_UNLOCKED((str).count_lock), \
.init_str = str, \
.init_pri = INIT_STATIC, \
.valid = 1, \
.lock = __SPIN_LOCK_UNLOCKED((str).lock), \
.driver = d }
extern void line_close(struct tty_struct *tty, struct file * filp); extern void line_close(struct tty_struct *tty, struct file * filp);
extern int line_open(struct line *lines, struct tty_struct *tty); extern int line_open(struct line *lines, struct tty_struct *tty);
extern int line_setup(struct line *lines, unsigned int sizeof_lines, extern int line_setup(char **conf, unsigned nlines, char **def,
char *init, char **error_out); char *init, char *name);
extern int line_write(struct tty_struct *tty, const unsigned char *buf, extern int line_write(struct tty_struct *tty, const unsigned char *buf,
int len); int len);
extern int line_put_char(struct tty_struct *tty, unsigned char ch); extern int line_put_char(struct tty_struct *tty, unsigned char ch);
...@@ -87,10 +79,11 @@ extern char *add_xterm_umid(char *base); ...@@ -87,10 +79,11 @@ extern char *add_xterm_umid(char *base);
extern int line_setup_irq(int fd, int input, int output, struct line *line, extern int line_setup_irq(int fd, int input, int output, struct line *line,
void *data); void *data);
extern void line_close_chan(struct line *line); extern void line_close_chan(struct line *line);
extern struct tty_driver *register_lines(struct line_driver *line_driver, extern int register_lines(struct line_driver *line_driver,
const struct tty_operations *driver, const struct tty_operations *driver,
struct line *lines, int nlines); struct line *lines, int nlines);
extern void lines_init(struct line *lines, int nlines, struct chan_opts *opts); extern int setup_one_line(struct line *lines, int n, char *init,
const struct chan_opts *opts, char **error_out);
extern void close_lines(struct line *lines, int nlines); extern void close_lines(struct line *lines, int nlines);
extern int line_config(struct line *lines, unsigned int sizeof_lines, extern int line_config(struct line *lines, unsigned int sizeof_lines,
......
...@@ -773,7 +773,7 @@ static int __init mconsole_init(void) ...@@ -773,7 +773,7 @@ static int __init mconsole_init(void)
register_reboot_notifier(&reboot_notifier); register_reboot_notifier(&reboot_notifier);
err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt, err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt,
IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, IRQF_SHARED | IRQF_SAMPLE_RANDOM,
"mconsole", (void *)sock); "mconsole", (void *)sock);
if (err) { if (err) {
printk(KERN_ERR "Failed to get IRQ for management console\n"); printk(KERN_ERR "Failed to get IRQ for management console\n");
......
...@@ -161,7 +161,7 @@ static int uml_net_open(struct net_device *dev) ...@@ -161,7 +161,7 @@ static int uml_net_open(struct net_device *dev)
} }
err = um_request_irq(dev->irq, lp->fd, IRQ_READ, uml_net_interrupt, err = um_request_irq(dev->irq, lp->fd, IRQ_READ, uml_net_interrupt,
IRQF_DISABLED | IRQF_SHARED, dev->name, dev); IRQF_SHARED, dev->name, dev);
if (err != 0) { if (err != 0) {
printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err); printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err);
err = -ENETUNREACH; err = -ENETUNREACH;
......
...@@ -100,7 +100,7 @@ static int port_accept(struct port_list *port) ...@@ -100,7 +100,7 @@ static int port_accept(struct port_list *port)
.port = port }); .port = port });
if (um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt, if (um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt,
IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, IRQF_SHARED | IRQF_SAMPLE_RANDOM,
"telnetd", conn)) { "telnetd", conn)) {
printk(KERN_ERR "port_accept : failed to get IRQ for " printk(KERN_ERR "port_accept : failed to get IRQ for "
"telnetd\n"); "telnetd\n");
...@@ -184,7 +184,7 @@ void *port_data(int port_num) ...@@ -184,7 +184,7 @@ void *port_data(int port_num)
} }
if (um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt, if (um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt,
IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, IRQF_SHARED | IRQF_SAMPLE_RANDOM,
"port", port)) { "port", port)) {
printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num); printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num);
goto out_close; goto out_close;
......
...@@ -131,7 +131,7 @@ static int __init rng_init (void) ...@@ -131,7 +131,7 @@ static int __init rng_init (void)
random_fd = err; random_fd = err;
err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt, err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt,
IRQF_DISABLED | IRQF_SAMPLE_RANDOM, "random", IRQF_SAMPLE_RANDOM, "random",
NULL); NULL);
if (err) if (err)
goto err_out_cleanup_hw; goto err_out_cleanup_hw;
......
...@@ -20,12 +20,6 @@ ...@@ -20,12 +20,6 @@
static const int ssl_version = 1; static const int ssl_version = 1;
/* Referenced only by tty_driver below - presumably it's locked correctly
* by the tty driver.
*/
static struct tty_driver *ssl_driver;
#define NR_PORTS 64 #define NR_PORTS 64
static void ssl_announce(char *dev_name, int dev) static void ssl_announce(char *dev_name, int dev)
...@@ -71,8 +65,9 @@ static struct line_driver driver = { ...@@ -71,8 +65,9 @@ static struct line_driver driver = {
/* The array is initialized by line_init, at initcall time. The /* The array is initialized by line_init, at initcall time. The
* elements are locked individually as needed. * elements are locked individually as needed.
*/ */
static struct line serial_lines[NR_PORTS] = static char *conf[NR_PORTS];
{ [0 ... NR_PORTS - 1] = LINE_INIT(CONFIG_SSL_CHAN, &driver) }; static char *def_conf = CONFIG_SSL_CHAN;
static struct line serial_lines[NR_PORTS];
static int ssl_config(char *str, char **error_out) static int ssl_config(char *str, char **error_out)
{ {
...@@ -156,14 +151,14 @@ static void ssl_console_write(struct console *c, const char *string, ...@@ -156,14 +151,14 @@ static void ssl_console_write(struct console *c, const char *string,
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&line->lock, flags); spin_lock_irqsave(&line->lock, flags);
console_write_chan(&line->chan_list, string, len); console_write_chan(line->chan_out, string, len);
spin_unlock_irqrestore(&line->lock, flags); spin_unlock_irqrestore(&line->lock, flags);
} }
static struct tty_driver *ssl_console_device(struct console *c, int *index) static struct tty_driver *ssl_console_device(struct console *c, int *index)
{ {
*index = c->index; *index = c->index;
return ssl_driver; return driver.driver;
} }
static int ssl_console_setup(struct console *co, char *options) static int ssl_console_setup(struct console *co, char *options)
...@@ -186,17 +181,30 @@ static struct console ssl_cons = { ...@@ -186,17 +181,30 @@ static struct console ssl_cons = {
static int ssl_init(void) static int ssl_init(void)
{ {
char *new_title; char *new_title;
int err;
int i;
printk(KERN_INFO "Initializing software serial port version %d\n", printk(KERN_INFO "Initializing software serial port version %d\n",
ssl_version); ssl_version);
ssl_driver = register_lines(&driver, &ssl_ops, serial_lines,
err = register_lines(&driver, &ssl_ops, serial_lines,
ARRAY_SIZE(serial_lines)); ARRAY_SIZE(serial_lines));
if (err)
return err;
new_title = add_xterm_umid(opts.xterm_title); new_title = add_xterm_umid(opts.xterm_title);
if (new_title != NULL) if (new_title != NULL)
opts.xterm_title = new_title; opts.xterm_title = new_title;
lines_init(serial_lines, ARRAY_SIZE(serial_lines), &opts); for (i = 0; i < NR_PORTS; i++) {
char *error;
char *s = conf[i];
if (!s)
s = def_conf;
if (setup_one_line(serial_lines, i, s, &opts, &error))
printk(KERN_ERR "setup_one_line failed for "
"device %d : %s\n", i, error);
}
ssl_init_done = 1; ssl_init_done = 1;
register_console(&ssl_cons); register_console(&ssl_cons);
...@@ -214,14 +222,7 @@ __uml_exitcall(ssl_exit); ...@@ -214,14 +222,7 @@ __uml_exitcall(ssl_exit);
static int ssl_chan_setup(char *str) static int ssl_chan_setup(char *str)
{ {
char *error; line_setup(conf, NR_PORTS, &def_conf, str, "serial line");
int ret;
ret = line_setup(serial_lines, ARRAY_SIZE(serial_lines), str, &error);
if(ret < 0)
printk(KERN_ERR "Failed to set up serial line with "
"configuration string \"%s\" : %s\n", str, error);
return 1; return 1;
} }
......
...@@ -27,12 +27,6 @@ ...@@ -27,12 +27,6 @@
#define MAX_TTYS (16) #define MAX_TTYS (16)
/* Referenced only by tty_driver below - presumably it's locked correctly
* by the tty driver.
*/
static struct tty_driver *console_driver;
static void stdio_announce(char *dev_name, int dev) static void stdio_announce(char *dev_name, int dev)
{ {
printk(KERN_INFO "Virtual console %d assigned device '%s'\n", dev, printk(KERN_INFO "Virtual console %d assigned device '%s'\n", dev,
...@@ -76,9 +70,9 @@ static struct line_driver driver = { ...@@ -76,9 +70,9 @@ static struct line_driver driver = {
/* The array is initialized by line_init, at initcall time. The /* The array is initialized by line_init, at initcall time. The
* elements are locked individually as needed. * elements are locked individually as needed.
*/ */
static struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver), static char *vt_conf[MAX_TTYS];
[ 1 ... MAX_TTYS - 1 ] = static char *def_conf;
LINE_INIT(CONFIG_CON_CHAN, &driver) }; static struct line vts[MAX_TTYS];
static int con_config(char *str, char **error_out) static int con_config(char *str, char **error_out)
{ {
...@@ -130,14 +124,14 @@ static void uml_console_write(struct console *console, const char *string, ...@@ -130,14 +124,14 @@ static void uml_console_write(struct console *console, const char *string,
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&line->lock, flags); spin_lock_irqsave(&line->lock, flags);
console_write_chan(&line->chan_list, string, len); console_write_chan(line->chan_out, string, len);
spin_unlock_irqrestore(&line->lock, flags); spin_unlock_irqrestore(&line->lock, flags);
} }
static struct tty_driver *uml_console_device(struct console *c, int *index) static struct tty_driver *uml_console_device(struct console *c, int *index)
{ {
*index = c->index; *index = c->index;
return console_driver; return driver.driver;
} }
static int uml_console_setup(struct console *co, char *options) static int uml_console_setup(struct console *co, char *options)
...@@ -160,18 +154,31 @@ static struct console stdiocons = { ...@@ -160,18 +154,31 @@ static struct console stdiocons = {
static int stdio_init(void) static int stdio_init(void)
{ {
char *new_title; char *new_title;
int err;
int i;
console_driver = register_lines(&driver, &console_ops, vts, err = register_lines(&driver, &console_ops, vts,
ARRAY_SIZE(vts)); ARRAY_SIZE(vts));
if (console_driver == NULL) if (err)
return -1; return err;
printk(KERN_INFO "Initialized stdio console driver\n"); printk(KERN_INFO "Initialized stdio console driver\n");
new_title = add_xterm_umid(opts.xterm_title); new_title = add_xterm_umid(opts.xterm_title);
if(new_title != NULL) if(new_title != NULL)
opts.xterm_title = new_title; opts.xterm_title = new_title;
lines_init(vts, ARRAY_SIZE(vts), &opts); for (i = 0; i < MAX_TTYS; i++) {
char *error;
char *s = vt_conf[i];
if (!s)
s = def_conf;
if (!s)
s = i ? CONFIG_CON_CHAN : CONFIG_CON_ZERO_CHAN;
if (setup_one_line(vts, i, s, &opts, &error))
printk(KERN_ERR "setup_one_line failed for "
"device %d : %s\n", i, error);
}
con_init_done = 1; con_init_done = 1;
register_console(&stdiocons); register_console(&stdiocons);
...@@ -189,14 +196,7 @@ __uml_exitcall(console_exit); ...@@ -189,14 +196,7 @@ __uml_exitcall(console_exit);
static int console_chan_setup(char *str) static int console_chan_setup(char *str)
{ {
char *error; line_setup(vt_conf, MAX_TTYS, &def_conf, str, "console");
int ret;
ret = line_setup(vts, ARRAY_SIZE(vts), str, &error);
if(ret < 0)
printk(KERN_ERR "Failed to set up console with "
"configuration string \"%s\" : %s\n", str, error);
return 1; return 1;
} }
__setup("con", console_chan_setup); __setup("con", console_chan_setup);
......
...@@ -19,40 +19,26 @@ ...@@ -19,40 +19,26 @@
#define UBD_SHIFT 4 #define UBD_SHIFT 4
#include "linux/kernel.h" #include <linux/module.h>
#include "linux/module.h" #include <linux/init.h>
#include "linux/blkdev.h" #include <linux/blkdev.h>
#include "linux/ata.h" #include <linux/ata.h>
#include "linux/hdreg.h" #include <linux/hdreg.h>
#include "linux/init.h" #include <linux/cdrom.h>
#include "linux/cdrom.h" #include <linux/proc_fs.h>
#include "linux/proc_fs.h" #include <linux/seq_file.h>
#include "linux/seq_file.h" #include <linux/ctype.h>
#include "linux/ctype.h" #include <linux/slab.h>
#include "linux/capability.h" #include <linux/vmalloc.h>
#include "linux/mm.h" #include <linux/platform_device.h>
#include "linux/slab.h" #include <linux/scatterlist.h>
#include "linux/vmalloc.h" #include <asm/tlbflush.h>
#include "linux/mutex.h"
#include "linux/blkpg.h"
#include "linux/genhd.h"
#include "linux/spinlock.h"
#include "linux/platform_device.h"
#include "linux/scatterlist.h"
#include "asm/segment.h"
#include "asm/uaccess.h"
#include "asm/irq.h"
#include "asm/types.h"
#include "asm/tlbflush.h"
#include "mem_user.h"
#include "kern_util.h" #include "kern_util.h"
#include "mconsole_kern.h" #include "mconsole_kern.h"
#include "init.h" #include "init.h"
#include "irq_user.h"
#include "irq_kern.h" #include "irq_kern.h"
#include "ubd_user.h" #include "ubd.h"
#include "os.h" #include "os.h"
#include "mem.h"
#include "cow.h" #include "cow.h"
enum ubd_req { UBD_READ, UBD_WRITE }; enum ubd_req { UBD_READ, UBD_WRITE };
...@@ -1115,7 +1101,7 @@ static int __init ubd_driver_init(void){ ...@@ -1115,7 +1101,7 @@ static int __init ubd_driver_init(void){
return 0; return 0;
} }
err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr,
IRQF_DISABLED, "ubd", ubd_devs); 0, "ubd", ubd_devs);
if(err != 0) if(err != 0)
printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err); printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err);
return 0; return 0;
......
...@@ -15,14 +15,12 @@ ...@@ -15,14 +15,12 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/param.h> #include <sys/param.h>
#include "asm/types.h"
#include "ubd_user.h"
#include "os.h"
#include "cow.h"
#include <endian.h> #include <endian.h>
#include <byteswap.h> #include <byteswap.h>
#include "ubd.h"
#include "os.h"
void ignore_sigwinch_sig(void) void ignore_sigwinch_sig(void)
{ {
signal(SIGWINCH, SIG_IGN); signal(SIGWINCH, SIG_IGN);
......
...@@ -50,7 +50,7 @@ int xterm_fd(int socket, int *pid_out) ...@@ -50,7 +50,7 @@ int xterm_fd(int socket, int *pid_out)
init_completion(&data->ready); init_completion(&data->ready);
err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt, err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, IRQF_SHARED | IRQF_SAMPLE_RANDOM,
"xterm", data); "xterm", data);
if (err) { if (err) {
printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, " printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, "
......
generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h
generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h
generic-y += ftrace.h generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h
#include <generated/asm-offsets.h>
#ifndef __UM_AUXVEC_H
#define __UM_AUXVEC_H
#endif
/*
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
* Licensed under the GPL
*/
#ifndef __UM_CURRENT_H
#define __UM_CURRENT_H
#include "linux/thread_info.h"
#define current (current_thread_info()->task)
#endif
#ifndef __UM_DELAY_H
#define __UM_DELAY_H
/* Undefined on purpose */
extern void __bad_udelay(void);
extern void __bad_ndelay(void);
extern void __udelay(unsigned long usecs);
extern void __ndelay(unsigned long usecs);
extern void __delay(unsigned long loops);
#define udelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \
__bad_udelay() : __udelay(n))
#define ndelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \
__bad_ndelay() : __ndelay(n))
#endif
#ifndef __UM_IO_H
#define __UM_IO_H
#include "asm/page.h"
#define IO_SPACE_LIMIT 0xdeadbeef /* Sure hope nothing uses this */
static inline int inb(unsigned long i) { return(0); }
static inline void outb(char c, unsigned long i) { }
/*
* Change virtual addresses to physical addresses and vv.
* These are pretty trivial
*/
static inline unsigned long virt_to_phys(volatile void * address)
{
return __pa((void *) address);
}
static inline void * phys_to_virt(unsigned long address)
{
return __va(address);
}
/*
* Convert a physical pointer to a virtual kernel pointer for /dev/mem
* access
*/
#define xlate_dev_mem_ptr(p) __va(p)
/*
* Convert a virtual cached pointer to an uncached pointer
*/
#define xlate_dev_kmem_ptr(p) p
static inline void writeb(unsigned char b, volatile void __iomem *addr)
{
*(volatile unsigned char __force *) addr = b;
}
static inline void writew(unsigned short b, volatile void __iomem *addr)
{
*(volatile unsigned short __force *) addr = b;
}
static inline void writel(unsigned int b, volatile void __iomem *addr)
{
*(volatile unsigned int __force *) addr = b;
}
static inline void writeq(unsigned int b, volatile void __iomem *addr)
{
*(volatile unsigned long long __force *) addr = b;
}
#define __raw_writeb writeb
#define __raw_writew writew
#define __raw_writel writel
#define __raw_writeq writeq
#endif
/*
* Pull in the generic implementation for the mutex fastpath.
*
* TODO: implement optimized primitives instead, or leave the generic
* implementation in place, or pick the atomic_xchg() based generic
* implementation. (see asm-generic/mutex-xchg.h for details)
*/
#include <asm-generic/mutex-dec.h>
#ifndef _UM_PARAM_H
#define _UM_PARAM_H
#define EXEC_PAGESIZE 4096
#ifndef NOGROUP
#define NOGROUP (-1)
#endif
#define MAXHOSTNAMELEN 64 /* max length of hostname */
#ifdef __KERNEL__
#define HZ CONFIG_HZ
#define USER_HZ 100 /* .. some user interfaces are in "ticks" */
#define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */
#else
#define HZ 100
#endif
#endif
#ifndef __UM_PCI_H
#define __UM_PCI_H
#define PCI_DMA_BUS_IS_PHYS (1)
#endif
...@@ -8,8 +8,7 @@ ...@@ -8,8 +8,7 @@
#ifndef __UM_PGALLOC_H #ifndef __UM_PGALLOC_H
#define __UM_PGALLOC_H #define __UM_PGALLOC_H
#include "linux/mm.h" #include <linux/mm.h>
#include "asm/fixmap.h"
#define pmd_populate_kernel(mm, pmd, pte) \ #define pmd_populate_kernel(mm, pmd, pte) \
set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte))) set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte)))
......
...@@ -69,6 +69,8 @@ extern unsigned long end_iomem; ...@@ -69,6 +69,8 @@ extern unsigned long end_iomem;
#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED) #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC) #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
#define io_remap_pfn_range remap_pfn_range
/* /*
* The i386 can't do page protection for execute, and considers that the same * The i386 can't do page protection for execute, and considers that the same
* are read. * are read.
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/ptrace-abi.h> #include <asm/ptrace-abi.h>
#include <asm/user.h>
#include "sysdep/ptrace.h" #include "sysdep/ptrace.h"
struct pt_regs { struct pt_regs {
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE); DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE);
OFFSET(HOST_TASK_PID, task_struct, pid);
DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE); DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE);
DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK); DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK);
DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT); DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT);
......
...@@ -48,7 +48,7 @@ extern void do_uml_exitcalls(void); ...@@ -48,7 +48,7 @@ extern void do_uml_exitcalls(void);
* GFP_ATOMIC. * GFP_ATOMIC.
*/ */
extern int __cant_sleep(void); extern int __cant_sleep(void);
extern void *get_current(void); extern int get_current_pid(void);
extern int copy_from_user_proc(void *to, void *from, int size); extern int copy_from_user_proc(void *to, void *from, int size);
extern int cpu(void); extern int cpu(void);
extern char *uml_strdup(const char *string); extern char *uml_strdup(const char *string);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# Licensed under the GPL # Licensed under the GPL
# #
CPPFLAGS_vmlinux.lds := -U$(SUBARCH) -DSTART=$(LDS_START) \ CPPFLAGS_vmlinux.lds := -DSTART=$(LDS_START) \
-DELF_ARCH=$(LDS_ELF_ARCH) \ -DELF_ARCH=$(LDS_ELF_ARCH) \
-DELF_FORMAT=$(LDS_ELF_FORMAT) -DELF_FORMAT=$(LDS_ELF_FORMAT)
extra-y := vmlinux.lds extra-y := vmlinux.lds
......
...@@ -126,9 +126,9 @@ void exit_thread(void) ...@@ -126,9 +126,9 @@ void exit_thread(void)
{ {
} }
void *get_current(void) int get_current_pid(void)
{ {
return current; return task_pid_nr(current);
} }
/* /*
......
...@@ -25,7 +25,7 @@ int write_sigio_irq(int fd) ...@@ -25,7 +25,7 @@ int write_sigio_irq(int fd)
int err; int err;
err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt, err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt,
IRQF_DISABLED|IRQF_SAMPLE_RANDOM, "write sigio", IRQF_SAMPLE_RANDOM, "write sigio",
NULL); NULL);
if (err) { if (err) {
printk(KERN_ERR "write_sigio_irq : um_request_irq failed, " printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
......
...@@ -82,7 +82,7 @@ static void __init setup_itimer(void) ...@@ -82,7 +82,7 @@ static void __init setup_itimer(void)
{ {
int err; int err;
err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL); err = request_irq(TIMER_IRQ, um_timer, 0, "timer", NULL);
if (err != 0) if (err != 0)
printk(KERN_ERR "register_timer : request_irq failed - " printk(KERN_ERR "register_timer : request_irq failed - "
"errno = %d\n", -err); "errno = %d\n", -err);
......
...@@ -13,8 +13,6 @@ USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \ ...@@ -13,8 +13,6 @@ USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \
main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \ main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \
tty.o umid.o util.o tty.o umid.o util.o
CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH)
HAVE_AIO_ABI := $(shell [ -r /usr/include/linux/aio_abi.h ] && \ HAVE_AIO_ABI := $(shell [ -r /usr/include/linux/aio_abi.h ] && \
echo -DHAVE_AIO_ABI ) echo -DHAVE_AIO_ABI )
CFLAGS_aio.o += $(HAVE_AIO_ABI) CFLAGS_aio.o += $(HAVE_AIO_ABI)
......
...@@ -45,7 +45,7 @@ EXPORT_SYMBOL(readdir64); ...@@ -45,7 +45,7 @@ EXPORT_SYMBOL(readdir64);
extern void truncate64(void) __attribute__((weak)); extern void truncate64(void) __attribute__((weak));
EXPORT_SYMBOL(truncate64); EXPORT_SYMBOL(truncate64);
#ifdef SUBARCH_i386 #ifdef CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA
EXPORT_SYMBOL(vsyscall_ehdr); EXPORT_SYMBOL(vsyscall_ehdr);
EXPORT_SYMBOL(vsyscall_end); EXPORT_SYMBOL(vsyscall_end);
#endif #endif
......
...@@ -9,8 +9,6 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) ...@@ -9,8 +9,6 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
$(USER_OBJS:.o=.%): \ $(USER_OBJS:.o=.%): \
c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) -include user.h $(CFLAGS_$(basetarget).o) c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) -include user.h $(CFLAGS_$(basetarget).o)
$(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \
-Dunix -D__unix__ -D__$(SUBARCH)__ $(CF)
# These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of # These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of
# using it directly. # using it directly.
...@@ -18,8 +16,9 @@ UNPROFILE_OBJS := $(foreach file,$(UNPROFILE_OBJS),$(obj)/$(file)) ...@@ -18,8 +16,9 @@ UNPROFILE_OBJS := $(foreach file,$(UNPROFILE_OBJS),$(obj)/$(file))
$(UNPROFILE_OBJS:.o=.%): \ $(UNPROFILE_OBJS:.o=.%): \
c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o) c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o)
$(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \
-Dunix -D__unix__ -D__$(SUBARCH)__ $(CF) $(USER_OBJS) $(UNPROFILE_OBJS): \
CHECKFLAGS := $(patsubst $(NOSTDINC_FLAGS),,$(CHECKFLAGS))
# The stubs can't try to call mcount or update basic block data # The stubs can't try to call mcount or update basic block data
define unprofile define unprofile
......
...@@ -8,15 +8,11 @@ ELF_ARCH := i386 ...@@ -8,15 +8,11 @@ ELF_ARCH := i386
ELF_FORMAT := elf32-i386 ELF_FORMAT := elf32-i386
CHECKFLAGS += -D__i386__ CHECKFLAGS += -D__i386__
ifeq ("$(origin SUBARCH)", "command line")
ifneq ("$(shell uname -m | sed -e s/i.86/i386/)", "$(SUBARCH)")
KBUILD_CFLAGS += $(call cc-option,-m32) KBUILD_CFLAGS += $(call cc-option,-m32)
KBUILD_AFLAGS += $(call cc-option,-m32) KBUILD_AFLAGS += $(call cc-option,-m32)
LINK-y += $(call cc-option,-m32) LINK-y += $(call cc-option,-m32)
export LDFLAGS export LDFLAGS
endif
endif
# First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y. # First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y.
include $(srctree)/arch/x86/Makefile_32.cpu include $(srctree)/arch/x86/Makefile_32.cpu
......
...@@ -15,8 +15,8 @@ config UML_X86 ...@@ -15,8 +15,8 @@ config UML_X86
select GENERIC_FIND_FIRST_BIT select GENERIC_FIND_FIRST_BIT
config 64BIT config 64BIT
bool bool "64-bit kernel" if SUBARCH = "x86"
default SUBARCH = "x86_64" default SUBARCH != "i386"
config X86_32 config X86_32
def_bool !64BIT def_bool !64BIT
......
...@@ -17,6 +17,16 @@ ...@@ -17,6 +17,16 @@
#define ARCH_IS_STACKGROW(address) \ #define ARCH_IS_STACKGROW(address) \
(address + 65536 + 32 * sizeof(unsigned long) >= UPT_SP(&current->thread.regs.regs)) (address + 65536 + 32 * sizeof(unsigned long) >= UPT_SP(&current->thread.regs.regs))
#include <asm/user.h>
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
static inline void rep_nop(void)
{
__asm__ __volatile__("rep;nop": : :"memory");
}
#define cpu_relax() rep_nop()
#include <asm/processor-generic.h> #include <asm/processor-generic.h>
#endif #endif
...@@ -45,16 +45,6 @@ static inline void arch_copy_thread(struct arch_thread *from, ...@@ -45,16 +45,6 @@ static inline void arch_copy_thread(struct arch_thread *from,
memcpy(&to->tls_array, &from->tls_array, sizeof(from->tls_array)); memcpy(&to->tls_array, &from->tls_array, sizeof(from->tls_array));
} }
#include <asm/user.h>
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
static inline void rep_nop(void)
{
__asm__ __volatile__("rep;nop": : :"memory");
}
#define cpu_relax() rep_nop()
/* /*
* Default implementation of macro that returns current * Default implementation of macro that returns current
* instruction pointer ("program counter"). Stolen * instruction pointer ("program counter"). Stolen
......
...@@ -14,14 +14,6 @@ struct arch_thread { ...@@ -14,14 +14,6 @@ struct arch_thread {
struct faultinfo faultinfo; struct faultinfo faultinfo;
}; };
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
static inline void rep_nop(void)
{
__asm__ __volatile__("rep;nop": : :"memory");
}
#define cpu_relax() rep_nop()
#define INIT_ARCH_THREAD { .debugregs = { [ 0 ... 7 ] = 0 }, \ #define INIT_ARCH_THREAD { .debugregs = { [ 0 ... 7 ] = 0 }, \
.debugregs_seq = 0, \ .debugregs_seq = 0, \
.fs = 0, \ .fs = 0, \
...@@ -37,8 +29,6 @@ static inline void arch_copy_thread(struct arch_thread *from, ...@@ -37,8 +29,6 @@ static inline void arch_copy_thread(struct arch_thread *from,
to->fs = from->fs; to->fs = from->fs;
} }
#include <asm/user.h>
#define current_text_addr() \ #define current_text_addr() \
({ void *pc; __asm__("movq $1f,%0\n1:":"=g" (pc)); pc; }) ({ void *pc; __asm__("movq $1f,%0\n1:":"=g" (pc)); pc; })
......
...@@ -13,8 +13,6 @@ ...@@ -13,8 +13,6 @@
static int host_has_cmov = 1; static int host_has_cmov = 1;
static jmp_buf cmov_test_return; static jmp_buf cmov_test_return;
#define TASK_PID(task) *((int *) &(((char *) (task))[HOST_TASK_PID]))
static void cmov_sigill_test_handler(int sig) static void cmov_sigill_test_handler(int sig)
{ {
host_has_cmov = 0; host_has_cmov = 0;
...@@ -51,7 +49,7 @@ void arch_examine_signal(int sig, struct uml_pt_regs *regs) ...@@ -51,7 +49,7 @@ void arch_examine_signal(int sig, struct uml_pt_regs *regs)
* This is testing for a cmov (0x0f 0x4x) instruction causing a * This is testing for a cmov (0x0f 0x4x) instruction causing a
* SIGILL in init. * SIGILL in init.
*/ */
if ((sig != SIGILL) || (TASK_PID(get_current()) != 1)) if ((sig != SIGILL) || (get_current_pid() != 1))
return; return;
if (copy_from_user_proc(tmp, (void *) UPT_IP(regs), 2)) { if (copy_from_user_proc(tmp, (void *) UPT_IP(regs), 2)) {
......
menuconfig MTD menuconfig MTD
tristate "Memory Technology Device (MTD) support" tristate "Memory Technology Device (MTD) support"
depends on HAS_IOMEM depends on GENERIC_IO
help help
Memory Technology Devices are flash, RAM and similar chips, often Memory Technology Devices are flash, RAM and similar chips, often
used for solid state file systems on embedded devices. This option used for solid state file systems on embedded devices. This option
......
menu "Self-contained MTD device drivers" menu "Self-contained MTD device drivers"
depends on MTD!=n depends on MTD!=n
depends on HAS_IOMEM
config MTD_PMC551 config MTD_PMC551
tristate "Ramix PMC551 PCI Mezzanine RAM card support" tristate "Ramix PMC551 PCI Mezzanine RAM card support"
......
menu "Mapping drivers for chip access" menu "Mapping drivers for chip access"
depends on MTD!=n depends on MTD!=n
depends on HAS_IOMEM
config MTD_COMPLEX_MAPPINGS config MTD_COMPLEX_MAPPINGS
bool "Support non-linear mappings of flash chips" bool "Support non-linear mappings of flash chips"
......
...@@ -246,6 +246,7 @@ config MTD_NAND_BCM_UMI_HWCS ...@@ -246,6 +246,7 @@ config MTD_NAND_BCM_UMI_HWCS
config MTD_NAND_DISKONCHIP config MTD_NAND_DISKONCHIP
tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)" tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
depends on HAS_IOMEM
select REED_SOLOMON select REED_SOLOMON
select REED_SOLOMON_DEC16 select REED_SOLOMON_DEC16
help help
...@@ -431,6 +432,7 @@ config MTD_NAND_GPMI_NAND ...@@ -431,6 +432,7 @@ config MTD_NAND_GPMI_NAND
config MTD_NAND_PLATFORM config MTD_NAND_PLATFORM
tristate "Support for generic platform NAND driver" tristate "Support for generic platform NAND driver"
depends on HAS_IOMEM
help help
This implements a generic NAND driver for on-SOC platform This implements a generic NAND driver for on-SOC platform
devices. You will need to provide platform-specific functions devices. You will need to provide platform-specific functions
......
menuconfig MTD_ONENAND menuconfig MTD_ONENAND
tristate "OneNAND Device Support" tristate "OneNAND Device Support"
depends on MTD depends on MTD
depends on HAS_IOMEM
help help
This enables support for accessing all type of OneNAND flash This enables support for accessing all type of OneNAND flash
devices. For further information see devices. For further information see
......
...@@ -67,7 +67,8 @@ extern int access_file(char *path, int r, int w, int x); ...@@ -67,7 +67,8 @@ extern int access_file(char *path, int r, int w, int x);
extern int open_file(char *path, int r, int w, int append); extern int open_file(char *path, int r, int w, int append);
extern void *open_dir(char *path, int *err_out); extern void *open_dir(char *path, int *err_out);
extern char *read_dir(void *stream, unsigned long long *pos, extern char *read_dir(void *stream, unsigned long long *pos,
unsigned long long *ino_out, int *len_out); unsigned long long *ino_out, int *len_out,
unsigned int *type_out);
extern void close_file(void *stream); extern void close_file(void *stream);
extern int replace_file(int oldfd, int fd); extern int replace_file(int oldfd, int fd);
extern void close_dir(void *stream); extern void close_dir(void *stream);
......
...@@ -283,6 +283,7 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir) ...@@ -283,6 +283,7 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir)
char *name; char *name;
unsigned long long next, ino; unsigned long long next, ino;
int error, len; int error, len;
unsigned int type;
name = dentry_name(file->f_path.dentry); name = dentry_name(file->f_path.dentry);
if (name == NULL) if (name == NULL)
...@@ -292,9 +293,9 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir) ...@@ -292,9 +293,9 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir)
if (dir == NULL) if (dir == NULL)
return -error; return -error;
next = file->f_pos; next = file->f_pos;
while ((name = read_dir(dir, &next, &ino, &len)) != NULL) { while ((name = read_dir(dir, &next, &ino, &len, &type)) != NULL) {
error = (*filldir)(ent, name, len, file->f_pos, error = (*filldir)(ent, name, len, file->f_pos,
ino, DT_UNKNOWN); ino, type);
if (error) break; if (error) break;
file->f_pos = next; file->f_pos = next;
} }
......
...@@ -98,7 +98,8 @@ void *open_dir(char *path, int *err_out) ...@@ -98,7 +98,8 @@ void *open_dir(char *path, int *err_out)
} }
char *read_dir(void *stream, unsigned long long *pos, char *read_dir(void *stream, unsigned long long *pos,
unsigned long long *ino_out, int *len_out) unsigned long long *ino_out, int *len_out,
unsigned int *type_out)
{ {
DIR *dir = stream; DIR *dir = stream;
struct dirent *ent; struct dirent *ent;
...@@ -109,6 +110,7 @@ char *read_dir(void *stream, unsigned long long *pos, ...@@ -109,6 +110,7 @@ char *read_dir(void *stream, unsigned long long *pos,
return NULL; return NULL;
*len_out = strlen(ent->d_name); *len_out = strlen(ent->d_name);
*ino_out = ent->d_ino; *ino_out = ent->d_ino;
*type_out = ent->d_type;
*pos = telldir(dir); *pos = telldir(dir);
return ent->d_name; return ent->d_name;
} }
......
...@@ -29,6 +29,10 @@ config GENERIC_IOMAP ...@@ -29,6 +29,10 @@ config GENERIC_IOMAP
bool bool
select GENERIC_PCI_IOMAP select GENERIC_PCI_IOMAP
config GENERIC_IO
boolean
default n
config CRC_CCITT config CRC_CCITT
tristate "CRC-CCITT functions" tristate "CRC-CCITT functions"
help help
...@@ -277,6 +281,7 @@ config BTREE ...@@ -277,6 +281,7 @@ config BTREE
config HAS_IOMEM config HAS_IOMEM
boolean boolean
depends on !NO_IOMEM depends on !NO_IOMEM
select GENERIC_IO
default y default y
config HAS_IOPORT config HAS_IOPORT
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment