toolchain/kernel: remove ancient versions
authorPeter Korsgaard <jacmet@sunsite.dk>
Thu, 11 Jun 2009 10:27:52 +0000 (12:27 +0200)
committerPeter Korsgaard <jacmet@sunsite.dk>
Thu, 11 Jun 2009 10:30:30 +0000 (12:30 +0200)
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
toolchain/kernel-headers/Config.in
toolchain/kernel-headers/kernel-headers-new.makefile
toolchain/kernel-headers/linux-2.6.23-nios2nommu.patch [deleted file]
toolchain/kernel-headers/linux-2.6.25.19-export-linux-aout.patch [deleted file]

index bed340e6f7e64e859483627d7f690c7f70853122..9fd090360e641e176eb9510b72db527b03bbfbdb 100644 (file)
@@ -16,18 +16,6 @@ choice
          For the snapshot, you have to provide the
          linux-2.6.tar.bz2 tarball in your download dir.
 
-       config BR2_KERNEL_HEADERS_2_6_23
-               depends on BR2_DEPRECATED
-               bool "Linux 2.6.23.x kernel headers"
-
-       config BR2_KERNEL_HEADERS_2_6_24
-               depends on BR2_DEPRECATED
-               bool "Linux 2.6.24.x kernel headers"
-
-       config BR2_KERNEL_HEADERS_2_6_25
-               depends on BR2_DEPRECATED
-               bool "Linux 2.6.25.x kernel headers"
-
        config BR2_KERNEL_HEADERS_2_6_26
                depends on BR2_DEPRECATED
                bool "Linux 2.6.26.x kernel headers"
@@ -54,15 +42,12 @@ endchoice
 
 config BR2_KERNEL_HEADERS_RT
        bool "use realtime (-rt) kernel patches"
-       depends on BR2_KERNEL_HEADERS_2_6_24 || BR2_KERNEL_HEADERS_2_6_26
+       depends on BR2_KERNEL_HEADERS_2_6_26
        help
          Apply Ingo's realtime extensions to linux
 
 config BR2_DEFAULT_KERNEL_HEADERS
        string
-       default "2.6.23"        if BR2_KERNEL_HEADERS_2_6_23
-       default "2.6.24.7"      if BR2_KERNEL_HEADERS_2_6_24
-       default "2.6.25.19"     if BR2_KERNEL_HEADERS_2_6_25
        default "2.6.26.8"      if BR2_KERNEL_HEADERS_2_6_26
        default "2.6.27.24"     if BR2_KERNEL_HEADERS_2_6_27
        default "2.6.28.10"     if BR2_KERNEL_HEADERS_2_6_28
index b12705f4a12ccd382f8894f5ef0d7e8ca5902ad5..2074e46458bbeda3bf6b12836de96eb15df6f3a5 100644 (file)
@@ -22,10 +22,6 @@ LINUX_HEADERS_CAT:=$(BZCAT)
 LINUX_HEADERS_UNPACK_DIR:=$(TOOL_BUILD_DIR)/linux-$(LINUX_HEADERS_VERSION)
 LINUX_HEADERS_DIR:=$(TOOL_BUILD_DIR)/linux
 
-ifeq ("$(DEFAULT_KERNEL_HEADERS)","2.6.24.7")
-LINUX_RT_VERSION:=rt27
-endif
-
 ifeq ("$(DEFAULT_KERNEL_HEADERS)","2.6.26.8")
 LINUX_RT_VERSION:=rt16
 endif
diff --git a/toolchain/kernel-headers/linux-2.6.23-nios2nommu.patch b/toolchain/kernel-headers/linux-2.6.23-nios2nommu.patch
deleted file mode 100644 (file)
index 6e558fd..0000000
+++ /dev/null
@@ -1,26567 +0,0 @@
-diff --git a/arch/nios2nommu/ChangeLog b/arch/nios2nommu/ChangeLog
-new file mode 100644
-index 0000000..039c010
---- /dev/null
-+++ b/arch/nios2nommu/ChangeLog
-@@ -0,0 +1,4 @@
-+2004-06-15  Ken Hill  <khill@microtronix.com>
-+
-+      * Kconfig: Add Microtronix uKit support.
-+
-diff --git a/arch/nios2nommu/Kconfig b/arch/nios2nommu/Kconfig
-new file mode 100644
-index 0000000..525c77b
---- /dev/null
-+++ b/arch/nios2nommu/Kconfig
-@@ -0,0 +1,403 @@
-+#
-+# For a description of the syntax of this configuration file,
-+# see the Configure script.
-+#
-+mainmenu 'uClinux/Nios2 (w/o MMU) Kernel Configuration'
-+
-+config MMU
-+      bool
-+      default n
-+
-+config FPU
-+      bool
-+      default n
-+
-+config ZONE_DMA
-+      bool
-+      default y
-+
-+config UID16
-+      bool
-+      default y
-+
-+config RWSEM_GENERIC_SPINLOCK
-+      bool
-+      default y
-+
-+config RWSEM_XCHGADD_ALGORITHM
-+      bool
-+      default n
-+
-+config GENERIC_FIND_NEXT_BIT
-+      bool
-+      default y
-+
-+config GENERIC_HWEIGHT
-+      bool
-+      default y
-+
-+config GENERIC_CALIBRATE_DELAY
-+      bool
-+      default y
-+
-+source "init/Kconfig"
-+
-+menu "Processor type and features"
-+
-+comment 'Platform dependant setup'
-+
-+choice
-+      prompt "CPU"
-+      default NIOS2
-+
-+config NIOS2
-+      bool "NIOS2"
-+      help
-+        Altera Nios2 softcore processor.
-+
-+endchoice
-+
-+choice
-+      prompt "Platform"
-+      default ALTERA_STRATIX
-+
-+config MICROTRONIX_UKIT
-+      bool "Microtronix uKit board support"
-+      depends on NIOS2
-+      help
-+        Support for the Microtronix uKit development board. Includes support 
-+        for Sodimm SDRAM/FLASH, soft ethernet MAC & PHY.
-+
-+config MICROTRONIX_STRATIX
-+      bool "Microtronix Stratix board support"
-+      depends on NIOS2
-+      help
-+        Support for the Microtronix Stratix board. Includes support 
-+        for Sodimm SDRAM/FLASH, soft ethernet MAC & PHY, USB, LVDS
-+        & analog/digital converters.
-+
-+config MICROTRONIX_CYCLONE
-+      bool "Microtronix Cyclone board support"
-+      depends on NIOS2
-+      help
-+        Support for the Microtronix Cyclone board. Includes support 
-+        for SDRAM, FLASH, soft ethernet MAC & PHY, USB,
-+        & analog/digital converters.
-+
-+config MICROTRONIX_PSK
-+      bool "Microtronix PSK (Product Starter Kit) support"
-+      depends on NIOS2
-+      help
-+        Support for the Microtronix PSK (Product Starter Kit), which
-+        features firefly module (EP1C4 or EP1C12). Includes support 
-+        for SDRAM, FLASH, and a variety of product expansion kits such
-+        as USB, Ethernet etc.
-+
-+config ALTERA_STRATIX
-+      bool "Altera Stratix Development board support"
-+      depends on NIOS2
-+      help
-+        Support for the Altera Stratix Development board. Includes
-+        support for 10/100 ethernet, FLASH, SDRAM, compact flash.
-+
-+config ALTERA_STRATIX_PRO
-+      bool "Altera Stratix Pro Development board support"
-+      depends on NIOS2
-+      help
-+        Support for the Altera Stratix 1s40 Development board. Includes
-+        support for 10/100 ethernet, FLASH, SDRAM, compact flash.
-+
-+config ALTERA_STRATIX_II
-+      bool "Altera Stratix II Development board support"
-+      depends on NIOS2
-+      help
-+        Support for the Altera Stratix II Development board. Includes
-+        support for 10/100 ethernet, FLASH, SDRAM, compact flash.
-+
-+config ALTERA_CYCLONE
-+      bool "Altera Cyclone Development board support"
-+      depends on NIOS2
-+      help
-+        Support for the Altera Cyclone Development board. Includes
-+        support for 10/100 ethernet, FLASH, SDRAM, compact flash.
-+
-+config ALTERA_CYCLONE_1C12_EVAL
-+      bool "Altera Cyclone 1C12 Evaluation board support"
-+      depends on NIOS2
-+      help
-+        Support for the Altera Cyclone 1C12 Evaluation board (with the
-+        embedded processor module).
-+
-+config ALTERA_DE2
-+      bool "Altera DE2 Development board support"
-+      depends on NIOS2
-+      help
-+        Support for the Altera Cyclone Development board. Includes
-+        support for 10/100 ethernet, FLASH, SDRAM, VGA, I2C.
-+
-+endchoice
-+
-+choice
-+      prompt "Nios II Hardware Multiply Support"
-+      default NIOS2_HW_MULX
-+      help
-+        This option enables various assembler instructions based on your
-+        selection.  The choice depends on what target hardware you'll be
-+        running your applications on.  The default is 
-+        "Enable mulx instruction".
-+        
-+        Here is an explanation of each option:
-+        None = -mno-hw-mul -mno-hw-mulx
-+         (no mul or mulx instructions used)
-+        Enable mul instruction = -mhw-mul -mno-hw-mulx 
-+         (use mul instructions)
-+        Enable mul and mulx instructions = -mhw-mul -mhw-mulx
-+         (use mul and mulx instructions)
-+        
-+        If you don't know what to choose, select "Enable mulx instruction".
-+      
-+config NIOS2_HW_MUL_OFF
-+      bool "None"
-+
-+config NIOS2_HW_MUL
-+      bool "Enable mul instruction"
-+
-+config NIOS2_HW_MULX
-+      bool "Enable mul and mulx instructions"
-+      
-+endchoice
-+
-+comment 'Platform drivers Options'
-+
-+config AVALON_DMA
-+      bool "Support of DMA controller with Avalon interface"
-+      default y
-+      help
-+        This enables support of Altera's DMA controller with Avalon
-+        interface, so that drivers of DMA-able device can use this 
-+        interface.
-+      
-+config PIO_DEVICES
-+      bool "Enable leds, seven segment display"
-+      default y
-+      depends on (ALTERA_STRATIX || ALTERA_STRATIX_PRO || ALTERA_CYCLONE)
-+      help
-+        This enables example code to support leds, and seven segment
-+        display as PIO devices. Once enabled, the kernel will show a
-+        counter (increas once a second) on these devices.
-+
-+source "arch/nios2nommu/drivers/Kconfig"
-+
-+comment 'Miscellaneous Options'
-+
-+config EXCALIBUR
-+      bool
-+      default y
-+      depends on (NIOS2)
-+
-+config BREAK_ON_START
-+      bool "Include breakpoint trap on kernel startup"
-+      help
-+        Configures the kernel to trap to the GDB client on startup
-+        before the kernel starts initialization. This allows you to
-+        debug the kernel startup.
-+
-+config LARGE_ALLOCS
-+      bool "Allow allocating large blocks (> 1MB) of memory"
-+      help
-+        Allow the slab memory allocator to keep chains for very large
-+        memory sizes - upto 32MB. You may need this if your system has
-+        a lot of RAM, and you need to able to allocate very large
-+        contiguous chunks. If unsure, say N.
-+
-+choice
-+      prompt "Kernel executes from"
-+      ---help---
-+        Choose the memory type that the kernel will be running in.
-+
-+config RAMKERNEL
-+      bool "RAM"
-+      help
-+        The kernel will be resident in RAM when running.
-+
-+#config ROMKERNEL
-+#     bool "ROM"
-+#     help
-+#       The kernel will be resident in FLASH/ROM when running.
-+
-+#config HIMEMKERNEL
-+#     bool "HIMEM"
-+#     help
-+#       The kernel will be resident in high memory when running.
-+
-+endchoice
-+
-+config PREEMPT
-+      bool "Preemptible Kernel"
-+      help
-+        This option reduces the latency of the kernel when reacting to
-+        real-time or interactive events by allowing a low priority process to
-+        be preempted even if it is in kernel mode executing a system call.
-+        This allows applications to run more reliably even when the system is
-+        under load.
-+
-+        Say Y here if you are building a kernel for a desktop, embedded
-+        or real-time system.  Say N if you are unsure.
-+
-+config PREEMPT_TIMES
-+      bool "Collect preemption latency times"
-+      depends on PREEMPT
-+      help
-+        Allow collection for preemption latency times.
-+
-+config CMDLINE
-+      string "Default kernel command string"
-+      default "CONSOLE=/dev/ttyS0 root=/dev/rom0 ro"
-+      help
-+        On some architectures, there is currently no way
-+        for the boot loader to pass arguments to the kernel. For these
-+        architectures, you should supply some command-line options at build
-+        time by entering them here. As a minimum, you should specify the
-+        memory size and the root device (e.g., mem=64M root=/dev/nfs).
-+
-+config PASS_CMDLINE
-+      bool "Passed kernel command line from u-boot"
-+      default n
-+      help
-+        Use bootargs env variable from u-boot for kernel command line.
-+        will override "Default kernel command string".
-+          Say N if you are unsure.
-+
-+source "mm/Kconfig"
-+
-+config BOOT_LINK_OFFSET
-+      hex "Link address offset for booting"
-+      default "0x00800000"
-+      help
-+        This option allows you to set the link address offset of the zImage.
-+        This can be useful if you are on a board which has a small amount of
-+        memory.
-+
-+endmenu
-+
-+menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)"
-+
-+config PCI
-+      bool "PCI support"
-+      help
-+        Support for PCI bus.
-+
-+source "drivers/pci/Kconfig"
-+
-+config HOTPLUG
-+      bool "Support for hot-pluggable device"
-+        ---help---
-+        Say Y here if you want to plug devices into your computer while
-+        the system is running, and be able to use them quickly.  In many
-+        cases, the devices can likewise be unplugged at any time too.
-+
-+        One well known example of this is PCMCIA- or PC-cards, credit-card
-+        size devices such as network cards, modems or hard drives which are
-+        plugged into slots found on all modern laptop computers.  Another
-+        example, used on modern desktops as well as laptops, is USB.
-+
-+        Enable HOTPLUG and KMOD, and build a modular kernel.  Get agent
-+        software (at <http://linux-hotplug.sourceforge.net/>) and install it.
-+        Then your kernel will automatically call out to a user mode "policy
-+        agent" (/sbin/hotplug) to load modules and set up software needed
-+        to use devices as you hotplug them.
-+
-+source "drivers/pcmcia/Kconfig"
-+
-+source "drivers/pci/hotplug/Kconfig"
-+
-+endmenu
-+
-+menu "Executable file formats"
-+
-+config KCORE_AOUT
-+      bool
-+      default y
-+
-+config KCORE_ELF
-+      bool
-+      default y
-+
-+source "fs/Kconfig.binfmt"
-+
-+endmenu
-+
-+menu "Power management options"
-+
-+config PM
-+      bool "Power Management support"
-+      help
-+        Support processor power management modes
-+
-+endmenu
-+
-+
-+source "net/Kconfig"
-+
-+source "drivers/Kconfig"
-+
-+source "fs/Kconfig"
-+
-+source "arch/nios2nommu/Kconfig.debug"
-+
-+menu "Kernel hacking"
-+
-+config FULLDEBUG
-+      bool "Full Symbolic/Source Debugging support"
-+      help
-+        Enable debuging symbols on kernel build.
-+
-+config FRAME_POINTER
-+      bool "Compile the kernel with frame pointers"
-+      help
-+        If you say Y here the resulting kernel image will be slightly larger
-+        and slower, but it will give very useful debugging information.
-+        If you don't debug the kernel, you can say N, but we may not be able
-+        to solve problems without frame pointers.
-+
-+config MAGIC_SYSRQ
-+      bool "Magic SysRq key"
-+      help
-+        Enables console device to interpret special characters as
-+        commands to dump state information.
-+
-+config HIGHPROFILE
-+      bool "Use fast second timer for profiling"
-+      depends on COLDFIRE
-+      help
-+        Use a fast secondary clock to produce profiling information.
-+
-+config NO_KERNEL_MSG
-+      bool "Suppress Kernel BUG Messages"
-+      help
-+        Do not output any debug BUG messages within the kernel.
-+
-+config LOG_BUF_SHIFT
-+      int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" if DEBUG_KERNEL
-+      range 12 21
-+      default 17 if ARCH_S390
-+      default 16 if X86_NUMAQ || IA64
-+      default 15 if SMP
-+      default 14
-+      help
-+        Select kernel log buffer size as a power of 2.
-+        Defaults and Examples:
-+                   17 => 128 KB for S/390
-+                   16 => 64 KB for x86 NUMAQ or IA-64
-+                   15 => 32 KB for SMP
-+                   14 => 16 KB for uniprocessor
-+                   13 =>  8 KB
-+                   12 =>  4 KB
-+
-+endmenu
-+
-+source "security/Kconfig"
-+
-+source "crypto/Kconfig"
-+
-+source "lib/Kconfig"
-diff --git a/arch/nios2nommu/Kconfig.debug b/arch/nios2nommu/Kconfig.debug
-new file mode 100644
-index 0000000..b188c4a
---- /dev/null
-+++ b/arch/nios2nommu/Kconfig.debug
-@@ -0,0 +1,35 @@
-+menu "Kernel hacking"
-+
-+source "lib/Kconfig.debug"
-+
-+config FULLDEBUG
-+      bool "Full Symbolic/Source Debugging support"
-+      help
-+        Enable debuging symbols on kernel build.
-+
-+config FRAME_POINTER
-+      bool "Compile the kernel with frame pointers"
-+      help
-+        If you say Y here the resulting kernel image will be slightly larger
-+        and slower, but it will give very useful debugging information.
-+        If you don't debug the kernel, you can say N, but we may not be able
-+        to solve problems without frame pointers.
-+
-+config MAGIC_SYSRQ
-+      bool "Magic SysRq key"
-+      help
-+        Enables console device to interpret special characters as
-+        commands to dump state information.
-+
-+config HIGHPROFILE
-+      bool "Use fast second timer for profiling"
-+      depends on COLDFIRE
-+      help
-+        Use a fast secondary clock to produce profiling information.
-+
-+config NO_KERNEL_MSG
-+      bool "Suppress Kernel BUG Messages"
-+      help
-+        Do not output any debug BUG messages within the kernel.
-+
-+endmenu 
-diff --git a/arch/nios2nommu/Makefile b/arch/nios2nommu/Makefile
-new file mode 100644
-index 0000000..ca139b6
---- /dev/null
-+++ b/arch/nios2nommu/Makefile
-@@ -0,0 +1,181 @@
-+# arch/niosnommu/Makefile
-+#
-+# Makefile for the architecture dependent flags and dependencies on the
-+# nios.
-+#
-+# Copyright (C) 2001 Vic Phillips (vic@microtronix.com)
-+#
-+# based on sparcnommu/Makefile:
-+#
-+# Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
-+#
-+KERNELLOAD = ${shell echo `grep "nasys_program_mem " include/asm/nios.h | sed 's/^.*\*)//' | sed 's/)//'`}
-+
-+HARDWARE_MK = arch/$(ARCH)/hardware.mk
-+
-+platform-$(CONFIG_NIOS)               := NIOS2
-+PLATFORM := $(platform-y)
-+
-+board-$(CONFIG_ALTERA_STRATIX)        := altera_stratix
-+board-$(CONFIG_ALTERA_STRATIX_PRO)    := altera_stratix_pro
-+board-$(CONFIG_ALTERA_STRATIX_II)     := altera_stratix_ii
-+board-$(CONFIG_ALTERA_CYCLONE)        := altera_cyclone
-+board-$(CONFIG_ALTERA_CYCLONE_1C12_EVAL)      := altera_cyclone_1c12_eval
-+board-$(CONFIG_MICROTRONIX_STRATIX)   := microtronix_stratix
-+board-$(CONFIG_MICROTRONIX_CYCLONE)   := microtronix_cyclone
-+board-$(CONFIG_MICROTRONIX_UKIT)      := microtronix_ukit
-+board-$(CONFIG_MICROTRONIX_PSK)       := microtronix_psk
-+BOARD := $(board-y)
-+
-+model-$(CONFIG_RAMKERNEL)     := ram
-+model-$(CONFIG_ROMKERNEL)     := rom
-+model-$(CONFIG_HIMEMKERNEL)   := himem
-+MODEL := $(model-y)
-+
-+export PLATFORM BOARD MODEL
-+
-+CFLAGS += -DNO_MM -pipe -D__linux__ -D__ELF__
-+#CFLAGS += -DNO_MM -save-temps -D__linux__ -D__ELF__
-+
-+# Uncomment this if you are doing gdb source level
-+# debugging of the kernel to get the proper debugging information.
-+#
-+#CFLAGS +=  -DDEBUG
-+
-+# Turn on/off various hardware multiply options
-+cpu-cflags-$(CONFIG_NIOS2_HW_MUL_OFF) += -mno-hw-mul -mno-hw-mulx
-+cpu-cflags-$(CONFIG_NIOS2_HW_MUL) += -mhw-mul -mno-hw-mulx
-+cpu-cflags-$(CONFIG_NIOS2_HW_MULX) += -mhw-mul -mhw-mulx
-+CFLAGS += $(cpu-cflags-y)
-+
-+# mulx flags currently cause older version of nios2-elf-gcc to fail
-+# The following line ensures that all mulx flags are removed before
-+# it is passed to the compiler.
-+mulx_help_text:= $(shell $(CC) --target-help | grep mulx)
-+ifeq "$(mulx_help_text)" ""
-+CFLAGS := $(filter-out -mhw-mulx -mno-hw-mulx, $(CFLAGS))
-+endif
-+
-+# Temporary workaround for nios2-elf-gcc bug
-+# First noticed in v3.4.1 (Altera Nios II 1.1 b131)
-+# To be removed at a later date when bug is resolved.
-+CFLAGS += -fno-optimize-sibling-calls
-+
-+# This undefines the "__init" type used in defining initialization
-+# procedures.  When defined, the procedures are put into an 'init' data
-+# section that GDB doesn't recognize as source.
-+#
-+CFLAGS += -DNO_TEXT_SECTIONS
-+CFLAGS += -fno-builtin
-+CFLAGS += -O2 -g -G 0
-+CFLAGS += -DUTS_SYSNAME=\"uClinux\"
-+
-+CFLAGS_GCC_INC := $(shell $(CC) -print-file-name=include)
-+CFLAGS += -I$(CFLAGS_GCC_INC)
-+
-+AFLAGS += -DNO_MM -g
-+#AFLAGS += -DNO_MM -g -save-temps
-+
-+# vic - add this to get name of nios gcc library
-+LIBGCC_CFLAGS = $(if $(CONFIG_NIOS2_HW_MUL_OFF),-mno-hw-mul)
-+LIBGCC        := `$(CC) --print-libgcc-file-name $(LIBGCC_CFLAGS)`
-+
-+# add this to avoid multiple '_stack' and '_vecbase' definition errors
-+#
-+ifdef niosgnu
-+# Include the path to the lib directory where the ldscripts are found to fix
-+# a problem with the cygwin/bash environment.
-+
-+#cygwhack: kenw - this following section could be a possible problem
-+#                 due to the O= option on the command line.
-+LDSCRIPTS:=$(shell nios2-elf-gcc -print-file-name=ldscripts)
-+LDFLAGS += -mnios2elf -L $(LDSCRIPTS)/..
-+else
-+LDFLAGS += -mnios2elf
-+LDLIBS := -L `$(CC) -print-file-name=m32`  -l gcc
-+endif
-+
-+head-y := arch/nios2nommu/kernel/head.o arch/nios2nommu/kernel/init_task.o
-+
-+CLEAN_FILES := include/asm-$(ARCH)/asm-offsets.h \
-+             $(HARDWARE_MK) \
-+             arch/$(ARCH)/kernel/asm-offsets.s \
-+             linux.srec \
-+             linux.flash \
-+             linux.bin \
-+             linux.bin.srec
-+
-+core-y        += arch/nios2nommu/kernel/ \
-+         arch/nios2nommu/mm/ \
-+         arch/nios2nommu/drivers/ 
-+
-+libs-y        += arch/nios2nommu/lib/
-+
-+libs-y                += $(LIBGCC)
-+####;dgt2;tmp;
-+
-+# force user to configure hardware before building kernel
-+
-+pardoned_targets = clean mrproper sgmldocs psdocs pdfdocs \
-+                   htmldocs mandocs headers_install
-+
-+-include $(HARDWARE_MK)
-+build_targets = $(filter-out $(pardoned_targets), $(MAKECMDGOALS))
-+ifneq '$(strip $(build_targets))' ''
-+  ifndef SYSPTF
-+    ifneq '$(firstword $(MAKECMDGOALS))' 'hwselect'
-+      $(error Run "make hwselect SYSPTF=<system.ptf>" first)
-+    endif
-+  endif
-+endif
-+
-+quiet_cmd_gen_mk = '  RUNNING $@'
-+define cmd_gen_mk
-+      mkdir -p $(dir $(objtree)/$(HARDWARE_MK)); \
-+      perl -I$(TOPDIR)/arch/$(ARCH)/scripts \
-+              $(srctree)/arch/$(ARCH)/scripts/hwselect.pl $(SYSPTF) \
-+              $(objtree)/$(HARDWARE_MK)
-+endef
-+
-+.PHONY: hwselect
-+hwselect:
-+      @echo $($(quiet)cmd_gen_mk);
-+      @$(cmd_gen_mk)  
-+      
-+prepare: include/nios2_system.h
-+
-+archclean:
-+      $(call descend arch/$(ARCH)/boot, subdirclean)
-+
-+define filechk_nios2_system.h
-+      # call perl script that will build nios2_system.h file
-+      perl -I$(TOPDIR)/arch/$(ARCH)/scripts \
-+        $(TOPDIR)/arch/$(ARCH)/scripts/gen_nios2_system.h.pl $(CPU) $(EXEMEM) $(UPLMEM)
-+endef
-+
-+include/nios2_system.h: $(SYSPTF) FORCE
-+      $(call filechk,nios2_system.h)
-+
-+quiet_cmd_touch = '  TOUCH   $@'
-+      cmd_touch = touch $(TOPDIR)/$@
-+      
-+arch/$(ARCH)/kernel/vmlinux.lds.S: FORCE
-+      @echo $($(quiet)cmd_touch);
-+      @$(cmd_touch)
-+      
-+linuxsrec: linux
-+      $(OBJCOPY) -O srec $(LINUX) linux.srec
-+
-+boot := arch/nios2nommu/boot
-+
-+zImage: vmlinux
-+      $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
-+
-+compressed: zImage
-+
-+CLEAN_FILES += include/nios2_system.h
-+
-+archmrproper:
-+
-+archdep:
-+
-diff --git a/arch/nios2nommu/boot/Makefile b/arch/nios2nommu/boot/Makefile
-new file mode 100644
-index 0000000..fd25b72
---- /dev/null
-+++ b/arch/nios2nommu/boot/Makefile
-@@ -0,0 +1,17 @@
-+#
-+# arch/nios2nommu/boot/Makefile
-+#
-+# This file is subject to the terms and conditions of the GNU General Public
-+# License.  See the file "COPYING" in the main directory of this archive
-+# for more details.
-+
-+targets := zImage
-+subdir- := compressed
-+
-+$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
-+      $(call if_changed,objcopy)
-+      @echo 'Kernel: $@ is ready'
-+
-+$(obj)/compressed/vmlinux: FORCE
-+      $(Q)$(MAKE) $(build)=$(obj)/compressed $@
-+
-diff --git a/arch/nios2nommu/boot/compressed/Makefile b/arch/nios2nommu/boot/compressed/Makefile
-new file mode 100644
-index 0000000..2002471
---- /dev/null
-+++ b/arch/nios2nommu/boot/compressed/Makefile
-@@ -0,0 +1,36 @@
-+#
-+# linux/arch/sh/boot/compressed/Makefile
-+#
-+# create a compressed vmlinux image from the original vmlinux
-+#
-+
-+targets               := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o \
-+                 piggy.o vmlinux.lds
-+EXTRA_AFLAGS  :=
-+
-+OBJECTS = $(obj)/head.o $(obj)/misc.o
-+
-+#
-+# IMAGE_OFFSET is the load offset of the compression loader
-+#
-+#IMAGE_OFFSET := $(shell printf "0x%08x" $$[$(CONFIG_MEMORY_START)+0x2000])
-+#IMAGE_OFFSET := $(shell printf "0x%08x" $$[$(CONFIG_MEMORY_START)+0x00400000])
-+
-+LDFLAGS_vmlinux := -T
-+
-+$(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS) $(obj)/piggy.o FORCE
-+      $(call if_changed,ld)
-+      @:
-+
-+$(obj)/vmlinux.bin: vmlinux FORCE
-+      $(call if_changed,objcopy)
-+
-+$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
-+      $(call if_changed,gzip)
-+
-+LDFLAGS_piggy.o := -r --format binary --oformat elf32-littlenios2 -T
-+
-+OBJCOPYFLAGS += -O binary
-+
-+$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
-+      $(call if_changed,ld)
-diff --git a/arch/nios2nommu/boot/compressed/head.S b/arch/nios2nommu/boot/compressed/head.S
-new file mode 100644
-index 0000000..accadd0
---- /dev/null
-+++ b/arch/nios2nommu/boot/compressed/head.S
-@@ -0,0 +1,100 @@
-+/*
-+ *  linux/arch/nios2nommu/boot/compressed/head.S
-+ *
-+ */
-+
-+      .text
-+      .set noat
-+#include <asm/asm-offsets.h>
-+#include <asm/asm-macros.h>
-+
-+      /*
-+       * This code can be loaded anywhere, as long as output will not
-+       * overlap it.
-+       *
-+       */
-+
-+      .global _start
-+_start:
-+      // disable interrupt
-+      wrctl   status, r0
-+      // flush the instruction cache  
-+      movia r1,NIOS2_ICACHE_SIZE
-+      movi r2,NIOS2_ICACHE_LINE_SIZE
-+text_init:
-+      initi r1
-+      sub r1, r1, r2
-+      bgt r1, zero, text_init
-+      // then flush the pipeline
-+      flushp
-+      // flush the data cache 
-+      movia r1,NIOS2_DCACHE_SIZE
-+      movi r2,NIOS2_DCACHE_LINE_SIZE
-+data_init:
-+      initd (r1)
-+      sub r1, r1, r2
-+      bgt r1, zero, data_init
-+      //------------------------------------------------------
-+      // Zero out the .bss segment (uninitialized common data)
-+      //
-+      movia   r2,__bss_start          // presume nothing is between
-+      movia   r1,_end                 // the .bss and _end.
-+1:
-+      stb     r0,0(r2)
-+      addi    r2,r2,1
-+      bne     r1,r2,1b
-+      // set up the stack pointer, some where higher than _end. The stack space must be greater than 32K for decompress.
-+      movia   sp, 0x10000
-+      add     sp,sp,r1
-+      // save args passed from u-boot
-+      addi    sp,sp,-16
-+      stw     r4,0(sp)
-+      stw     r5,4(sp)
-+      stw     r6,8(sp)
-+      stw     r7,12(sp)
-+/*
-+ * decompress the kernel
-+ */
-+      call    decompress_kernel
-+      
-+flush_cache:
-+      // flush all cache after loading
-+      // flush the data cache 
-+      movia r1,NIOS2_DCACHE_SIZE
-+      movi r2,NIOS2_DCACHE_LINE_SIZE
-+data_flush:
-+      flushd (r1)
-+      sub r1, r1, r2
-+      bgt r1, zero, data_flush
-+      // flush the instruction cache
-+      movia r1,NIOS2_ICACHE_SIZE
-+      movi r2,NIOS2_ICACHE_LINE_SIZE
-+text_flush:
-+      flushi r1
-+      sub r1, r1, r2
-+      bgt r1, zero, text_flush
-+      // then flush the pipeline
-+      flushp
-+      // pass saved args to kernel
-+      ldw     r4,0(sp)
-+      ldw     r5,4(sp)
-+      ldw     r6,8(sp)
-+      ldw     r7,12(sp)
-+      movia r1,LINUX_SDRAM_START      
-+      jmp     r1
-+
-+      .balign 512
-+fake_headers_as_bzImage:
-+      .short  0
-+      .ascii  "HdrS"
-+      .short  0x0202
-+      .short  0
-+      .short  0
-+      .byte   0x00, 0x10
-+      .short  0
-+      .byte   0
-+      .byte   1
-+      .byte   0x00, 0x80
-+      .long   0
-+      .long   0
-+
-diff --git a/arch/nios2nommu/boot/compressed/install.sh b/arch/nios2nommu/boot/compressed/install.sh
-new file mode 100644
-index 0000000..6d72e9e
---- /dev/null
-+++ b/arch/nios2nommu/boot/compressed/install.sh
-@@ -0,0 +1,57 @@
-+#!/bin/sh
-+#
-+# arch/sh/boot/install.sh
-+#
-+# This file is subject to the terms and conditions of the GNU General Public
-+# License.  See the file "COPYING" in the main directory of this archive
-+# for more details.
-+#
-+# Copyright (C) 1995 by Linus Torvalds
-+#
-+# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
-+# Adapted from code in arch/i386/boot/install.sh by Russell King
-+# Adapted from code in arch/arm/boot/install.sh by Stuart Menefy
-+# Adapted from code in arch/sh/boot/install.sh by Takeo Takahashi
-+#
-+# "make install" script for sh architecture
-+#
-+# Arguments:
-+#   $1 - kernel version
-+#   $2 - kernel image file
-+#   $3 - kernel map file
-+#   $4 - default install path (blank if root directory)
-+#
-+
-+# User may have a custom install script
-+
-+if [ -x /sbin/installkernel ]; then
-+  exec /sbin/installkernel "$@"
-+fi
-+
-+if [ "$2" = "zImage" ]; then
-+# Compressed install
-+  echo "Installing compressed kernel"
-+  if [ -f $4/vmlinuz-$1 ]; then
-+    mv $4/vmlinuz-$1 $4/vmlinuz.old
-+  fi
-+
-+  if [ -f $4/System.map-$1 ]; then
-+    mv $4/System.map-$1 $4/System.old
-+  fi
-+
-+  cat $2 > $4/vmlinuz-$1
-+  cp $3 $4/System.map-$1
-+else
-+# Normal install
-+  echo "Installing normal kernel"
-+  if [ -f $4/vmlinux-$1 ]; then
-+    mv $4/vmlinux-$1 $4/vmlinux.old
-+  fi
-+
-+  if [ -f $4/System.map ]; then
-+    mv $4/System.map $4/System.old
-+  fi
-+
-+  cat $2 > $4/vmlinux-$1
-+  cp $3 $4/System.map
-+fi
-diff --git a/arch/nios2nommu/boot/compressed/misc.c b/arch/nios2nommu/boot/compressed/misc.c
-new file mode 100644
-index 0000000..c513e6e
---- /dev/null
-+++ b/arch/nios2nommu/boot/compressed/misc.c
-@@ -0,0 +1,208 @@
-+/*
-+ * arch/nios2nommu/boot/compressed/misc.c
-+ *
-+ * This is a collection of several routines from gzip-1.0.3
-+ * adapted for Linux.
-+ *
-+ * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
-+ *
-+ * Adapted for SH by Stuart Menefy, Aug 1999
-+ *
-+ * Modified to use standard LinuxSH BIOS by Greg Banks 7Jul2000
-+ */
-+
-+#include <linux/string.h>
-+
-+/*
-+ * gzip declarations
-+ */
-+
-+#define OF(args)  args
-+#define STATIC static
-+
-+#undef memset
-+#undef memcpy
-+#define memzero(s, n)     memset ((s), 0, (n))
-+
-+typedef unsigned char  uch;
-+typedef unsigned short ush;
-+typedef unsigned long  ulg;
-+
-+#define WSIZE 0x8000          /* Window size must be at least 32k, */
-+                              /* and a power of two */
-+
-+static uch *inbuf;         /* input buffer */
-+static uch window[WSIZE];    /* Sliding window buffer */
-+
-+static unsigned insize = 0;  /* valid bytes in inbuf */
-+static unsigned inptr = 0;   /* index of next byte to be processed in inbuf */
-+static unsigned outcnt = 0;  /* bytes in output buffer */
-+
-+/* gzip flag byte */
-+#define ASCII_FLAG   0x01 /* bit 0 set: file probably ASCII text */
-+#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
-+#define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
-+#define ORIG_NAME    0x08 /* bit 3 set: original file name present */
-+#define COMMENT      0x10 /* bit 4 set: file comment present */
-+#define ENCRYPTED    0x20 /* bit 5 set: file is encrypted */
-+#define RESERVED     0xC0 /* bit 6,7:   reserved */
-+
-+#define get_byte()  (inptr < insize ? inbuf[inptr++] : fill_inbuf())
-+
-+/* Diagnostic functions */
-+#ifdef DEBUG
-+#  define Assert(cond,msg) {if(!(cond)) error(msg);}
-+#  define Trace(x) fprintf x
-+#  define Tracev(x) {if (verbose) fprintf x ;}
-+#  define Tracevv(x) {if (verbose>1) fprintf x ;}
-+#  define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
-+#  define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
-+#else
-+#  define Assert(cond,msg)
-+#  define Trace(x)
-+#  define Tracev(x)
-+#  define Tracevv(x)
-+#  define Tracec(c,x)
-+#  define Tracecv(c,x)
-+#endif
-+
-+static int  fill_inbuf(void);
-+static void flush_window(void);
-+static void error(char *m);
-+static void gzip_mark(void **);
-+static void gzip_release(void **);
-+
-+extern char input_data[];
-+extern int input_len;
-+
-+static long bytes_out = 0;
-+static uch *output_data;
-+static unsigned long output_ptr = 0;
-+
-+#include "nios2_sio.c"
-+
-+static void *malloc(int size);
-+static void free(void *where);
-+static void error(char *m);
-+static void gzip_mark(void **);
-+static void gzip_release(void **);
-+
-+int puts(const char *);
-+
-+extern int _end;
-+static unsigned long free_mem_ptr;
-+static unsigned long free_mem_end_ptr;
-+
-+#define HEAP_SIZE             0x10000
-+
-+#include "../../../../lib/inflate.c"
-+
-+static void *malloc(int size)
-+{
-+      void *p;
-+
-+      if (size <0) error("Malloc error");
-+      if (free_mem_ptr == 0) error("Memory error");
-+
-+      free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
-+
-+      p = (void *)free_mem_ptr;
-+      free_mem_ptr += size;
-+
-+      if (free_mem_ptr >= free_mem_end_ptr)
-+              error("Out of memory");
-+
-+      return p;
-+}
-+
-+static void free(void *where)
-+{     /* Don't care */
-+}
-+
-+static void gzip_mark(void **ptr)
-+{
-+      *ptr = (void *) free_mem_ptr;
-+}
-+
-+static void gzip_release(void **ptr)
-+{
-+      free_mem_ptr = (long) *ptr;
-+}
-+
-+void* memset(void* s, int c, size_t n)
-+{
-+      int i;
-+      char *ss = (char*)s;
-+
-+      for (i=0;i<n;i++) ss[i] = c;
-+      return s;
-+}
-+
-+void* memcpy(void* __dest, __const void* __src,
-+                          size_t __n)
-+{
-+      int i;
-+      char *d = (char *)__dest, *s = (char *)__src;
-+
-+      for (i=0;i<__n;i++) d[i] = s[i];
-+      return __dest;
-+}
-+
-+/* ===========================================================================
-+ * Fill the input buffer. This is called only when the buffer is empty
-+ * and at least one byte is really needed.
-+ */
-+static int fill_inbuf(void)
-+{
-+      if (insize != 0) {
-+              error("ran out of input data");
-+      }
-+
-+      inbuf = input_data;
-+      insize = input_len;
-+      inptr = 1;
-+      return inbuf[0];
-+}
-+
-+/* ===========================================================================
-+ * Write the output window window[0..outcnt-1] and update crc and bytes_out.
-+ * (Used for the decompressed data only.)
-+ */
-+static void flush_window(void)
-+{
-+    ulg c = crc;         /* temporary variable */
-+    unsigned n;
-+    uch *in, *out, ch;
-+    in = window;
-+    out = &output_data[output_ptr];
-+    for (n = 0; n < outcnt; n++) {
-+          ch = *out++ = *in++;
-+          c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
-+    }
-+    crc = c;
-+    bytes_out += (ulg)outcnt;
-+    output_ptr += (ulg)outcnt;
-+    outcnt = 0;
-+}
-+
-+static void error(char *x)
-+{
-+      puts("\nERROR\n");
-+      puts(x);
-+      puts("\n\n -- System halted");
-+
-+      while(1);       /* Halt */
-+}
-+
-+void decompress_kernel(void)
-+{
-+  output_data = (void *)nasys_program_mem;
-+  output_ptr = 0;
-+  free_mem_ptr = (unsigned long)&_end;
-+  free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
-+
-+  makecrc();
-+  puts("Uncompressing Linux... ");
-+  gunzip();
-+  puts("Ok, booting the kernel.\n");
-+}
-diff --git a/arch/nios2nommu/boot/compressed/nios2_sio.c b/arch/nios2nommu/boot/compressed/nios2_sio.c
-new file mode 100644
-index 0000000..8630c8f
---- /dev/null
-+++ b/arch/nios2nommu/boot/compressed/nios2_sio.c
-@@ -0,0 +1,57 @@
-+
-+static int putchar(int ch);
-+
-+static int puts(const char *s)
-+      {
-+      while(*s)
-+              putchar(*s++);
-+      return 0;
-+      }
-+
-+#include <asm/nios.h>
-+#include <asm/io.h>
-+
-+#if defined(CONFIG_SERIAL_AJUART_CONSOLE)
-+
-+#define IORD_ALTERA_AVALON_JTAG_UART_DATA(base)           inl(base) 
-+#define IOWR_ALTERA_AVALON_JTAG_UART_DATA(base, data)     outl(data, base)
-+#define IORD_ALTERA_AVALON_JTAG_UART_CONTROL(base)        inl(base+4)
-+#define IOWR_ALTERA_AVALON_JTAG_UART_CONTROL(base, data)  outl(data, base+4)
-+#define ALTERA_AVALON_JTAG_UART_CONTROL_WSPACE_MSK        (0xFFFF0000u)
-+#define ALTERA_AVALON_JTAG_UART_CONTROL_WSPACE_OFST       (16)
-+
-+static void jtag_putc(int ch)
-+{
-+  unsigned base = na_jtag_uart;
-+  while ((IORD_ALTERA_AVALON_JTAG_UART_CONTROL(base) & ALTERA_AVALON_JTAG_UART_CONTROL_WSPACE_MSK) == 0);
-+  IOWR_ALTERA_AVALON_JTAG_UART_DATA(base, ch);
-+}
-+
-+static int putchar(int ch)
-+{
-+   jtag_putc( ch );
-+   return ch;
-+}
-+
-+#elif defined(CONFIG_NIOS_SERIAL_CONSOLE)
-+
-+static void nr_txchar(int ch)
-+{
-+  while ((na_uart0->np_uartstatus & np_uartstatus_trdy_mask) == 0);
-+  na_uart0->np_uarttxdata = ch;
-+}
-+
-+static int putchar(int ch)
-+{
-+   nr_txchar( ch ); if (ch=='\n') nr_txchar( '\r' );
-+   return ch;
-+}
-+
-+#else
-+
-+static int putchar(int ch)
-+{
-+   return ch;
-+}
-+
-+#endif
-diff --git a/arch/nios2nommu/boot/compressed/vmlinux.lds.S b/arch/nios2nommu/boot/compressed/vmlinux.lds.S
-new file mode 100644
-index 0000000..08bb3e2
---- /dev/null
-+++ b/arch/nios2nommu/boot/compressed/vmlinux.lds.S
-@@ -0,0 +1,34 @@
-+#include <asm-generic/vmlinux.lds.h>
-+#include <asm/nios.h>
-+
-+OUTPUT_FORMAT("elf32-littlenios2", "elf32-littlenios2", "elf32-littlenios2")
-+
-+OUTPUT_ARCH(nios)
-+ENTRY(_start) /* Defined in head.S */
-+
-+SECTIONS
-+{
-+  . =nasys_program_mem + CONFIG_BOOT_LINK_OFFSET;
-+
-+  _text = .;
-+  .text : { *(.text) } = 0
-+  .rodata : { *(.rodata) *(.rodata.*) }
-+  _etext = .;
-+
-+  . = ALIGN(32 / 8);
-+  .data : { *(.data) }
-+  . = ALIGN(32 / 8);
-+  _got = .;
-+  .got  : { *(.got) _egot = .; *(.got.*) }
-+  _edata  =  .;
-+
-+  . = ALIGN(32 / 8);
-+  __bss_start = .;
-+  .bss : { *(.bss) *(.sbss) }
-+  . = ALIGN(32 / 8);
-+  _ebss = .;
-+  end = . ;
-+  _end = . ;
-+
-+  got_len = (_egot - _got);
-+}
-diff --git a/arch/nios2nommu/defconfig b/arch/nios2nommu/defconfig
-new file mode 100644
-index 0000000..40629cb
---- /dev/null
-+++ b/arch/nios2nommu/defconfig
-@@ -0,0 +1,690 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.19-uc1
-+#
-+# CONFIG_MMU is not set
-+# CONFIG_FPU is not set
-+CONFIG_UID16=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_LOCK_KERNEL=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+
-+#
-+# General setup
-+#
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+# CONFIG_SYSVIPC is not set
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_UTS_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+# CONFIG_RELAY is not set
-+CONFIG_INITRAMFS_SOURCE="../romfs ../vendors/Altera/nios2nommu/romfs_list"
-+CONFIG_INITRAMFS_ROOT_UID=500
-+CONFIG_INITRAMFS_ROOT_GID=500
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_SYSCTL_SYSCALL is not set
-+# CONFIG_KALLSYMS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+# CONFIG_ELF_CORE is not set
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SLAB=y
-+# CONFIG_VM_EVENT_COUNTERS is not set
-+CONFIG_RT_MUTEXES=y
-+CONFIG_TINY_SHMEM=y
-+CONFIG_BASE_SMALL=0
-+# CONFIG_SLOB is not set
-+
-+#
-+# Loadable module support
-+#
-+# CONFIG_MODULES is not set
-+
-+#
-+# Block layer
-+#
-+CONFIG_BLOCK=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_DEFAULT_AS is not set
-+CONFIG_DEFAULT_DEADLINE=y
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="deadline"
-+
-+#
-+# Processor type and features
-+#
-+
-+#
-+# Platform dependant setup
-+#
-+CONFIG_NIOS2=y
-+# CONFIG_MICROTRONIX_UKIT is not set
-+# CONFIG_MICROTRONIX_STRATIX is not set
-+# CONFIG_MICROTRONIX_CYCLONE is not set
-+# CONFIG_MICROTRONIX_PSK is not set
-+CONFIG_ALTERA_STRATIX=y
-+# CONFIG_ALTERA_STRATIX_PRO is not set
-+# CONFIG_ALTERA_STRATIX_II is not set
-+# CONFIG_ALTERA_CYCLONE is not set
-+# CONFIG_ALTERA_CYCLONE_1C12_EVAL is not set
-+# CONFIG_ALTERA_DE2 is not set
-+# CONFIG_NIOS2_HW_MUL_OFF is not set
-+CONFIG_NIOS2_HW_MUL=y
-+# CONFIG_NIOS2_HW_MULX is not set
-+
-+#
-+# Platform drivers Options
-+#
-+# CONFIG_AVALON_DMA is not set
-+# CONFIG_PIO_DEVICES is not set
-+# CONFIG_PCI is not set
-+# CONFIG_FB_ALTERA is not set
-+# CONFIG_SERIO_ALTPS2 is not set
-+# CONFIG_I2C_GPIO is not set
-+
-+#
-+# Miscellaneous Options
-+#
-+CONFIG_EXCALIBUR=y
-+# CONFIG_BREAK_ON_START is not set
-+CONFIG_LARGE_ALLOCS=y
-+CONFIG_RAMKERNEL=y
-+CONFIG_PREEMPT=y
-+# CONFIG_PREEMPT_TIMES is not set
-+CONFIG_CMDLINE=""
-+# CONFIG_PASS_CMDLINE is not set
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_BOOT_LINK_OFFSET=0x00500000
-+
-+#
-+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-+#
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+
-+#
-+# PCI Hotplug Support
-+#
-+
-+#
-+# Executable file formats
-+#
-+CONFIG_KCORE_AOUT=y
-+CONFIG_KCORE_ELF=y
-+CONFIG_BINFMT_FLAT=y
-+CONFIG_BINFMT_ZFLAT=y
-+# CONFIG_BINFMT_SHARED_FLAT is not set
-+# CONFIG_BINFMT_MISC is not set
-+
-+#
-+# Power management options
-+#
-+# CONFIG_PM is not set
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+# CONFIG_NETDEBUG is not set
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+# CONFIG_IP_PNP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_IPSEC_NAT_TRAVERSAL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_DIAG is not set
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# 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_NETFILTER is not set
-+
-+#
-+# DCCP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_DCCP is not set
-+
-+#
-+# SCTP Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_SCTP is not set
-+
-+#
-+# TIPC Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_KLIPS is not set
-+# CONFIG_IEEE80211 is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_SYS_HYPERVISOR is not set
-+
-+#
-+# Connector - unified userspace <-> kernelspace linker
-+#
-+# CONFIG_CONNECTOR is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+# CONFIG_MTD is not set
-+
-+#
-+# Parallel port support
-+#
-+# CONFIG_PARPORT is not set
-+
-+#
-+# Plug and Play support
-+#
-+
-+#
-+# Block devices
-+#
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_RAM is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+
-+#
-+# Misc devices
-+#
-+# CONFIG_TIFM_CORE is not set
-+
-+#
-+# ATA/ATAPI/MFM/RLL support
-+#
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_NETLINK is not set
-+
-+#
-+# Serial ATA (prod) and Parallel ATA (experimental) drivers
-+#
-+# CONFIG_ATA is not set
-+
-+#
-+# Multi-device support (RAID and LVM)
-+#
-+# CONFIG_MD is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# I2O device support
-+#
-+
-+#
-+# Network device support
-+#
-+CONFIG_NETDEVICES=y
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+
-+#
-+# PHY device support
-+#
-+# CONFIG_PHYLIB is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_NET_VENDOR_SMC is not set
-+# CONFIG_OPEN_ETH is not set
-+# CONFIG_MTIP1000_ETH is not set
-+# CONFIG_NE2000 is not set
-+# CONFIG_NET_PCI is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+
-+#
-+# Ethernet (10000 Mbit)
-+#
-+
-+#
-+# Token Ring devices
-+#
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Telephony Support
-+#
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NIOS_LCD_16207 is not set
-+# CONFIG_NIOS_BUTTON is not set
-+# CONFIG_LEDMAN is not set
-+# CONFIG_SNAPDOG is not set
-+# CONFIG_FAST_TIMER is not set
-+# CONFIG_RESETSWITCH is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_NIOS_SERIAL is not set
-+CONFIG_SERIAL_AJUART=y
-+CONFIG_SERIAL_AJUART_CONSOLE=y
-+# CONFIG_UNIX98_PTYS is not set
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=10
-+
-+#
-+# IPMI
-+#
-+# CONFIG_IPMI_HANDLER is not set
-+
-+#
-+# Watchdog Cards
-+#
-+# CONFIG_WATCHDOG is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_RTC is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+# CONFIG_RAW_DRIVER is not set
-+
-+#
-+# TPM devices
-+#
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_M41T11M6 is not set
-+
-+#
-+# I2C support
-+#
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+
-+#
-+# Dallas's 1-wire bus
-+#
-+# CONFIG_W1 is not set
-+
-+#
-+# Hardware Monitoring support
-+#
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_ABITUGURU is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# Digital Video Broadcasting Devices
-+#
-+# CONFIG_DVB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_FIRMWARE_EDID is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+
-+#
-+# USB support
-+#
-+# CONFIG_USB_ARCH_HAS_HCD is not set
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# MMC/SD Card support
-+#
-+# CONFIG_MMC is not set
-+
-+#
-+# LED devices
-+#
-+# CONFIG_NEW_LEDS is not set
-+
-+#
-+# LED drivers
-+#
-+
-+#
-+# LED Triggers
-+#
-+
-+#
-+# InfiniBand support
-+#
-+
-+#
-+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-+#
-+
-+#
-+# Real Time Clock
-+#
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# DMA Engine support
-+#
-+# CONFIG_DMA_ENGINE is not set
-+
-+#
-+# DMA Clients
-+#
-+
-+#
-+# DMA Devices
-+#
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_DNOTIFY is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+# CONFIG_DIRECTIO is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_SYSCTL is not set
-+CONFIG_SYSFS=y
-+# CONFIG_TMPFS is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=y
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_SQUASHFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+
-+#
-+# Network File Systems
-+#
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFSD is not set
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+# CONFIG_9P_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+
-+#
-+# Native Language Support
-+#
-+# CONFIG_NLS is not set
-+
-+#
-+# Debug
-+#
-+# CONFIG_COREDUMP_PRINTK is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_FULLDEBUG is not set
-+# CONFIG_FRAME_POINTER is not set
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_NO_KERNEL_MSG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+
-+#
-+# Cryptographic options
-+#
-+# CONFIG_CRYPTO is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+CONFIG_CRC32=y
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-diff --git a/arch/nios2nommu/drivers/Kconfig b/arch/nios2nommu/drivers/Kconfig
-new file mode 100644
-index 0000000..2fde3a8
---- /dev/null
-+++ b/arch/nios2nommu/drivers/Kconfig
-@@ -0,0 +1,45 @@
-+# Platfrom drivers configuration
-+
-+source "arch/nios2nommu/drivers/pci/Kconfig"
-+
-+config FB_ALTERA
-+      tristate "Avalon VGA controller support"
-+      default N
-+      select FB
-+      select FB_CFB_FILLRECT
-+      select FB_CFB_COPYAREA
-+      select FB_CFB_IMAGEBLIT
-+      help
-+        This is the frame buffer device driver for the VGA controller 
-+        in SOPC Builder.
-+
-+config SERIO_ALTPS2
-+      tristate "PS2 controller"
-+      select VT
-+      default N
-+      select SERIO
-+
-+config I2C_NIOS2_GPIO
-+      tristate "GPIO-Based I2C Interface"
-+      default N
-+      select I2C
-+      select I2C_ALGOBIT
-+      help
-+        Say Y here if you use GPIO lines for an I2C bus.
-+
-+config BLK_DEV_ALTCF
-+      tristate "Altera CF (IDE mode) interface (Avalon bus) support"
-+      select IDE
-+      select BLK_DEV_IDE
-+      default N
-+      help
-+        This driver provides support for the Altera Compact flash core (with
-+        Avalon interface) support. If you have an Altera or Microtronix
-+        development board you can build support into the FPGA device for this.
-+
-+config NIOS_SPI
-+      bool "Nios SPI device support"
-+      depends on NIOS || NIOS2
-+      help
-+        This driver supports the Nios softcore SPI device.
-+
-diff --git a/arch/nios2nommu/drivers/Makefile b/arch/nios2nommu/drivers/Makefile
-new file mode 100644
-index 0000000..f6a273e
---- /dev/null
-+++ b/arch/nios2nommu/drivers/Makefile
-@@ -0,0 +1,10 @@
-+#
-+# Makefile for the Linux nios2-specific device drivers.
-+#
-+
-+obj-$(CONFIG_PCI)             += pci/
-+obj-$(CONFIG_FB_ALTERA)         += altfb.o
-+obj-$(CONFIG_SERIO_ALTPS2)    += altps2.o
-+obj-$(CONFIG_I2C_NIOS2_GPIO)  += i2c-gpio.o
-+obj-$(CONFIG_BLK_DEV_ALTCF)   += altcf.o
-+obj-$(CONFIG_NIOS_SPI)                += spi.o
-diff --git a/arch/nios2nommu/drivers/altcf.c b/arch/nios2nommu/drivers/altcf.c
-new file mode 100644
-index 0000000..80275c6
---- /dev/null
-+++ b/arch/nios2nommu/drivers/altcf.c
-@@ -0,0 +1,266 @@
-+/*
-+ *  linux/drivers/ide/altcf.c
-+ *  Support for Altera CompactFlash core with Avalon interface.
-+ *
-+ *  Copyright (C) 2004 Microtronix Datacom Ltd
-+ *
-+ *  This program is free software; you can redistribute it and/or
-+ *  modify it under the terms of the GNU General Public License
-+ *  as published by the Free Software Foundation; either version
-+ *  2 of the License, or (at your option) any later version.
-+ *
-+ *  Written by Wentao Xu <wentao@microtronix.com>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/timer.h>
-+#include <linux/mm.h>
-+#include <linux/ioport.h>
-+#include <linux/blkdev.h>
-+#include <linux/hdreg.h>
-+#include <linux/ide.h>
-+#include <linux/init.h>
-+#include <asm/io.h>
-+#include <asm/nios.h>
-+
-+MODULE_AUTHOR("Microtronix Datacom Ltd.");
-+MODULE_DESCRIPTION("Driver of Altera CompactFlash core with Avalon interface");
-+MODULE_LICENSE("GPL");
-+
-+#define PDEBUG printk
-+/* Altera Avalon Compact Flash core registers */
-+#define REG_CFCTL             0
-+#define REG_IDECTL            4
-+
-+/* CFCTL bits */
-+#define CFCTL_DET             1               /* detect status        */
-+#define CFCTL_PWR             2               /* Power                        */
-+#define CFCTL_RST             4               /* Reset                        */
-+#define CFCTL_IDET            8               /* Detect int enable*/
-+
-+/* IDECTL bits */
-+#define IDECTL_IIDE           1               /* IDE int enable */
-+
-+struct cf_dev {
-+      int base;
-+      int irq;
-+      int ide_base;
-+      int ide_irq;
-+      int configured;
-+      ide_hwif_t *hwif;
-+      struct delayed_work wcf;
-+};
-+
-+static struct cf_dev cf_devices[MAX_HWIFS] = {
-+#if MAX_HWIFS > 0
-+      {na_ide_ctl, na_ide_ctl_irq, na_ide_ide, na_ide_ide_irq, 0, NULL},
-+#endif
-+#if MAX_HWIFS > 1
-+      {na_ctl_base1, na_ctl_irq1, na_ide_base1, na_ide_irq1, 0, NULL},
-+#endif
-+#if MAX_HWIFS > 2
-+      {na_ctl_base2, na_ctl_irq2, na_ide_base2, na_ide_irq2, 0, NULL},
-+#endif
-+#if MAX_HWIFS > 3
-+      {na_ctl_base3, na_ctl_irq3, na_ide_base3, na_ide_irq3, 0, NULL},
-+#endif
-+};
-+
-+static inline void cf_init_hwif_ports(hw_regs_t *hw,
-+                                     unsigned long io_addr,
-+                                     unsigned long ctl_addr,
-+                                     int *irq)
-+{
-+      unsigned int i;
-+
-+      for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
-+              hw->io_ports[i] = io_addr + 4*(i-IDE_DATA_OFFSET);
-+
-+      hw->io_ports[IDE_CONTROL_OFFSET] = ctl_addr;
-+
-+      if (irq)
-+              *irq = 0;
-+
-+      hw->io_ports[IDE_IRQ_OFFSET] = 0;
-+
-+}
-+
-+static int cf_release(struct cf_dev* dev)
-+{
-+      if (dev) {
-+          if ((dev->configured) && (dev->hwif)) {
-+              /* disable IDE interrupts */
-+                  outl(0, dev->base + REG_IDECTL);
-+                  /* power off the card */
-+                      //outl(0, dev->base + REG_CFCTL);
-+
-+                      ide_unregister(dev->hwif->index);
-+                      dev->configured = 0;
-+                      dev->hwif = NULL;
-+                      PDEBUG("CF released\n");
-+                      return 0;
-+              }
-+      }
-+      return -1;
-+}
-+
-+static int cf_config(struct cf_dev* dev)
-+{
-+    hw_regs_t hw;
-+    int index;
-+    ide_hwif_t *hwif;
-+
-+    if (!dev)
-+      return -1;
-+
-+    if (!dev->configured) {
-+      int i;
-+      for (i=1; i<=10; i++) {
-+                  cf_init_hwif_ports(&hw, dev->ide_base, 0, NULL);
-+                  hw.irq = dev->ide_irq;
-+                  hw.chipset = ide_generic;
-+                  outl(IDECTL_IIDE, dev->base + REG_IDECTL);
-+                  index = ide_register_hw(&hw, 1, &hwif);
-+                  if (index >=0) {
-+                          dev->configured = 1;
-+                          dev->hwif = hwif;
-+                          return index;
-+                      }
-+
-+                      set_current_state(TASK_UNINTERRUPTIBLE);
-+                      schedule_timeout(HZ/10);
-+              }
-+              /* register fails */
-+              PDEBUG("CF:fail to register\n");
-+              /* disable IDE interrupt */
-+              outl(0, dev->base + REG_IDECTL);
-+              return -1;
-+      }
-+      return -2; /* already configured */
-+}
-+
-+static irqreturn_t cf_intr(int irq, void *dev_id)
-+{
-+      unsigned int cfctl;
-+      struct cf_dev* dev = (struct cf_dev *)dev_id;
-+
-+      if (!dev)
-+              return IRQ_NONE;
-+
-+      cfctl=inl(dev->base + REG_CFCTL);
-+      /* unpower the card */
-+      outl((cfctl & ~(CFCTL_PWR)), dev->base + REG_CFCTL);
-+
-+      if ((cfctl & CFCTL_DET))
-+              schedule_delayed_work(&dev->wcf, HZ/2);
-+      else
-+              schedule_work(&dev->wcf.work);
-+      return IRQ_HANDLED;
-+}
-+
-+static void cf_event(struct work_struct *work)
-+{
-+      struct cf_dev* dev = container_of(work, struct cf_dev, wcf.work);
-+
-+      if (dev) {
-+              unsigned int cfctl;
-+
-+              cfctl=inl(dev->base + REG_CFCTL);
-+              if ((cfctl & CFCTL_DET)) {
-+                      /* a CF card is inserted, power on the card */
-+                      outl(((cfctl | CFCTL_PWR) & ~(CFCTL_RST) ), dev->base + REG_CFCTL);
-+                      set_current_state(TASK_UNINTERRUPTIBLE);
-+                      schedule_timeout(HZ);
-+                      cf_config(dev);
-+              }
-+              else {
-+                      /* a CF card is removed */
-+                      cf_release(dev);
-+              }
-+      }
-+}
-+
-+int __init altcf_init(void)
-+{
-+      unsigned int cfctl;
-+      int i;
-+    ide_hwif_t *hwif;
-+      hw_regs_t hw;
-+      extern ide_hwif_t ide_hwifs[];
-+
-+      for (i=0; i<MAX_HWIFS; i++) {
-+              cfctl=inl(cf_devices[i].base + REG_CFCTL);
-+              PDEBUG("CF: ctl=%d\n", cfctl);
-+              if (cfctl & CFCTL_DET)
-+              {
-+                      /* power off the card */
-+                      outl(CFCTL_RST, cf_devices[i].base + REG_CFCTL);
-+                      mdelay(500);
-+                      cfctl=inl(cf_devices[i].base + REG_CFCTL);
-+
-+                      /* power on the card */
-+                      outl(((cfctl | CFCTL_PWR) & ~(CFCTL_RST) ), cf_devices[i].base + REG_CFCTL);
-+                      mdelay(2000);
-+                      inl(cf_devices[i].base + REG_CFCTL);
-+
-+                      /* check if card is in right mode */
-+                      outb(0xa0, cf_devices[i].ide_base+IDE_SELECT_OFFSET*4);
-+                      mdelay(50);
-+                      if (inb(cf_devices[i].ide_base+IDE_SELECT_OFFSET*4) == 0xa0) {
-+                              /* enable IDE interrupt */
-+                              outl(IDECTL_IIDE, cf_devices[i].base + REG_IDECTL);
-+                              ide_hwifs[i].chipset  = ide_generic;
-+                              cf_devices[i].hwif = &ide_hwifs[i];
-+
-+                              memset(&hw, 0, sizeof hw);
-+                              cf_init_hwif_ports(&hw, cf_devices[i].ide_base, 0, NULL);
-+                              hw.chipset = ide_generic;
-+                              hw.irq = cf_devices[i].ide_irq;
-+                              if (ide_register_hw(&hw, 1, &hwif)>=0) {
-+                                      cf_devices[i].configured = 1;
-+                                      cf_devices[i].hwif = hwif;
-+                              }
-+                              else
-+                                      printk("CF register fails\n");
-+                      }
-+                      else printk("Unable to initialize compact flash card. Please re-insert\n");
-+              }
-+
-+              /* register the detection interrupt */
-+              if (request_irq(cf_devices[i].irq, cf_intr, IRQF_DISABLED, "cf", &cf_devices[i])) {
-+                      PDEBUG("CF: unable to get interrupt %d for detecting inf %d\n",
-+                                      cf_devices[i].irq, i );
-+              } else {
-+                      INIT_DELAYED_WORK(&cf_devices[i].wcf, cf_event);
-+                      /* enable the detection interrupt */
-+                      cfctl=inl(cf_devices[i].base + REG_CFCTL);
-+                      outl(cfctl | CFCTL_IDET, cf_devices[i].base + REG_CFCTL);
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+#ifdef MODULE
-+static void __exit altcf_exit(void)
-+{
-+      unsigned int cfctl;
-+      for (i=0; i<MAX_HWIFS; i++) {
-+              /* disable detection irq */
-+              cfctl=inl(cf_devices[i].base + REG_CFCTL);
-+              outl(cfctl & ~CFCTL_IDET, cf_devices[i].base + REG_CFCTL);
-+
-+              /* free the detection irq */
-+              free_irq(cf_devices[i].irq, &cf_devices[i]);
-+
-+              /* release the device */
-+              cf_release(&cf_devices[i]);
-+      }
-+}
-+
-+module_init(altcf_init);
-+module_exit(altcf_exit);
-+#endif
-diff --git a/arch/nios2nommu/drivers/altfb.c b/arch/nios2nommu/drivers/altfb.c
-new file mode 100644
-index 0000000..cebd659
---- /dev/null
-+++ b/arch/nios2nommu/drivers/altfb.c
-@@ -0,0 +1,234 @@
-+/*
-+ *  Altera VGA controller
-+ * 
-+ *  linux/drivers/video/vfb.c -- Virtual frame buffer device
-+ *
-+ *      Copyright (C) 2002 James Simmons
-+ *
-+ *    Copyright (C) 1997 Geert Uytterhoeven
-+ *
-+ *  This file is subject to the terms and conditions of the GNU General Public
-+ *  License. See the file COPYING in the main directory of this archive for
-+ *  more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/tty.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/uaccess.h>
-+#include <linux/fb.h>
-+#include <linux/init.h>
-+
-+#define vgabase na_vga_controller_0
-+#define XRES 640
-+#define YRES 480
-+#define BPX  16
-+
-+    /*
-+     *  RAM we reserve for the frame buffer. This defines the maximum screen
-+     *  size
-+     *
-+     *  The default can be overridden if the driver is compiled as a module
-+     */
-+
-+#define VIDEOMEMSIZE  (XRES * YRES * (BPX>>3))
-+
-+static void *videomemory;
-+static u_long videomemorysize = VIDEOMEMSIZE;
-+module_param(videomemorysize, ulong, 0);
-+
-+static struct fb_var_screeninfo altfb_default __initdata = {
-+      .xres =         XRES,
-+      .yres =         YRES,
-+      .xres_virtual = XRES,
-+      .yres_virtual = YRES,
-+      .bits_per_pixel = BPX,
-+#if (BPX == 16)
-+      .red =          { 11, 5, 0 },
-+              .green =        { 5, 6, 0 },
-+              .blue =         { 0, 5, 0 },
-+#else  // BPX == 24
-+      .red =          { 16, 8, 0 },
-+              .green =        { 8, 8, 0 },
-+              .blue =         { 0, 8, 0 },
-+#endif
-+              .activate =     FB_ACTIVATE_NOW,
-+              .height =       -1,
-+              .width =        -1,
-+      // timing useless ?
-+              .pixclock =     20000,
-+              .left_margin =  64,
-+              .right_margin = 64,
-+              .upper_margin = 32,
-+              .lower_margin = 32,
-+              .hsync_len =    64,
-+              .vsync_len =    2,
-+              .vmode =        FB_VMODE_NONINTERLACED,
-+};
-+
-+static struct fb_fix_screeninfo altfb_fix __initdata = {
-+      .id =           "Altera FB",
-+      .type =         FB_TYPE_PACKED_PIXELS,
-+      .visual =       FB_VISUAL_TRUECOLOR,
-+      .line_length =  (XRES * (BPX>>3)),
-+      .xpanstep =     0,
-+      .ypanstep =     0,
-+      .ywrapstep =    0,
-+      .accel =        FB_ACCEL_NONE,
-+};
-+
-+static int altfb_mmap(struct fb_info *info,
-+                  struct vm_area_struct *vma);
-+
-+static struct fb_ops altfb_ops = {
-+      .fb_fillrect    = cfb_fillrect,
-+      .fb_copyarea    = cfb_copyarea,
-+      .fb_imageblit   = cfb_imageblit,
-+      .fb_mmap        = altfb_mmap,
-+};
-+
-+
-+    /*
-+     *  Most drivers don't need their own mmap function 
-+     */
-+
-+static int altfb_mmap(struct fb_info *info,
-+                  struct vm_area_struct *vma)
-+{
-+      /* this is uClinux (no MMU) specific code */
-+      vma->vm_flags |= (VM_RESERVED | VM_MAYSHARE);
-+      vma->vm_start = (unsigned) videomemory;
-+      return 0;
-+}
-+
-+    /*
-+     *  Initialisation
-+     */
-+
-+static void altfb_platform_release(struct device *device)
-+{
-+      // This is called when the reference count goes to zero.
-+      dev_err(device, "This driver is broken, please bug the authors so they will fix it.\n");
-+}
-+
-+static int __init altfb_probe(struct platform_device *dev)
-+{
-+      struct fb_info *info;
-+      int retval = -ENOMEM;
-+      dma_addr_t handle;
-+
-+      /*
-+       * For real video cards we use ioremap.
-+       */
-+      if (!(videomemory = dma_alloc_coherent(&dev->dev, PAGE_ALIGN(videomemorysize), &handle, GFP_KERNEL))) {
-+              printk(KERN_ERR "altfb: unable to allocate screen memory\n");
-+              return retval;
-+      }
-+      altfb_fix.smem_start = handle;
-+      altfb_fix.smem_len = videomemorysize;
-+
-+      info = framebuffer_alloc(sizeof(u32) * 256, &dev->dev);
-+      if (!info)
-+              goto err;
-+
-+      info->screen_base = (char __iomem *)videomemory;
-+      info->fbops = &altfb_ops;
-+      info->var = altfb_default;
-+      info->fix = altfb_fix;
-+      info->pseudo_palette = info->par;
-+      info->par = NULL;
-+      info->flags = FBINFO_FLAG_DEFAULT;
-+
-+      retval = fb_alloc_cmap(&info->cmap, 256, 0);
-+      if (retval < 0)
-+              goto err1;
-+
-+      retval = register_framebuffer(info);
-+      if (retval < 0)
-+              goto err2;
-+      platform_set_drvdata(dev, info);
-+
-+      outl(0x0,vgabase+0);  // Reset the VGA controller
-+      outl(videomemory,vgabase+4);  // Where our frame buffer starts
-+      outl(videomemorysize,vgabase+8);  // amount of memory needed
-+      outl(0x1,vgabase+0);  // Set the go bit
-+
-+      printk(KERN_INFO
-+             "fb%d: Altera frame buffer device, using %ldK of video memory\n",
-+             info->node, videomemorysize >> 10);
-+      // printk("vga %08x, video %08x+%08x\n",vgabase,videomemory,videomemorysize);
-+      return 0;
-+err2:
-+      fb_dealloc_cmap(&info->cmap);
-+err1:
-+      framebuffer_release(info);
-+err:
-+      dma_free_noncoherent(&dev->dev, videomemorysize, videomemory, handle);
-+      return retval;
-+}
-+
-+static int altfb_remove(struct platform_device *dev)
-+{
-+      struct fb_info *info = platform_get_drvdata(dev);
-+
-+      if (info) {
-+              unregister_framebuffer(info);
-+              dma_free_noncoherent(&dev->dev, videomemorysize, videomemory, altfb_fix.smem_start);
-+              framebuffer_release(info);
-+      }
-+      return 0;
-+}
-+
-+static struct platform_driver altfb_driver = {
-+      .probe  = altfb_probe,
-+      .remove = altfb_remove,
-+      .driver = {
-+              .name   = "altfb",
-+      },
-+};
-+
-+static struct platform_device altfb_device = {
-+      .name   = "altfb",
-+      .id     = 0,
-+      .dev    = {
-+              .release = altfb_platform_release,
-+      }
-+};
-+
-+static int __init altfb_init(void)
-+{
-+      int ret = 0;
-+
-+      ret = platform_driver_register(&altfb_driver);
-+
-+      if (!ret) {
-+              ret = platform_device_register(&altfb_device);
-+              if (ret)
-+                      platform_driver_unregister(&altfb_driver);
-+      }
-+      return ret;
-+}
-+
-+module_init(altfb_init);
-+
-+#ifdef MODULE
-+static void __exit altfb_exit(void)
-+{
-+      platform_device_unregister(&altfb_device);
-+      platform_driver_unregister(&altfb_driver);
-+}
-+
-+module_exit(altfb_exit);
-+
-+MODULE_LICENSE("GPL");
-+#endif                                /* MODULE */
-diff --git a/arch/nios2nommu/drivers/altps2.c b/arch/nios2nommu/drivers/altps2.c
-new file mode 100644
-index 0000000..4a6523c
---- /dev/null
-+++ b/arch/nios2nommu/drivers/altps2.c
-@@ -0,0 +1,193 @@
-+/*
-+ *  altera DE2 PS/2
-+ *
-+ *  linux/drivers/input/serio/sa1111ps2.c
-+ *
-+ *  Copyright (C) 2002 Russell King
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License.
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/input.h>
-+#include <linux/serio.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/ioport.h>
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/slab.h>
-+
-+#include <asm/io.h>
-+#include <asm/system.h>
-+
-+
-+struct ps2if {
-+      struct serio            *io;
-+      struct platform_device  *dev;
-+      unsigned base;
-+        unsigned irq;
-+};
-+
-+/*
-+ * Read all bytes waiting in the PS2 port.  There should be
-+ * at the most one, but we loop for safety.  If there was a
-+ * framing error, we have to manually clear the status.
-+ */
-+static irqreturn_t ps2_rxint(int irq, void *dev_id)
-+{
-+      struct ps2if *ps2if = dev_id;
-+      unsigned int status;
-+      int handled = IRQ_NONE;
-+
-+      while ((status = inl(ps2if->base)) & 0xffff0000) {
-+              serio_interrupt(ps2if->io, status & 0xff, 0);
-+              handled = IRQ_HANDLED;
-+      }
-+      return handled;
-+}
-+
-+/*
-+ * Write a byte to the PS2 port.  We have to wait for the
-+ * port to indicate that the transmitter is empty.
-+ */
-+static int ps2_write(struct serio *io, unsigned char val)
-+{
-+      struct ps2if *ps2if = io->port_data;
-+      outl(val,ps2if->base);
-+      // should check command send error
-+      if (inl(ps2if->base+4) & (1<<10))
-+        {
-+          // printk("ps2 write error %02x\n",val);
-+        }
-+      return 0;
-+}
-+
-+static int ps2_open(struct serio *io)
-+{
-+      struct ps2if *ps2if = io->port_data;
-+      int ret;
-+
-+      ret = request_irq(ps2if->irq, ps2_rxint, 0,
-+                        "altps2", ps2if);
-+      if (ret) {
-+              printk(KERN_ERR "altps2: could not allocate IRQ%d: %d\n",
-+                      ps2if->irq, ret);
-+              return ret;
-+      }
-+      outl(1,ps2if->base+4);  // enable rx irq
-+      return 0;
-+}
-+
-+static void ps2_close(struct serio *io)
-+{
-+      struct ps2if *ps2if = io->port_data;
-+      outl(0,ps2if->base);  // disable rx irq
-+      free_irq(ps2if->irq, ps2if);
-+}
-+
-+/*
-+ * Add one device to this driver.
-+ */
-+static int ps2_probe(struct platform_device *dev)
-+{
-+      struct ps2if *ps2if;
-+      struct serio *serio;
-+      unsigned int status;
-+      int ret;
-+
-+      ps2if = kmalloc(sizeof(struct ps2if), GFP_KERNEL);
-+      serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
-+      if (!ps2if || !serio) {
-+              ret = -ENOMEM;
-+              goto free;
-+      }
-+
-+      memset(ps2if, 0, sizeof(struct ps2if));
-+      memset(serio, 0, sizeof(struct serio));
-+
-+      serio->id.type          = SERIO_8042;
-+      serio->write            = ps2_write;
-+      serio->open             = ps2_open;
-+      serio->close            = ps2_close;
-+      strlcpy(serio->name, dev->dev.bus_id, sizeof(serio->name));
-+      strlcpy(serio->phys, dev->dev.bus_id, sizeof(serio->phys));
-+      serio->port_data        = ps2if;
-+      serio->dev.parent       = &dev->dev;
-+      ps2if->io               = serio;
-+      ps2if->dev              = dev;
-+      platform_set_drvdata(dev, ps2if);
-+
-+      /*
-+       * Request the physical region for this PS2 port.
-+       */
-+      if (dev->num_resources < 2) {
-+              ret = -ENODEV;
-+              goto out;
-+      }
-+      if (!request_mem_region(dev->resource[0].start,
-+                              4,
-+                              "altps2")) {
-+              ret = -EBUSY;
-+              goto free;
-+      }
-+      ps2if->base = dev->resource[0].start;
-+      ps2if->irq  = dev->resource[1].start;
-+      printk("altps2 : base %08x irq %d\n",ps2if->base,ps2if->irq);
-+      // clear fifo
-+      while ((status = inl(ps2if->base)) & 0xffff0000) {
-+      }
-+
-+      serio_register_port(ps2if->io);
-+      return 0;
-+
-+ out:
-+      release_mem_region(dev->resource[0].start,4);
-+ free:
-+      platform_set_drvdata(dev, NULL);
-+      kfree(ps2if);
-+      kfree(serio);
-+      return ret;
-+}
-+
-+/*
-+ * Remove one device from this driver.
-+ */
-+static int ps2_remove(struct platform_device *dev)
-+{
-+      struct ps2if *ps2if = platform_get_drvdata(dev);
-+
-+      platform_set_drvdata(dev, NULL);
-+      serio_unregister_port(ps2if->io);
-+      release_mem_region(dev->resource[0].start,4);
-+
-+      kfree(ps2if);
-+
-+      return 0;
-+}
-+
-+/*
-+ * Our device driver structure
-+ */
-+static struct platform_driver ps2_driver = {
-+      .probe          = ps2_probe,
-+      .remove         = ps2_remove,
-+      .driver = {
-+              .name   = "altps2",
-+      },
-+};
-+
-+static int __init ps2_init(void)
-+{
-+      return platform_driver_register(&ps2_driver);
-+}
-+
-+static void __exit ps2_exit(void)
-+{
-+      platform_driver_unregister(&ps2_driver);
-+}
-+
-+module_init(ps2_init);
-+module_exit(ps2_exit);
-diff --git a/arch/nios2nommu/drivers/i2c-gpio.c b/arch/nios2nommu/drivers/i2c-gpio.c
-new file mode 100644
-index 0000000..3f5e51a
---- /dev/null
-+++ b/arch/nios2nommu/drivers/i2c-gpio.c
-@@ -0,0 +1,166 @@
-+/*
-+ * drivers/i2c/busses/i2c-gpio.c for Nios2
-+ *
-+ * drivers/i2c/busses/i2c-ixp2000.c
-+ *
-+ * I2C adapter for IXP2000 systems using GPIOs for I2C bus
-+ *
-+ * Author: Deepak Saxena <dsaxena@plexity.net>
-+ * Based on IXDP2400 code by: Naeem M. Afzal <naeem.m.afzal@intel.com>
-+ * Made generic by: Jeff Daly <jeffrey.daly@intel.com>
-+ *
-+ * Copyright (c) 2003-2004 MontaVista Software Inc.
-+ *
-+ * This file is licensed under  the terms of the GNU General Public 
-+ * License version 2. This program is licensed "as is" without any 
-+ * warranty of any kind, whether express or implied.
-+ *
-+ * From Jeff Daly:
-+ *
-+ * I2C adapter driver for Intel IXDP2xxx platforms. This should work for any
-+ * IXP2000 platform if it uses the HW GPIO in the same manner.  Basically, 
-+ * SDA and SCL GPIOs have external pullups.  Setting the respective GPIO to 
-+ * an input will make the signal a '1' via the pullup.  Setting them to 
-+ * outputs will pull them down. 
-+ *
-+ * The GPIOs are open drain signals and are used as configuration strap inputs
-+ * during power-up so there's generally a buffer on the board that needs to be 
-+ * 'enabled' to drive the GPIOs.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/module.h>
-+#include <linux/i2c.h>
-+#include <linux/i2c-algo-bit.h>
-+#include <linux/i2c-id.h>
-+
-+#include <asm/io.h>
-+#include <asm/gpio.h>
-+
-+static inline int gpio_scl_pin(void *data)
-+{
-+      return ((struct gpio_i2c_pins*)data)->scl_pin;
-+}
-+
-+static inline int gpio_sda_pin(void *data)
-+{
-+      return ((struct gpio_i2c_pins*)data)->sda_pin;
-+}
-+
-+
-+static void gpio_bit_setscl(void *data, int val)
-+{
-+      int i = 5000;
-+
-+      if (val) {
-+              outl(3,gpio_scl_pin(data));
-+              while(!(inl(gpio_scl_pin(data)) & 1) && i--);
-+      } else {
-+              outl(2,gpio_scl_pin(data));
-+      }
-+}
-+
-+static void gpio_bit_setsda(void *data, int val)
-+{
-+      if (val) {
-+              outl(1,gpio_sda_pin(data));
-+      } else {
-+              outl(0,gpio_sda_pin(data));
-+      }
-+}
-+
-+static int gpio_bit_getscl(void *data)
-+{
-+      return inl(gpio_scl_pin(data)) & 1;
-+}
-+
-+static int gpio_bit_getsda(void *data)
-+{
-+      return inl(gpio_sda_pin(data)) & 1;
-+}
-+
-+struct gpio_i2c_data {
-+      struct gpio_i2c_pins *gpio_pins;
-+      struct i2c_adapter adapter;
-+      struct i2c_algo_bit_data algo_data;
-+};
-+
-+static int gpio_i2c_remove(struct platform_device *plat_dev)
-+{
-+      struct gpio_i2c_data *drv_data = platform_get_drvdata(plat_dev);
-+
-+      platform_set_drvdata(plat_dev, NULL);
-+
-+      i2c_del_adapter(&drv_data->adapter);
-+
-+      kfree(drv_data);
-+
-+      return 0;
-+}
-+
-+static int gpio_i2c_probe(struct platform_device *plat_dev)
-+{
-+      int err;
-+      struct gpio_i2c_pins *gpio = plat_dev->dev.platform_data;
-+      struct gpio_i2c_data *drv_data = 
-+              kzalloc(sizeof(struct gpio_i2c_data), GFP_KERNEL);
-+
-+      if (!drv_data)
-+              return -ENOMEM;
-+      drv_data->gpio_pins = gpio;
-+
-+      drv_data->algo_data.data = gpio;
-+      drv_data->algo_data.setsda = gpio_bit_setsda;
-+      drv_data->algo_data.setscl = gpio_bit_setscl;
-+      drv_data->algo_data.getsda = gpio_bit_getsda;
-+      drv_data->algo_data.getscl = gpio_bit_getscl;
-+      drv_data->algo_data.udelay = 6;
-+      drv_data->algo_data.timeout = 100;
-+
-+      drv_data->adapter.id = I2C_HW_B_IXP2000,  // borrowed,
-+      strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name,
-+              I2C_NAME_SIZE);
-+      drv_data->adapter.algo_data = &drv_data->algo_data,
-+
-+      drv_data->adapter.dev.parent = &plat_dev->dev;
-+      drv_data->adapter.class = I2C_CLASS_ALL;
-+
-+      outl(1,gpio->sda_pin);
-+      outl(1,gpio->scl_pin);
-+
-+      if ((err = i2c_bit_add_bus(&drv_data->adapter)) != 0) {
-+              dev_err(&plat_dev->dev, "Could not install, error %d\n", err);
-+              kfree(drv_data);
-+              return err;
-+      } 
-+
-+      platform_set_drvdata(plat_dev, drv_data);
-+      printk("i2c-gpio driver at %08x\n",gpio->sda_pin);
-+
-+      return 0;
-+}
-+
-+static struct platform_driver gpio_i2c_driver = {
-+      .probe          = gpio_i2c_probe,
-+      .remove         = gpio_i2c_remove,
-+      .driver         = {
-+              .name   = "GPIO-I2C",
-+              .owner  = THIS_MODULE,
-+      },
-+};
-+
-+static int __init gpio_i2c_init(void)
-+{
-+      return platform_driver_register(&gpio_i2c_driver);
-+}
-+
-+static void __exit gpio_i2c_exit(void)
-+{
-+      platform_driver_unregister(&gpio_i2c_driver);
-+}
-+
-+module_init(gpio_i2c_init);
-+module_exit(gpio_i2c_exit);
-+
-diff --git a/arch/nios2nommu/drivers/pci/Kconfig b/arch/nios2nommu/drivers/pci/Kconfig
-new file mode 100644
-index 0000000..6c3b175
---- /dev/null
-+++ b/arch/nios2nommu/drivers/pci/Kconfig
-@@ -0,0 +1,4 @@
-+config PCI_ALTPCI
-+      bool "Altera PCI host bridge"
-+      select PCI
-+      default n
-diff --git a/arch/nios2nommu/drivers/pci/Makefile b/arch/nios2nommu/drivers/pci/Makefile
-new file mode 100644
-index 0000000..b027e1e
---- /dev/null
-+++ b/arch/nios2nommu/drivers/pci/Makefile
-@@ -0,0 +1,6 @@
-+#
-+# Makefile for the PCI specific kernel interface routines under Linux.
-+#
-+
-+obj-y += pci.o
-+obj-$(CONFIG_PCI_ALTPCI) += altpci.o setup-irq.o pci-auto.o
-diff --git a/arch/nios2nommu/drivers/pci/altpci.c b/arch/nios2nommu/drivers/pci/altpci.c
-new file mode 100644
-index 0000000..85959ea
---- /dev/null
-+++ b/arch/nios2nommu/drivers/pci/altpci.c
-@@ -0,0 +1,204 @@
-+/* arch/sh/kernel/pci.c
-+ * $Id: altpci.c,v 1.1 2006/07/05 06:23:17 gerg Exp $
-+ *
-+ * Copyright (c) 2002 M. R. Brown  <mrbrown@linux-sh.org>
-+ * 
-+ * 
-+ * These functions are collected here to reduce duplication of common
-+ * code amongst the many platform-specific PCI support code files.
-+ * 
-+ * These routines require the following board-specific routines:
-+ * void pcibios_fixup_irqs();
-+ *
-+ * See include/asm-sh/pci.h for more information.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+
-+/*
-+ * Direct access to PCI hardware...
-+ */
-+#define pcicfg_space (na_pci_compiler_0_PCI_Bus_Access)  // avalon space
-+#define pciio  (pcicfg_space+0x100000)    // pci io device base in avalon space
-+#define pcimm  (pcicfg_space+0x200000)    // pci mem device base in avalon space
-+  // idsel of ad11=dev0,ad12=dev1  , using type 0 config request
-+#define pcicfg(dev,fun,reg) (pcicfg_space | ((dev)<<11) | ((fun)<<8) | (reg))    // cfg space
-+
-+// FIX ME for your board, dram device for external pci masters access
-+static int __init alt_pci_init(void)
-+{
-+  unsigned dev,fun;
-+  // setup dram bar
-+  dev=0; fun=0;
-+  outl(nasys_program_mem,pcicfg(dev,fun,0x10));  // mem space
-+  outw(0x0006,pcicfg(dev,fun,0x04));   // enable master, mem space
-+  return 0;
-+}
-+
-+subsys_initcall(alt_pci_init);
-+
-+#define PCICFG(bus, devfn, where)  (pcicfg_space | (bus->number << 16) | (devfn << 8) | (where & ~3))
-+#define ALT_PCI_IO_BASE               (pciio)
-+#define ALT_PCI_IO_SIZE               0x100000
-+#define ALT_PCI_MEMORY_BASE   (pcimm) 
-+#define ALT_PCI_MEM_SIZE      0x100000
-+
-+/*
-+ * Functions for accessing PCI configuration space with type 1 accesses
-+ */
-+
-+// FIX ME for your board, number of pci bus, and number of devices
-+static inline int pci_range_ck(struct pci_bus *bus, unsigned int devfn)
-+{
-+  if (bus->number > 0 || PCI_SLOT(devfn) == 0 || PCI_SLOT(devfn) > 2)
-+              return -1;
-+
-+      return 0;
-+}
-+
-+static int alt_pci_read(struct pci_bus *bus, unsigned int devfn,
-+                         int where, int size, u32 *val)
-+{
-+      u32 data;
-+
-+      if (pci_range_ck(bus, devfn))
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      // local_irq_save(flags);
-+      data = inl(PCICFG(bus, devfn, where));
-+      // local_irq_restore(flags);
-+
-+      switch (size) {
-+      case 1:
-+              *val = (data >> ((where & 3) << 3)) & 0xff;
-+              break;
-+      case 2:
-+              *val = (data >> ((where & 2) << 3)) & 0xffff;
-+              break;
-+      case 4:
-+              *val = data;
-+              break;
-+      default:
-+              return PCIBIOS_FUNC_NOT_SUPPORTED;
-+      }
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+/* 
-+ * we'll do a read,
-+ * mask,write operation.
-+ * We'll allow an odd byte offset, though it should be illegal.
-+ */ 
-+static int alt_pci_write(struct pci_bus *bus, unsigned int devfn,
-+                          int where, int size, u32 val)
-+{
-+      int shift;
-+      u32 data;
-+
-+      if (pci_range_ck(bus, devfn))
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      // local_irq_save(flags);
-+      data = inl(PCICFG(bus, devfn, where));
-+      // local_irq_restore(flags);
-+
-+      switch (size) {
-+      case 1:
-+              shift = (where & 3) << 3;
-+              data &= ~(0xff << shift);
-+              data |= ((val & 0xff) << shift);
-+              break;
-+      case 2:
-+              shift = (where & 2) << 3;
-+              data &= ~(0xffff << shift);
-+              data |= ((val & 0xffff) << shift);
-+              break;
-+      case 4:
-+              data = val;
-+              break;
-+      default:
-+              return PCIBIOS_FUNC_NOT_SUPPORTED;
-+      }
-+
-+      outl(data, PCICFG(bus, devfn, where));
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+struct pci_ops alt_pci_ops = {
-+      .read           = alt_pci_read,
-+      .write          = alt_pci_write,
-+};
-+
-+static struct resource alt_io_resource = {
-+      .name   = "ALTPCI IO",
-+      .start  = ALT_PCI_IO_BASE,
-+      .end    = ALT_PCI_IO_BASE + ALT_PCI_IO_SIZE - 1,
-+      .flags  = IORESOURCE_IO
-+};
-+
-+static struct resource alt_mem_resource = {
-+      .name   = "ALTPCI mem",
-+      .start  = ALT_PCI_MEMORY_BASE,
-+      .end    = ALT_PCI_MEMORY_BASE + ALT_PCI_MEM_SIZE - 1,
-+      .flags  = IORESOURCE_MEM
-+};
-+
-+extern struct pci_ops alt_pci_ops;
-+
-+struct pci_channel board_pci_channels[] = {
-+      { &alt_pci_ops, &alt_io_resource, &alt_mem_resource, 0, 0xff },
-+      { NULL, NULL, NULL, 0, 0 },
-+};
-+
-+char *pcibios_setup(char *option)
-+{
-+      /* Nothing for us to handle. */
-+      return(option);
-+}
-+
-+void pcibios_fixup_bus(struct pci_bus *b)
-+{
-+}
-+
-+/* 
-+ *    IRQ functions 
-+ */
-+static u8 __init altpci_no_swizzle(struct pci_dev *dev, u8 *pin)
-+{
-+      /* no swizzling */
-+      return PCI_SLOT(dev->devfn);
-+}
-+
-+// FIX ME for your board, nios2 irqn mapping
-+int __init pcibios_map_platform_irq(u8 slot, u8 pin)
-+{
-+  int irq = na_irqn_0_irq + ((slot-1)*4) + (pin-1);
-+  // printk("map slot %d pin %d irq %d\n",slot,pin,irq);
-+  return irq;
-+}
-+
-+static int altpci_pci_lookup_irq(struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+      int irq = -1;
-+
-+      /* now lookup the actual IRQ on a platform specific basis (pci-'platform'.c) */
-+      irq = pcibios_map_platform_irq(slot,pin);
-+      if( irq < 0 ) {
-+        // printk("PCI: Error mapping IRQ on device %s\n", pci_name(dev));
-+        return irq;
-+      }
-+
-+      // printk("Setting IRQ for slot %s to %d\n", pci_name(dev), irq);
-+
-+      return irq;
-+}
-+
-+void __init pcibios_fixup_irqs(void)
-+{
-+      pci_fixup_irqs(altpci_no_swizzle, altpci_pci_lookup_irq);
-+}
-+
-diff --git a/arch/nios2nommu/drivers/pci/pci-auto.c b/arch/nios2nommu/drivers/pci/pci-auto.c
-new file mode 100644
-index 0000000..e1cdfdc
---- /dev/null
-+++ b/arch/nios2nommu/drivers/pci/pci-auto.c
-@@ -0,0 +1,559 @@
-+/*
-+ * PCI autoconfiguration library
-+ *
-+ * Author: Matt Porter <mporter@mvista.com>
-+ *
-+ * Copyright 2000, 2001 MontaVista Software Inc.
-+ * Copyright 2001 Bradley D. LaRonde <brad@ltc.com>
-+ * Copyright 2003 Paul Mundt <lethal@linux-sh.org>
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ */
-+
-+/*
-+ * Modified for MIPS by Jun Sun, jsun@mvista.com
-+ *
-+ * . Simplify the interface between pci_auto and the rest: a single function.
-+ * . Assign resources from low address to upper address.
-+ * . change most int to u32.
-+ *
-+ * Further modified to include it as mips generic code, ppopov@mvista.com.
-+ *
-+ * 2001-10-26  Bradley D. LaRonde <brad@ltc.com>
-+ * - Add a top_bus argument to the "early config" functions so that
-+ *   they can set a fake parent bus pointer to convince the underlying
-+ *   pci ops to use type 1 configuration for sub busses.
-+ * - Set bridge base and limit registers correctly.
-+ * - Align io and memory base properly before and after bridge setup.
-+ * - Don't fall through to pci_setup_bars for bridge.
-+ * - Reformat the debug output to look more like lspci's output.
-+ *
-+ * Cloned for SuperH by M. R. Brown, mrbrown@0xd6.org
-+ *
-+ * 2003-08-05  Paul Mundt <lethal@linux-sh.org>
-+ * - Don't update the BAR values on systems that already have valid addresses
-+ *   and don't want these updated for whatever reason, by way of a new config
-+ *   option check. However, we still read in the old BAR values so that they
-+ *   can still be reported through the debug output.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/pci.h>
-+
-+#undef        DEBUG
-+#define       DEBUG       // you can remove debug message here
-+
-+#ifdef        DEBUG
-+#define       DBG(x...)       printk(x)
-+#else
-+#define       DBG(x...)       
-+#endif
-+
-+/*
-+ * These functions are used early on before PCI scanning is done
-+ * and all of the pci_dev and pci_bus structures have been created.
-+ */
-+static struct pci_dev *fake_pci_dev(struct pci_channel *hose,
-+      int top_bus, int busnr, int devfn)
-+{
-+      static struct pci_dev dev;
-+      static struct pci_bus bus;
-+
-+      dev.bus = &bus;
-+      dev.sysdata = hose;
-+      dev.devfn = devfn;
-+      bus.number = busnr;
-+      bus.ops = hose->pci_ops;
-+
-+      if(busnr != top_bus)
-+              /* Fake a parent bus structure. */
-+              bus.parent = &bus;
-+      else
-+              bus.parent = NULL;
-+
-+      return &dev;
-+}
-+
-+#define EARLY_PCI_OP(rw, size, type)                                  \
-+int early_##rw##_config_##size(struct pci_channel *hose,              \
-+      int top_bus, int bus, int devfn, int offset, type value)        \
-+{                                                                     \
-+      return pci_##rw##_config_##size(                                \
-+              fake_pci_dev(hose, top_bus, bus, devfn),                \
-+              offset, value);                                         \
-+}
-+
-+EARLY_PCI_OP(read, byte, u8 *)
-+EARLY_PCI_OP(read, word, u16 *)
-+EARLY_PCI_OP(read, dword, u32 *)
-+EARLY_PCI_OP(write, byte, u8)
-+EARLY_PCI_OP(write, word, u16)
-+EARLY_PCI_OP(write, dword, u32)
-+
-+static struct resource *io_resource_inuse;
-+static struct resource *mem_resource_inuse;
-+
-+static u32 pciauto_lower_iospc;
-+static u32 pciauto_upper_iospc;
-+
-+static u32 pciauto_lower_memspc;
-+static u32 pciauto_upper_memspc;
-+
-+static void __init 
-+pciauto_setup_bars(struct pci_channel *hose,
-+                 int top_bus,
-+                 int current_bus,
-+                 int pci_devfn,
-+                 int bar_limit)
-+{
-+      u32 bar_response, bar_size, bar_value;
-+      u32 bar, addr_mask, bar_nr = 0;
-+      u32 * upper_limit;
-+      u32 * lower_limit;
-+      int found_mem64 = 0;
-+
-+      for (bar = PCI_BASE_ADDRESS_0; bar <= bar_limit; bar+=4) {
-+#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
-+              u32 bar_addr;
-+
-+              /* Read the old BAR value */
-+              early_read_config_dword(hose, top_bus,
-+                                      current_bus,
-+                                      pci_devfn,
-+                                      bar,
-+                                      &bar_addr);
-+#endif
-+
-+              /* Tickle the BAR and get the response */
-+              early_write_config_dword(hose, top_bus,
-+                                       current_bus,
-+                                       pci_devfn,
-+                                       bar,
-+                                       0xffffffff);
-+
-+              early_read_config_dword(hose, top_bus,
-+                                      current_bus,
-+                                      pci_devfn,
-+                                      bar,
-+                                      &bar_response);
-+
-+#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
-+              /* 
-+               * Write the old BAR value back out, only update the BAR
-+               * if we implicitly want resources to be updated, which
-+               * is done by the generic code further down. -- PFM.
-+               */
-+              early_write_config_dword(hose, top_bus,
-+                                       current_bus,
-+                                       pci_devfn,
-+                                       bar,
-+                                       bar_addr);
-+#endif
-+
-+              /* If BAR is not implemented go to the next BAR */
-+              if (!bar_response)
-+                      continue;
-+
-+              /*
-+               * Workaround for a BAR that doesn't use its upper word,
-+               * like the ALi 1535D+ PCI DC-97 Controller Modem (M5457).
-+               * bdl <brad@ltc.com>
-+               */
-+              if (!(bar_response & 0xffff0000))
-+                      bar_response |= 0xffff0000;
-+
-+retry:
-+              /* Check the BAR type and set our address mask */
-+              if (bar_response & PCI_BASE_ADDRESS_SPACE) {
-+                      addr_mask = PCI_BASE_ADDRESS_IO_MASK;
-+                      upper_limit = &pciauto_upper_iospc;
-+                      lower_limit = &pciauto_lower_iospc;
-+                      DBG("        I/O");
-+              } else {
-+                      if ((bar_response & PCI_BASE_ADDRESS_MEM_TYPE_MASK) ==
-+                          PCI_BASE_ADDRESS_MEM_TYPE_64)
-+                              found_mem64 = 1;
-+
-+                      addr_mask = PCI_BASE_ADDRESS_MEM_MASK;          
-+                      upper_limit = &pciauto_upper_memspc;
-+                      lower_limit = &pciauto_lower_memspc;
-+                      DBG("        Mem");
-+              }
-+
-+
-+              /* Calculate requested size */
-+              bar_size = ~(bar_response & addr_mask) + 1;
-+
-+              /* Allocate a base address */
-+              bar_value = ((*lower_limit - 1) & ~(bar_size - 1)) + bar_size;
-+
-+              if ((bar_value + bar_size) > *upper_limit) {
-+                      if (bar_response & PCI_BASE_ADDRESS_SPACE) {
-+                              if (io_resource_inuse->child) {
-+                                      io_resource_inuse = 
-+                                              io_resource_inuse->child;
-+                                      pciauto_lower_iospc = 
-+                                              io_resource_inuse->start;
-+                                      pciauto_upper_iospc = 
-+                                              io_resource_inuse->end + 1;
-+                                      goto retry;
-+                              }
-+
-+                      } else {
-+                              if (mem_resource_inuse->child) {
-+                                      mem_resource_inuse = 
-+                                              mem_resource_inuse->child;
-+                                      pciauto_lower_memspc = 
-+                                              mem_resource_inuse->start;
-+                                      pciauto_upper_memspc = 
-+                                              mem_resource_inuse->end + 1;
-+                                      goto retry;
-+                              }
-+                      }
-+                      DBG(" unavailable -- skipping, value %x size %x\n",
-+                                      bar_value, bar_size);
-+                      continue;
-+              }
-+
-+#if 1
-+              /* Write it out and update our limit */
-+              early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+                                       bar, bar_value);
-+#endif
-+
-+              *lower_limit = bar_value + bar_size;
-+
-+              /*
-+               * If we are a 64-bit decoder then increment to the
-+               * upper 32 bits of the bar and force it to locate
-+               * in the lower 4GB of memory.
-+               */ 
-+              if (found_mem64) {
-+                      bar += 4;
-+                      early_write_config_dword(hose, top_bus,
-+                                               current_bus,
-+                                               pci_devfn,
-+                                               bar,
-+                                               0x00000000);
-+              }
-+
-+              DBG(" at 0x%.8x [size=0x%x]\n", bar_value, bar_size);
-+
-+              bar_nr++;
-+      }
-+
-+}
-+
-+static void __init
-+pciauto_prescan_setup_bridge(struct pci_channel *hose,
-+                           int top_bus,
-+                           int current_bus,
-+                           int pci_devfn,
-+                           int sub_bus)
-+{
-+      /* Configure bus number registers */
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_PRIMARY_BUS, current_bus);
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_SECONDARY_BUS, sub_bus + 1);
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_SUBORDINATE_BUS, 0xff);
-+
-+      /* Align memory and I/O to 1MB and 4KB boundaries. */
-+      pciauto_lower_memspc = (pciauto_lower_memspc + (0x100000 - 1))
-+              & ~(0x100000 - 1);
-+      pciauto_lower_iospc = (pciauto_lower_iospc + (0x1000 - 1))
-+              & ~(0x1000 - 1);
-+
-+      /* Set base (lower limit) of address range behind bridge. */
-+      early_write_config_word(hose, top_bus, current_bus, pci_devfn,
-+              PCI_MEMORY_BASE, pciauto_lower_memspc >> 16);
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+              PCI_IO_BASE, (pciauto_lower_iospc & 0x0000f000) >> 8);
-+      early_write_config_word(hose, top_bus, current_bus, pci_devfn,
-+              PCI_IO_BASE_UPPER16, pciauto_lower_iospc >> 16);
-+
-+      /* We don't support prefetchable memory for now, so disable */
-+      early_write_config_word(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_PREF_MEMORY_BASE, 0);
-+      early_write_config_word(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_PREF_MEMORY_LIMIT, 0);
-+}
-+
-+static void __init
-+pciauto_postscan_setup_bridge(struct pci_channel *hose,
-+                            int top_bus,
-+                            int current_bus,
-+                            int pci_devfn,
-+                            int sub_bus)
-+{
-+      u32 temp;
-+
-+      /*
-+       * [jsun] we always bump up baselines a little, so that if there
-+       * nothing behind P2P bridge, we don't wind up overlapping IO/MEM
-+       * spaces.
-+       */
-+      pciauto_lower_memspc += 1;
-+      pciauto_lower_iospc += 1;
-+
-+      /* Configure bus number registers */
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_SUBORDINATE_BUS, sub_bus);
-+
-+      /* Set upper limit of address range behind bridge. */
-+      early_write_config_word(hose, top_bus, current_bus, pci_devfn,
-+              PCI_MEMORY_LIMIT, pciauto_lower_memspc >> 16);
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+              PCI_IO_LIMIT, (pciauto_lower_iospc & 0x0000f000) >> 8);
-+      early_write_config_word(hose, top_bus, current_bus, pci_devfn,
-+              PCI_IO_LIMIT_UPPER16, pciauto_lower_iospc >> 16);
-+
-+      /* Align memory and I/O to 1MB and 4KB boundaries. */
-+      pciauto_lower_memspc = (pciauto_lower_memspc + (0x100000 - 1))
-+              & ~(0x100000 - 1);
-+      pciauto_lower_iospc = (pciauto_lower_iospc + (0x1000 - 1))
-+              & ~(0x1000 - 1);
-+
-+      /* Enable memory and I/O accesses, enable bus master */
-+      early_read_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_COMMAND, &temp);
-+      early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_COMMAND, temp | PCI_COMMAND_IO | PCI_COMMAND_MEMORY
-+              | PCI_COMMAND_MASTER);
-+}
-+
-+static void __init
-+pciauto_prescan_setup_cardbus_bridge(struct pci_channel *hose,
-+                      int top_bus,
-+                      int current_bus,
-+                      int pci_devfn,
-+                      int sub_bus)
-+{
-+      /* Configure bus number registers */
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_PRIMARY_BUS, current_bus);
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_SECONDARY_BUS, sub_bus + 1);
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_SUBORDINATE_BUS, 0xff);
-+
-+      /* Align memory and I/O to 4KB and 4 byte boundaries. */
-+      pciauto_lower_memspc = (pciauto_lower_memspc + (0x1000 - 1))
-+              & ~(0x1000 - 1);
-+      pciauto_lower_iospc = (pciauto_lower_iospc + (0x4 - 1))
-+              & ~(0x4 - 1);
-+
-+      early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_CB_MEMORY_BASE_0, pciauto_lower_memspc);
-+      early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_CB_IO_BASE_0, pciauto_lower_iospc);
-+}
-+
-+static void __init
-+pciauto_postscan_setup_cardbus_bridge(struct pci_channel *hose,
-+                      int top_bus,
-+                      int current_bus,
-+                      int pci_devfn,
-+                      int sub_bus)
-+{
-+      u32 temp;
-+
-+#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
-+      /*
-+       * [jsun] we always bump up baselines a little, so that if there
-+       * nothing behind P2P bridge, we don't wind up overlapping IO/MEM
-+       * spaces.
-+       */
-+      pciauto_lower_memspc += 1;
-+      pciauto_lower_iospc += 1;
-+#endif
-+
-+      /*
-+       * Configure subordinate bus number.  The PCI subsystem
-+       * bus scan will renumber buses (reserving three additional
-+       * for this PCI<->CardBus bridge for the case where a CardBus
-+       * adapter contains a P2P or CB2CB bridge.
-+       */
-+
-+      early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                              PCI_SUBORDINATE_BUS, sub_bus);
-+
-+      /*
-+       * Reserve an additional 4MB for mem space and 16KB for
-+       * I/O space.  This should cover any additional space
-+       * requirement of unusual CardBus devices with
-+       * additional bridges that can consume more address space.
-+       *
-+       * Although pcmcia-cs currently will reprogram bridge
-+       * windows, the goal is to add an option to leave them
-+       * alone and use the bridge window ranges as the regions
-+       * that are searched for free resources upon hot-insertion
-+       * of a device.  This will allow a PCI<->CardBus bridge
-+       * configured by this routine to happily live behind a
-+       * P2P bridge in a system.
-+       */
-+#if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D)
-+      pciauto_lower_memspc += 0x00400000;
-+      pciauto_lower_iospc += 0x00004000;
-+#endif
-+
-+      /* Align memory and I/O to 4KB and 4 byte boundaries. */
-+      pciauto_lower_memspc = (pciauto_lower_memspc + (0x1000 - 1))
-+              & ~(0x1000 - 1);
-+      pciauto_lower_iospc = (pciauto_lower_iospc + (0x4 - 1))
-+              & ~(0x4 - 1);
-+      /* Set up memory and I/O filter limits, assume 32-bit I/O space */
-+      early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_CB_MEMORY_LIMIT_0, pciauto_lower_memspc - 1);
-+      early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_CB_IO_LIMIT_0, pciauto_lower_iospc - 1);
-+
-+      /* Enable memory and I/O accesses, enable bus master */
-+      early_read_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_COMMAND, &temp);
-+      early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+              PCI_COMMAND, temp | PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-+              PCI_COMMAND_MASTER);
-+}
-+
-+#define       PCIAUTO_IDE_MODE_MASK           0x05
-+
-+static int __init
-+pciauto_bus_scan(struct pci_channel *hose, int top_bus, int current_bus)
-+{
-+      int sub_bus;
-+      u32 pci_devfn, pci_class, cmdstat, found_multi=0;
-+      unsigned short vid, did;
-+      unsigned char header_type;
-+      int devfn_start = 0;
-+      int devfn_stop = 0xff;
-+
-+      sub_bus = current_bus;
-+      
-+      if (hose->first_devfn)
-+              devfn_start = hose->first_devfn;
-+      if (hose->last_devfn)
-+              devfn_stop = hose->last_devfn;
-+      
-+      for (pci_devfn=devfn_start; pci_devfn<devfn_stop; pci_devfn++) {
-+
-+              if (PCI_FUNC(pci_devfn) && !found_multi)
-+                      continue;
-+
-+              early_read_config_word(hose, top_bus, current_bus, pci_devfn,
-+                                     PCI_VENDOR_ID, &vid);
-+
-+              if (vid == 0xffff) continue;
-+
-+              early_read_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                                     PCI_HEADER_TYPE, &header_type);
-+
-+              if (!PCI_FUNC(pci_devfn))
-+                      found_multi = header_type & 0x80;
-+
-+              early_read_config_word(hose, top_bus, current_bus, pci_devfn,
-+                                     PCI_DEVICE_ID, &did);
-+
-+              early_read_config_dword(hose, top_bus, current_bus, pci_devfn,
-+                                      PCI_CLASS_REVISION, &pci_class);
-+
-+              if ((pci_class & 0xff000000)==0) continue;   // devices before pci 2.0
-+
-+              DBG("%.2x:%.2x.%x Class %.4x: %.4x:%.4x",
-+                      current_bus, PCI_SLOT(pci_devfn), PCI_FUNC(pci_devfn),
-+                      pci_class >> 16, vid, did);
-+              if (pci_class & 0xff)
-+                      DBG(" (rev %.2x)", pci_class & 0xff);
-+              DBG("\n");
-+
-+              if ((pci_class >> 16) == PCI_CLASS_BRIDGE_PCI) {
-+                      DBG("        Bridge: primary=%.2x, secondary=%.2x\n",
-+                              current_bus, sub_bus + 1);
-+#if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D)
-+                      pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_1);
-+#endif
-+                      pciauto_prescan_setup_bridge(hose, top_bus, current_bus,
-+                                                   pci_devfn, sub_bus);
-+                      DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n",
-+                              sub_bus + 1,
-+                              pciauto_lower_iospc, pciauto_lower_memspc);
-+                      sub_bus = pciauto_bus_scan(hose, top_bus, sub_bus+1);
-+                      DBG("Back to bus %.2x\n", current_bus);
-+                      pciauto_postscan_setup_bridge(hose, top_bus, current_bus,
-+                                                      pci_devfn, sub_bus);
-+                      continue;
-+              } else if ((pci_class >> 16) == PCI_CLASS_BRIDGE_CARDBUS) {
-+                      DBG("  CARDBUS  Bridge: primary=%.2x, secondary=%.2x\n",
-+                              current_bus, sub_bus + 1);
-+                      DBG("PCI Autoconfig: Found CardBus bridge, device %d function %d\n", PCI_SLOT(pci_devfn), PCI_FUNC(pci_devfn));
-+                      /* Place CardBus Socket/ExCA registers */
-+                      pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_0);
-+ 
-+                      pciauto_prescan_setup_cardbus_bridge(hose, top_bus,
-+                                      current_bus, pci_devfn, sub_bus);
-+ 
-+                      DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n",
-+                              sub_bus + 1,
-+                              pciauto_lower_iospc, pciauto_lower_memspc);
-+                      sub_bus = pciauto_bus_scan(hose, top_bus, sub_bus+1);
-+                      DBG("Back to bus %.2x, sub_bus is %x\n", current_bus, sub_bus);
-+                      pciauto_postscan_setup_cardbus_bridge(hose, top_bus,
-+                                      current_bus, pci_devfn, sub_bus);
-+                      continue;
-+              } else if ((pci_class >> 16) == PCI_CLASS_STORAGE_IDE) {
-+
-+                      unsigned char prg_iface;
-+
-+                      early_read_config_byte(hose, top_bus, current_bus,
-+                              pci_devfn, PCI_CLASS_PROG, &prg_iface);
-+                      if (!(prg_iface & PCIAUTO_IDE_MODE_MASK)) {
-+                              DBG("Skipping legacy mode IDE controller\n");
-+                              continue;
-+                      }
-+              }
-+
-+              /*
-+               * Found a peripheral, enable some standard
-+               * settings
-+               */
-+              early_read_config_dword(hose, top_bus, current_bus, pci_devfn,
-+                                      PCI_COMMAND, &cmdstat);
-+              early_write_config_dword(hose, top_bus, current_bus, pci_devfn,
-+                                       PCI_COMMAND, cmdstat | PCI_COMMAND_IO |
-+                                       PCI_COMMAND_MEMORY |
-+                                       PCI_COMMAND_MASTER);
-+#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
-+              early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
-+                                      PCI_LATENCY_TIMER, 0x80);
-+#endif
-+
-+              /* Allocate PCI I/O and/or memory space */
-+              pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_5);
-+      }
-+      return sub_bus;
-+}
-+
-+int __init
-+pciauto_assign_resources(int busno, struct pci_channel *hose)
-+{
-+      /* setup resource limits */
-+      io_resource_inuse = hose->io_resource;
-+      mem_resource_inuse = hose->mem_resource;
-+
-+      pciauto_lower_iospc = io_resource_inuse->start;
-+      pciauto_upper_iospc = io_resource_inuse->end + 1;
-+      pciauto_lower_memspc = mem_resource_inuse->start;
-+      pciauto_upper_memspc = mem_resource_inuse->end + 1;
-+      DBG("Autoconfig PCI channel 0x%p\n", hose);
-+      DBG("Scanning bus %.2x, I/O 0x%.8x:0x%.8x, Mem 0x%.8x:0x%.8x\n",
-+              busno, pciauto_lower_iospc, pciauto_upper_iospc, 
-+              pciauto_lower_memspc, pciauto_upper_memspc);
-+
-+      return pciauto_bus_scan(hose, busno, busno);
-+}
-diff --git a/arch/nios2nommu/drivers/pci/pci.c b/arch/nios2nommu/drivers/pci/pci.c
-new file mode 100644
-index 0000000..83436df
---- /dev/null
-+++ b/arch/nios2nommu/drivers/pci/pci.c
-@@ -0,0 +1,151 @@
-+/* arch/sh/kernel/pci.c
-+ * $Id: pci.c,v 1.2 2007/01/25 01:26:48 gerg Exp $
-+ *
-+ * Copyright (c) 2002 M. R. Brown  <mrbrown@linux-sh.org>
-+ * 
-+ * 
-+ * These functions are collected here to reduce duplication of common
-+ * code amongst the many platform-specific PCI support code files.
-+ * 
-+ * These routines require the following board-specific routines:
-+ * void pcibios_fixup_irqs();
-+ *
-+ * See include/asm-sh/pci.h for more information.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+
-+static int __init pcibios_init(void)
-+{
-+      struct pci_channel *p;
-+      struct pci_bus *bus;
-+      int busno;
-+
-+#if 1
-+      /* assign resources */
-+      busno = 0;
-+      for (p = board_pci_channels; p->pci_ops != NULL; p++) {
-+              busno = pciauto_assign_resources(busno, p) + 1;
-+      }
-+#endif
-+
-+      /* scan the buses */
-+      busno = 0;
-+      for (p= board_pci_channels; p->pci_ops != NULL; p++) {
-+              bus = pci_scan_bus(busno, p->pci_ops, p);
-+              busno = bus->subordinate+1;
-+      }
-+
-+      /* board-specific fixups */
-+      pcibios_fixup_irqs();
-+
-+      return 0;
-+}
-+
-+subsys_initcall(pcibios_init);
-+
-+void
-+pcibios_update_resource(struct pci_dev *dev, struct resource *root,
-+                      struct resource *res, int resource)
-+{
-+      u32 new, check;
-+      int reg;
-+
-+      new = res->start | (res->flags & PCI_REGION_FLAG_MASK);
-+      if (resource < 6) {
-+              reg = PCI_BASE_ADDRESS_0 + 4*resource;
-+      } else if (resource == PCI_ROM_RESOURCE) {
-+              res->flags |= IORESOURCE_ROM_ENABLE;
-+              new |= PCI_ROM_ADDRESS_ENABLE;
-+              reg = dev->rom_base_reg;
-+      } else {
-+              /* Somebody might have asked allocation of a non-standard resource */
-+              return;
-+      }
-+      
-+      pci_write_config_dword(dev, reg, new);
-+      pci_read_config_dword(dev, reg, &check);
-+      if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) {
-+              printk(KERN_ERR "PCI: Error while updating region "
-+                     "%s/%d (%08x != %08x)\n", pci_name(dev), resource,
-+                     new, check);
-+      }
-+}
-+
-+/*
-+ * We need to avoid collisions with `mirrored' VGA ports
-+ * and other strange ISA hardware, so we always want the
-+ * addresses to be allocated in the 0x000-0x0ff region
-+ * modulo 0x400.
-+ */
-+void pcibios_align_resource(void *data, struct resource *res,
-+                          resource_size_t size, resource_size_t align)
-+{
-+      if (res->flags & IORESOURCE_IO) {
-+              unsigned long start = res->start;
-+
-+              if (start & 0x300) {
-+                      start = (start + 0x3ff) & ~0x3ff;
-+                      res->start = start;
-+              }
-+      }
-+}
-+
-+int pcibios_enable_device(struct pci_dev *dev, int mask)
-+{
-+      u16 cmd, old_cmd;
-+      int idx;
-+      struct resource *r;
-+
-+      pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+      old_cmd = cmd;
-+      for(idx=0; idx<6; idx++) {
-+              if (!(mask & (1 << idx)))
-+                      continue;
-+              r = &dev->resource[idx];
-+              if (!r->start && r->end) {
-+                      printk(KERN_ERR "PCI: Device %s not available because "
-+                             "of resource collisions\n", pci_name(dev));
-+                      return -EINVAL;
-+              }
-+              if (r->flags & IORESOURCE_IO)
-+                      cmd |= PCI_COMMAND_IO;
-+              if (r->flags & IORESOURCE_MEM)
-+                      cmd |= PCI_COMMAND_MEMORY;
-+      }
-+      if (dev->resource[PCI_ROM_RESOURCE].start)
-+              cmd |= PCI_COMMAND_MEMORY;
-+      if (cmd != old_cmd) {
-+              printk(KERN_INFO "PCI: Enabling device %s (%04x -> %04x)\n",
-+                     pci_name(dev), old_cmd, cmd);
-+              pci_write_config_word(dev, PCI_COMMAND, cmd);
-+      }
-+      return 0;
-+}
-+
-+/*
-+ *  If we set up a device for bus mastering, we need to check and set
-+ *  the latency timer as it may not be properly set.
-+ */
-+unsigned int pcibios_max_latency = 255;
-+
-+void pcibios_set_master(struct pci_dev *dev)
-+{
-+      u8 lat;
-+      pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
-+      if (lat < 16)
-+              lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency;
-+      else if (lat > pcibios_max_latency)
-+              lat = pcibios_max_latency;
-+      else
-+              return;
-+      printk(KERN_INFO "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat);
-+      pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
-+}
-+
-+void __init pcibios_update_irq(struct pci_dev *dev, int irq)
-+{
-+      pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
-+}
-diff --git a/arch/nios2nommu/drivers/pci/setup-irq.c b/arch/nios2nommu/drivers/pci/setup-irq.c
-new file mode 100644
-index 0000000..0fa8f98
---- /dev/null
-+++ b/arch/nios2nommu/drivers/pci/setup-irq.c
-@@ -0,0 +1 @@
-+#include "../../../../drivers/pci/setup-irq.c"
-diff --git a/arch/nios2nommu/drivers/spi.c b/arch/nios2nommu/drivers/spi.c
-new file mode 100644
-index 0000000..72a2519
---- /dev/null
-+++ b/arch/nios2nommu/drivers/spi.c
-@@ -0,0 +1,315 @@
-+#ifdef MODULE
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#else
-+#define MOD_INC_USE_COUNT
-+#define MOD_DEC_USE_COUNT
-+#endif
-+
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/major.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/ioport.h>
-+#include <linux/fcntl.h>
-+#include <linux/unistd.h>
-+#include <linux/init.h>
-+
-+
-+#include <asm/io.h>
-+#include <asm/segment.h>
-+#include <asm/system.h>
-+#include <asm/spi.h> 
-+
-+#if !defined(SEEK_SET)
-+#define SEEK_SET 0
-+#endif
-+
-+
-+static unsigned int   spi_major = 60; /* a local major, can be overwritten */
-+static          int   openflag  =  0;
-+static np_spi * const spi_ptr   = na_spi;
-+
-+                    /*******************************/
-+                    /* SPI data transfer routines. */
-+                    /*******************************/
-+
-+#define SPI_XMIT_READY np_spistatus_trdy_mask
-+#define SPI_RECV_READY np_spistatus_rrdy_mask
-+
-+#define SPI_BUSYPOLL_TIMEOUT 1000
-+
-+// returns -1 if there is no data present, otherwise returns
-+// the value
-+inline int SPI_Recv_Byte(char *pdata )
-+{
-+      if (spi_ptr->np_spistatus & SPI_RECV_READY){
-+              *pdata = spi_ptr->np_spirxdata & 0xff;
-+              return 0;
-+      }
-+      return  -1;
-+}
-+
-+
-+// Sends the 16 bit address+data
-+inline int SPI_Send_Byte( unsigned char address, char data )
-+{
-+      u16 value = ((address & 0xFF) << 8) | (data & 0xFF);
-+
-+      if ( spi_ptr->np_spistatus & SPI_XMIT_READY ) {
-+              spi_ptr->np_spitxdata = value;
-+              return 0;
-+      }
-+      
-+      return -1;
-+}
-+
-+
-+
-+                    /*************************/
-+                    /* SPI Driver functions. */
-+                    /*************************/
-+
-+int spi_reset( void )
-+{
-+  // Nothing to do: The Nios does _not_
-+  // support burst xfers. Chip Enables
-+  // (Selects) are inactive after each xfer.
-+  return 0;
-+}
-+
-+
-+/***************************************************/
-+/* The SPI Write routine. The first 16 bits are     */
-+/* the device register, and the rest of the buffer */
-+/* is data.                                        */
-+/***************************************************/
-+
-+ssize_t spi_write(struct file *filp, const char *buf, size_t count, loff_t *ppos)
-+{
-+  int            i;
-+  unsigned char addr;
-+  int timeout;
-+  char temp;
-+  
-+  if ( count < 3 )
-+    return -EINVAL;                  /* Address is 2 bytes: Must have _something_ to send */
-+
-+  addr = buf[0];          /* chip register address.  */
-+  spi_ptr->np_spistatus=0;
-+
-+  for ( i = sizeof(u16); i<count; i++ ) 
-+  {
-+      timeout=SPI_BUSYPOLL_TIMEOUT;
-+      while (SPI_Send_Byte(addr, buf[i])==-1) 
-+      {
-+              if (--timeout==0) 
-+              {
-+                printk("spi_write time out\n");
-+                return i; /* return the number of bytes sent */
-+              }
-+      }
-+      /* read the data */
-+      timeout=SPI_BUSYPOLL_TIMEOUT;
-+      while (SPI_Recv_Byte(&temp)==-1) 
-+      {
-+              if (--timeout==0) 
-+                break; 
-+      }
-+  }
-+  return i; 
-+//  unsigned char *temp;                 /* Our pointer to the buffer */
-+//  int            i;
-+//  int            addr;
-+//  
-+//  if ( count < 3 )
-+//    return -EINVAL;                        /* Address is 2 bytes: Must have _something_ to send */
-+//
-+//  temp = (char *)buf;
-+//  addr = (int)*((u16 *)temp);          /* chip register address.  */
-+//  temp += sizeof(u16);
-+//
-+//  for ( i = count - sizeof(u16); i; i--, temp++ )
-+//      *temp = (unsigned char)SPI_Transfer( addr, (int)*temp );
-+//    
-+//  
-+//  return count;                        /* we can always send all data */
-+}
-+
-+//int spi_read( struct inode *inode, struct file *file, char *buf, int count )
-+ssize_t spi_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
-+{
-+  int            i;
-+  unsigned char addr;
-+  int timeout;
-+  char temp;
-+  
-+  if ( count < 3 )
-+    return -EINVAL;                  /* Address is 2 bytes: Must have _something_ to send */
-+
-+  addr = buf[0];          /* chip register address.  */
-+  spi_ptr->np_spistatus=0;
-+  
-+  /* empty the np_spirxdata register */
-+  SPI_Recv_Byte(&temp);
-+  
-+  for ( i = sizeof(u16); i<count; i++ ) 
-+  {
-+      /* send the address */
-+      timeout=SPI_BUSYPOLL_TIMEOUT;
-+      while (SPI_Send_Byte(addr, 0)==-1) 
-+      {
-+              if (--timeout==0) 
-+              {
-+                printk("spi_read write address time out\n");
-+                return i; 
-+              }
-+      }
-+      
-+      /* read the data */
-+      timeout=SPI_BUSYPOLL_TIMEOUT;
-+      while (SPI_Recv_Byte(&buf[i])==-1) 
-+      {
-+              if (--timeout==0) 
-+              {
-+                printk("spi_read read data time out\n");
-+                return i; 
-+              }
-+      }
-+#if 0
-+      printk("spi_read time left %d\n", timeout);
-+#endif
-+  }
-+  return i;
-+}
-+
-+loff_t spi_lseek(struct file *filp, loff_t offset, int origin)
-+{
-+#if 0
-+  int     bit_count, i;
-+#endif
-+
-+  if ( origin != SEEK_SET || offset != (offset & 0xFFFF) )
-+  {
-+      errno = -EINVAL;
-+      return -1;
-+  }
-+
-+#if 0
-+  /****************************************/
-+  /* Nios SPI implementation safeguard:   */
-+  /* It is possible to have more than     */
-+  /* one CS active at a time. Check that  */
-+  /* the given address is a power of two. */
-+  /****************************************/
-+  bit_count = 0;
-+  for ( i = 0; i < sizeof(u16); i++ )
-+  {
-+      if ( (1 << i) & offset )
-+      {
-+        if ( ++bit_count > 1 )
-+        {
-+            errno = -EINVAL;
-+            return -1;
-+        }
-+      }
-+  }
-+#endif
-+  spi_ptr->np_spislaveselect = offset;
-+  return 0;
-+}
-+
-+int spi_open(struct inode *inode, struct file *filp)
-+{
-+  preempt_disable();
-+  if (openflag) {
-+      preempt_enable();
-+      return -EBUSY;
-+      }
-+
-+  MOD_INC_USE_COUNT;
-+  openflag = 1;
-+  preempt_enable();
-+
-+  return 0;
-+} 
-+
-+int spi_release(struct inode *inode, struct file *filp)
-+{
-+  openflag = 0;
-+  MOD_DEC_USE_COUNT;
-+      return 0;
-+}
-+
-+
-+/* static struct file_operations spi_fops  */
-+
-+static struct file_operations spi_fops = {
-+      llseek:         spi_lseek,     /* Set chip-select line. The offset is used as an address. */
-+      read:           spi_read,
-+      write:          spi_write,
-+      open:           spi_open, 
-+      release:        spi_release,
-+};
-+
-+
-+int register_NIOS_SPI( void )
-+{
-+  int result = register_chrdev( spi_major, "spi", &spi_fops );
-+  if ( result < 0 )
-+  {
-+    printk( "SPI: unable to get major %d for SPI bus \n", spi_major );
-+    return result;
-+  }/*end-if*/
-+  
-+  if ( spi_major == 0 )
-+    spi_major = result; /* here we got our major dynamically */
-+
-+  /* reserve our port, but check first if free */
-+  if ( check_region( (unsigned int)na_spi, sizeof(np_spi) ) )
-+  {
-+    printk( "SPI: port at adr 0x%08x already occupied\n", (unsigned int)na_spi );
-+    unregister_chrdev( spi_major, "spi" );
-+
-+    return result;
-+  }/*end-if*/
-+
-+  return 0;
-+}
-+
-+void unregister_NIOS_SPI( void )
-+{
-+    if ( spi_major > 0 )
-+      unregister_chrdev( spi_major, "spi" );
-+
-+    release_region( (unsigned int)na_spi, sizeof(np_spi) );
-+}
-+
-+
-+#ifdef MODULE
-+void cleanup_module( void )
-+{
-+  unregister_NIOS_SPI();
-+}
-+
-+
-+
-+int init_module( void )
-+{
-+  return register_NIOS_SPI();
-+}
-+#endif
-+
-+
-+static int __init nios_spi_init(void)
-+{
-+      printk("SPI: Nios SPI bus device version 0.1\n");
-+      return register_NIOS_SPI();
-+//    if ( register_NIOS_SPI() )
-+//            printk("*** Cannot initialize SPI device.\n");
-+}
-+
-+__initcall(nios_spi_init);
-diff --git a/arch/nios2nommu/kernel/ChangeLog b/arch/nios2nommu/kernel/ChangeLog
-new file mode 100644
-index 0000000..7f1449d
---- /dev/null
-+++ b/arch/nios2nommu/kernel/ChangeLog
-@@ -0,0 +1,27 @@
-+2004-06-17  Ken Hill  <khill@microtronix.com>
-+
-+      * process.c (machine_restart): Add code to disable interrups and
-+      jump to the cpu reset address.
-+      (machine_halt): Add code to disable interrupts and spinlock.
-+      (machine_power_off): Add code to disable interrupts and spinlock.
-+
-+2004-06-16  Ken Hill  <khill@microtronix.com>
-+
-+      * nios2_ksyms.c: Remove hard_reset_now.
-+
-+2004-06-10  Ken Hill  <khill@microtronix.com>
-+
-+      * nios2_ksyms.c: Add EXPORT_SYMBOL_NOVERS(__down) to solve insmod for 
-+      some modules.
-+
-+2004-06-02  Ken Hill  <khill@microtronix.com>
-+
-+      * entry.S (software_exception): Add a safety catch for old applications that may
-+      have been linked against an older library. This does not add any overhead to
-+      system call processing.
-+
-+2004-04-15  Ken Hill  <khill@microtronix.com>
-+
-+      * setup.c (setup_arch): Remove ROMFS message from debug printk kernel message.
-+      Add copyright and GNU license notice.
-+
-diff --git a/arch/nios2nommu/kernel/Makefile b/arch/nios2nommu/kernel/Makefile
-new file mode 100644
-index 0000000..a056ff1
---- /dev/null
-+++ b/arch/nios2nommu/kernel/Makefile
-@@ -0,0 +1,22 @@
-+#
-+# Makefile for the linux kernel.
-+#
-+# Note! Dependencies are done automagically by 'make dep', which also
-+# removes any old dependencies. DON'T put your own dependencies here
-+# unless it's something special (ie not a .c file).
-+#
-+# Note 2! The CFLAGS definitions are now in the main makefile...
-+
-+extra-y := head.o init_task.o vmlinux.lds
-+
-+obj-y   := entry.o traps.o irq.o syscalltable.o \
-+          process.o signal.o setup.o sys_nios2.o \
-+          semaphore.o io.o usb.o\
-+          time.o ptrace.o start.o nios2_ksyms.o
-+
-+obj-$(CONFIG_MODULES) += module.o
-+obj-$(CONFIG_CONSOLE) += console.o
-+obj-$(CONFIG_PIO_DEVICES) += pio.o
-+obj-$(CONFIG_AVALON_DMA) += dma.o
-+
-+
-diff --git a/arch/nios2nommu/kernel/asm-offsets.c b/arch/nios2nommu/kernel/asm-offsets.c
-new file mode 100644
-index 0000000..4877eba
---- /dev/null
-+++ b/arch/nios2nommu/kernel/asm-offsets.c
-@@ -0,0 +1,201 @@
-+/*
-+ * This program is used to generate definitions needed by
-+ * assembly language modules.
-+ *
-+ * We use the technique used in the OSF Mach kernel code:
-+ * generate asm statements containing #defines,
-+ * compile this file to assembler, and then extract the
-+ * #defines from the assembly-language output.
-+ */
-+
-+#include <linux/stddef.h>
-+#include <linux/sched.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/ptrace.h>
-+#include <asm/bootinfo.h>
-+#include <asm/irq.h>
-+#include <asm/hardirq.h>
-+#include <asm/nios.h>
-+
-+#define DEFINE(sym, val) \
-+        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-+
-+#define BLANK() asm volatile("\n->" : : )
-+
-+int main(void)
-+{
-+
-+      /* offsets into the task struct */
-+      DEFINE(TASK_STATE, offsetof(struct task_struct, state));
-+      DEFINE(TASK_FLAGS, offsetof(struct task_struct, flags));
-+      DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace));
-+      DEFINE(TASK_BLOCKED, offsetof(struct task_struct, blocked));
-+      DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
-+      DEFINE(TASK_THREAD_INFO, offsetof(struct task_struct, stack));
-+      DEFINE(TASK_MM, offsetof(struct task_struct, mm));
-+      DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
-+
-+      /* offsets into the kernel_stat struct */
-+      DEFINE(STAT_IRQ, offsetof(struct kernel_stat, irqs));
-+
-+      /* offsets into the irq_cpustat_t struct */
-+      DEFINE(CPUSTAT_SOFTIRQ_PENDING, offsetof(irq_cpustat_t, __softirq_pending));
-+
-+      /* offsets into the irq_node struct */
-+      DEFINE(IRQ_HANDLER, offsetof(struct irq_hand, handler));
-+      DEFINE(IRQ_FLAGS, offsetof(struct irq_hand, flags));
-+      DEFINE(IRQ_DEV_ID, offsetof(struct irq_hand, dev_id));
-+      DEFINE(IRQ_DEVNAME, offsetof(struct irq_hand, devname));
-+
-+      /* offsets into the thread struct */
-+      DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
-+      DEFINE(THREAD_KPSR, offsetof(struct thread_struct, kpsr));
-+      DEFINE(THREAD_KESR, offsetof(struct thread_struct, kesr));
-+      DEFINE(THREAD_FLAGS, offsetof(struct thread_struct, flags));
-+
-+      /* offsets into the pt_regs */
-+      DEFINE(PT_ORIG_R2, offsetof(struct pt_regs, orig_r2));
-+      DEFINE(PT_R1, offsetof(struct pt_regs, r1));
-+      DEFINE(PT_R2, offsetof(struct pt_regs, r2));
-+      DEFINE(PT_R3, offsetof(struct pt_regs, r3));
-+      DEFINE(PT_R4, offsetof(struct pt_regs, r4));
-+      DEFINE(PT_R5, offsetof(struct pt_regs, r5));
-+      DEFINE(PT_R6, offsetof(struct pt_regs, r6));
-+      DEFINE(PT_R7, offsetof(struct pt_regs, r7));
-+      DEFINE(PT_R8, offsetof(struct pt_regs, r8));
-+      DEFINE(PT_R9, offsetof(struct pt_regs, r9));
-+      DEFINE(PT_R10, offsetof(struct pt_regs, r10));
-+      DEFINE(PT_R11, offsetof(struct pt_regs, r11));
-+      DEFINE(PT_R12, offsetof(struct pt_regs, r12));
-+      DEFINE(PT_R13, offsetof(struct pt_regs, r13));
-+      DEFINE(PT_R14, offsetof(struct pt_regs, r14));
-+      DEFINE(PT_R15, offsetof(struct pt_regs, r15));
-+      DEFINE(PT_EA, offsetof(struct pt_regs, ea));
-+      DEFINE(PT_RA, offsetof(struct pt_regs, ra));
-+      DEFINE(PT_FP, offsetof(struct pt_regs, fp));
-+      DEFINE(PT_SP, offsetof(struct pt_regs, sp));
-+      DEFINE(PT_GP, offsetof(struct pt_regs, gp));
-+      DEFINE(PT_ESTATUS, offsetof(struct pt_regs, estatus));
-+      DEFINE(PT_STATUS_EXTENSION, offsetof(struct pt_regs, status_extension));
-+      DEFINE(PT_REGS_SIZE, sizeof(struct pt_regs));
-+
-+      /* offsets into the switch_stack */
-+      DEFINE(SW_R16, offsetof(struct switch_stack, r16));
-+      DEFINE(SW_R17, offsetof(struct switch_stack, r17));
-+      DEFINE(SW_R18, offsetof(struct switch_stack, r18));
-+      DEFINE(SW_R19, offsetof(struct switch_stack, r19));
-+      DEFINE(SW_R20, offsetof(struct switch_stack, r20));
-+      DEFINE(SW_R21, offsetof(struct switch_stack, r21));
-+      DEFINE(SW_R22, offsetof(struct switch_stack, r22));
-+      DEFINE(SW_R23, offsetof(struct switch_stack, r23));
-+      DEFINE(SW_FP, offsetof(struct switch_stack, fp));
-+      DEFINE(SW_GP, offsetof(struct switch_stack, gp));
-+      DEFINE(SW_RA, offsetof(struct switch_stack, ra));
-+      DEFINE(SWITCH_STACK_SIZE, sizeof(struct switch_stack));
-+
-+      DEFINE(PS_S_ASM, PS_S);
-+
-+      DEFINE(NIOS2_STATUS_PIE_MSK_ASM, NIOS2_STATUS_PIE_MSK);  
-+      DEFINE(NIOS2_STATUS_PIE_OFST_ASM, NIOS2_STATUS_PIE_OFST); 
-+      DEFINE(NIOS2_STATUS_U_MSK_ASM, NIOS2_STATUS_U_MSK);    
-+      DEFINE(NIOS2_STATUS_U_OFST_ASM, NIOS2_STATUS_U_OFST);   
-+
-+      /* offsets into the kernel_stat struct */
-+      DEFINE(STAT_IRQ, offsetof(struct kernel_stat, irqs));
-+
-+      /* Offsets in thread_info structure, used in assembly code */
-+      DEFINE(TI_TASK, offsetof(struct thread_info, task));
-+      DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
-+      DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
-+      DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
-+      DEFINE(TI_PREEMPT_COUNT, offsetof(struct thread_info, preempt_count));
-+
-+      DEFINE(PREEMPT_ACTIVE_ASM, PREEMPT_ACTIVE);
-+
-+      DEFINE(THREAD_SIZE_ASM, THREAD_SIZE);
-+
-+      DEFINE(TIF_SYSCALL_TRACE_ASM, TIF_SYSCALL_TRACE);
-+      DEFINE(TIF_NOTIFY_RESUME_ASM, TIF_NOTIFY_RESUME);
-+      DEFINE(TIF_SIGPENDING_ASM, TIF_SIGPENDING);
-+      DEFINE(TIF_NEED_RESCHED_ASM, TIF_NEED_RESCHED);
-+      DEFINE(TIF_POLLING_NRFLAG_ASM, TIF_POLLING_NRFLAG);
-+
-+      DEFINE(_TIF_SYSCALL_TRACE_ASM, _TIF_SYSCALL_TRACE);
-+      DEFINE(_TIF_NOTIFY_RESUME_ASM, _TIF_NOTIFY_RESUME);
-+      DEFINE(_TIF_SIGPENDING_ASM, _TIF_SIGPENDING);
-+      DEFINE(_TIF_NEED_RESCHED_ASM, _TIF_NEED_RESCHED);
-+      DEFINE(_TIF_POLLING_NRFLAG_ASM, _TIF_POLLING_NRFLAG);
-+
-+      DEFINE(_TIF_WORK_MASK_ASM, _TIF_WORK_MASK);
-+
-+#if defined(na_flash_kernel) && defined(na_flash_kernel_end)
-+      /* the flash chip */
-+      DEFINE(NIOS_FLASH_START, na_flash_kernel);
-+      DEFINE(NIOS_FLASH_END, na_flash_kernel_end);
-+      
-+      /* the kernel placement in the flash*/
-+      DEFINE(KERNEL_FLASH_START, na_flash_kernel);
-+      DEFINE(KERNEL_FLASH_LEN, 0x200000);
-+      
-+      /* the romdisk placement in the flash */
-+      DEFINE(LINUX_ROMFS_START, na_flash_kernel+0x200000);
-+      DEFINE(LINUX_ROMFS_END, na_flash_kernel_end);
-+#else
-+#error Sorry,you dont have na_flash_kernel or na_flash_kernel_end defined in the core.
-+#endif
-+      
-+#if defined(nasys_program_mem) && defined(nasys_program_mem_end)
-+      /* the sdram */
-+      DEFINE(LINUX_SDRAM_START, nasys_program_mem);
-+      DEFINE(LINUX_SDRAM_END, nasys_program_mem_end);
-+#else
-+#error Sorry,you dont have nasys_program_mem or nasys_program_mem_end defined in the core.
-+#endif        
-+
-+      DEFINE(NIOS2_ICACHE_SIZE, nasys_icache_size);
-+      DEFINE(NIOS2_ICACHE_LINE_SIZE, nasys_icache_line_size);
-+      DEFINE(NIOS2_DCACHE_SIZE, nasys_dcache_size);
-+      DEFINE(NIOS2_DCACHE_LINE_SIZE, nasys_dcache_line_size);
-+      
-+#if defined(na_enet)
-+      DEFINE(NA_ENET_ASM, na_enet);
-+#endif        
-+
-+#if defined(na_enet_reset)
-+      DEFINE(NA_ENET_RESET_ASM, na_enet_reset);
-+#endif        
-+
-+#if defined(na_enet_reset_n)
-+      DEFINE(NA_ENET_RESET_N_ASM, na_enet_reset_n);
-+#endif        
-+
-+#if defined(na_ide_interface)
-+      DEFINE(NA_IDE_INTERFACE_ASM, na_ide_interface);
-+#endif        
-+
-+#if defined(na_timer0)
-+      DEFINE(NA_TIMER0_ASM, na_timer0);
-+      DEFINE(NP_TIMERCONTROL_ASM, offsetof(np_timer, np_timercontrol));
-+      DEFINE(NP_TIMERSTATUS_ASM,  offsetof(np_timer, np_timerstatus));
-+#endif        
-+
-+#if defined(na_uart0)
-+      DEFINE(NA_UART0_ASM, na_uart0);
-+      DEFINE(NP_UARTCONTROL_ASM,  offsetof(np_uart,  np_uartcontrol));
-+      DEFINE(NP_UARTSTATUS_ASM,   offsetof(np_uart,  np_uartstatus));
-+#endif        
-+
-+#if defined(na_uart1)
-+      DEFINE(NA_UART1_ASM, na_uart1);
-+#endif        
-+
-+#if defined(na_uart2)
-+      DEFINE(NA_UART2_ASM, na_uart2);
-+#endif        
-+
-+#if defined(na_uart3)
-+      DEFINE(NA_UART3_ASM, na_uart3);
-+#endif        
-+
-+      return 0;
-+}
-diff --git a/arch/nios2nommu/kernel/dma.c b/arch/nios2nommu/kernel/dma.c
-new file mode 100644
-index 0000000..f23323b
---- /dev/null
-+++ b/arch/nios2nommu/kernel/dma.c
-@@ -0,0 +1,342 @@
-+/*
-+ * arch/nios2nommu/kernel/dma.c
-+ *
-+ * Copyright (C) 2005 Microtronix Datacom Ltd
-+ *
-+ * PC like DMA API for Nios's DMAC.
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Written by Wentao Xu <wentao@microtronix.com>
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/irq.h>
-+#include <linux/interrupt.h>
-+#include <linux/module.h>
-+#include <linux/fs.h>
-+#include <linux/seq_file.h>
-+#include <linux/proc_fs.h>
-+#include <asm/io.h>
-+#include <asm/dma.h>
-+
-+/* nios2 dma controller register map */
-+#define REG_DMA_STATUS                0
-+#define REG_DMA_READADDR      4
-+#define REG_DMA_WRITEADDR     8
-+#define REG_DMA_LENGTH                12
-+#define       REG_DMA_CONTROL         24
-+
-+/* status register bits definition */
-+#define ST_DONE                       0x01
-+#define ST_BUSY                       0x02
-+#define ST_REOP                       0x04
-+#define ST_WROP                       0x08
-+#define ST_LEN                        0x10
-+
-+/* control register bits definition */
-+#define CT_BYTE                       0x01
-+#define CT_HW                 0x02
-+#define CT_WORD                       0x04
-+#define CT_GO                 0x08
-+#define CT_IEEN                       0x10
-+#define CT_REEN                       0x20
-+#define CT_WEEN                       0x40
-+#define CT_LEEN                       0x80
-+#define CT_RCON                       0x100
-+#define CT_WCON                       0x200
-+#define CT_DOUBLE             0x400
-+#define CT_QUAD                       0x800
-+
-+struct dma_channel {
-+      unsigned int addr;  /* control address */
-+      unsigned int irq;       /* interrupt number */
-+      atomic_t idle;
-+      unsigned int mode;  /* dma mode: width, stream etc */
-+      int (*handler)(void*, int );
-+      void*   user;
-+      
-+      char id[16];
-+      char dev_id[16];
-+};
-+static struct dma_channel     dma_channels[]={
-+#ifdef na_dma_0
-+      {
-+              .addr   = na_dma_0,
-+              .irq    = na_dma_0_irq,
-+              .idle   = ATOMIC_INIT(1),
-+      },
-+#endif
-+#ifdef na_dma_1
-+      {
-+              .addr   = na_dma_1,
-+              .irq    = na_dma_1_irq,
-+              .idle   = ATOMIC_INIT(1),
-+      },
-+#endif
-+};
-+#define MAX_DMA_CHANNELS      sizeof(dma_channels)/sizeof(struct dma_channel)
-+
-+void enable_dma(unsigned int dmanr)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              unsigned int ctl = dma_channels[dmanr].mode;
-+              ctl |= CT_GO | CT_IEEN;
-+              outl(ctl, dma_channels[dmanr].addr+REG_DMA_CONTROL);
-+      }
-+}
-+
-+void disable_dma(unsigned int dmanr)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              unsigned int ctl = dma_channels[dmanr].mode;
-+              ctl &= ~(CT_GO | CT_IEEN);
-+              outl(ctl, dma_channels[dmanr].addr+REG_DMA_CONTROL);
-+      }
-+}
-+
-+void set_dma_count(unsigned int dmanr, unsigned int count)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              dma_channels[dmanr].mode |= CT_LEEN;
-+              outl(count, dma_channels[dmanr].addr+REG_DMA_LENGTH);
-+      }
-+}
-+
-+int get_dma_residue(unsigned int dmanr)
-+{
-+      int result =-1;
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              result = inl(dma_channels[dmanr].addr+REG_DMA_LENGTH);
-+      }
-+      return result;
-+}
-+
-+int request_dma(unsigned int chan, const char *dev_id)
-+{
-+      struct dma_channel *channel;
-+
-+      if ( chan >= MAX_DMA_CHANNELS) {
-+              return -EINVAL;
-+      }
-+
-+      channel = &dma_channels[chan];
-+      
-+      if (!atomic_dec_and_test(&channel->idle)) {
-+              return -EBUSY;
-+      }
-+
-+      strlcpy(channel->dev_id, dev_id, sizeof(channel->dev_id));
-+      channel->handler=NULL;
-+      channel->user=NULL;
-+      channel->mode =0;
-+
-+      return 0;
-+}
-+
-+void free_dma(unsigned int chan)
-+{
-+      if ( chan < MAX_DMA_CHANNELS) {
-+              dma_channels[chan].handler=NULL;
-+              dma_channels[chan].user=NULL;
-+              atomic_set(&dma_channels[chan].idle, 1);
-+      }
-+}
-+
-+int nios2_request_dma(const char *dev_id)
-+{
-+      int chann;
-+
-+      for ( chann=0; chann < MAX_DMA_CHANNELS; chann++) {
-+              if (request_dma(chann, dev_id)==0)
-+                      return chann;
-+      }
-+
-+      return -EINVAL;
-+}
-+void nios2_set_dma_handler(unsigned int dmanr, int (*handler)(void*, int), void* user)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              dma_channels[dmanr].handler=handler;
-+              dma_channels[dmanr].user=user;
-+      }       
-+}
-+#define NIOS2_DMA_WIDTH_MASK  (CT_BYTE | CT_HW | CT_WORD | CT_DOUBLE | CT_QUAD)
-+#define NIOS2_MODE_MASK (NIOS2_DMA_WIDTH_MASK | CT_REEN | CT_WEEN | CT_LEEN | CT_RCON | CT_WCON)
-+void nios2_set_dma_data_width(unsigned int dmanr, unsigned int width)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {         
-+               dma_channels[dmanr].mode &= ~NIOS2_DMA_WIDTH_MASK;
-+               switch (width) {
-+                      case 1:
-+                      dma_channels[dmanr].mode |= CT_BYTE;
-+                      break;
-+                      case 2:
-+                      dma_channels[dmanr].mode |= CT_HW;
-+                      break;
-+                      case 8:
-+                      dma_channels[dmanr].mode |= CT_DOUBLE;
-+                      break;
-+                      case 16:
-+                      dma_channels[dmanr].mode |= CT_QUAD;
-+                      break;
-+                      case 4:
-+                      default:
-+                      dma_channels[dmanr].mode |= CT_WORD;
-+                      break;                  
-+               }
-+      }
-+}
-+
-+void nios2_set_dma_rcon(unsigned int dmanr,unsigned int set)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {         
-+               dma_channels[dmanr].mode &= ~(CT_REEN | CT_RCON);
-+               if (set)
-+                      dma_channels[dmanr].mode |= (CT_REEN | CT_RCON);
-+      }
-+}
-+void nios2_set_dma_wcon(unsigned int dmanr,unsigned int set)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {         
-+               dma_channels[dmanr].mode &= ~(CT_WEEN | CT_WCON);
-+               if (set)
-+                      dma_channels[dmanr].mode |= (CT_WEEN | CT_WCON);
-+      }
-+}
-+void nios2_set_dma_mode(unsigned int dmanr, unsigned int mode)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              /* set_dma_mode is only allowed to change the bus width,
-+                 stream setting, etc.
-+               */
-+               mode &= NIOS2_MODE_MASK;
-+               dma_channels[dmanr].mode &= ~NIOS2_MODE_MASK;
-+               dma_channels[dmanr].mode |= mode;
-+      }
-+}
-+
-+void nios2_set_dma_raddr(unsigned int dmanr, unsigned int a)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              outl(a, dma_channels[dmanr].addr+REG_DMA_READADDR);
-+      }
-+}
-+void nios2_set_dma_waddr(unsigned int dmanr, unsigned int a)
-+{
-+      if (dmanr < MAX_DMA_CHANNELS) {
-+              outl(a, dma_channels[dmanr].addr+REG_DMA_WRITEADDR);
-+      }
-+}
-+
-+
-+static irqreturn_t dma_isr(int irq, void *dev_id)
-+{
-+      struct dma_channel      *chann=(struct dma_channel*)dev_id;
-+      
-+      if (chann) {            
-+              int status = inl(chann->addr+REG_DMA_STATUS);
-+              /* ack the interrupt, and clear the DONE bit */
-+              outl(0, chann->addr+REG_DMA_STATUS);
-+              /* call the peripheral callback */
-+              if (chann->handler)
-+                      chann->handler(chann->user, status);
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+
-+
-+
-+#ifdef CONFIG_PROC_FS
-+static int proc_dma_show(struct seq_file *m, void *v)
-+{
-+      int i;
-+
-+      for (i = 0 ; i < MAX_DMA_CHANNELS ; i++) {
-+              if (!atomic_read(&dma_channels[i].idle)) {
-+                  seq_printf(m, "%2d: %s\n", i,
-+                             dma_channels[i].dev_id);
-+              }
-+      }
-+      return 0;
-+}
-+
-+static int proc_dma_open(struct inode *inode, struct file *file)
-+{
-+      return single_open(file, proc_dma_show, NULL);
-+}
-+static struct file_operations proc_dma_operations = {
-+      .open           = proc_dma_open,
-+      .read           = seq_read,
-+      .llseek         = seq_lseek,
-+      .release        = single_release,
-+};
-+
-+static int __init proc_dma_init(void)
-+{
-+      struct proc_dir_entry *e;
-+
-+      e = create_proc_entry("dma", 0, NULL);
-+      if (e)
-+              e->proc_fops = &proc_dma_operations;
-+
-+      return 0;
-+}
-+
-+__initcall(proc_dma_init);
-+
-+#endif /* CONFIG_PROC_FS */
-+
-+int __init init_dma(void)
-+{
-+      int i;
-+              
-+      for (i = 0 ; i < MAX_DMA_CHANNELS ; i++) {
-+              sprintf(dma_channels[i].id, "dmac-%d", i);
-+              /* disable the dmac channel */
-+              disable_dma(i);
-+              /* request irq*/
-+              if (request_irq(dma_channels[i].irq, dma_isr, 0, dma_channels[i].id, (void*)&dma_channels[i])){
-+                      printk("DMA controller %d failed to get irq %d\n", i, dma_channels[i].irq);
-+                      atomic_set(&dma_channels[i].idle, 0);
-+              }
-+      }
-+      return 0;
-+}
-+
-+static void __exit exit_dma(void)
-+{
-+      int i;
-+              
-+      for (i = 0 ; i < MAX_DMA_CHANNELS ; i++) {
-+              /* disable the dmac channel */
-+              disable_dma(i);
-+              free_irq(dma_channels[i].irq, dma_channels[i].id);
-+      }
-+}
-+
-+module_init(init_dma);
-+module_exit(exit_dma);
-+
-+MODULE_LICENSE("GPL");
-+
-+//EXPORT_SYMBOL(claim_dma_lock);
-+//EXPORT_SYMBOL(release_dma_lock);
-+EXPORT_SYMBOL(enable_dma);
-+EXPORT_SYMBOL(disable_dma);
-+EXPORT_SYMBOL(set_dma_count);
-+EXPORT_SYMBOL(get_dma_residue);
-+EXPORT_SYMBOL(request_dma);
-+EXPORT_SYMBOL(free_dma);
-+EXPORT_SYMBOL(nios2_request_dma);
-+EXPORT_SYMBOL(nios2_set_dma_handler);
-+EXPORT_SYMBOL(nios2_set_dma_data_width);
-+EXPORT_SYMBOL(nios2_set_dma_rcon);
-+EXPORT_SYMBOL(nios2_set_dma_wcon);
-+EXPORT_SYMBOL(nios2_set_dma_mode);
-+EXPORT_SYMBOL(nios2_set_dma_raddr);
-+EXPORT_SYMBOL(nios2_set_dma_waddr);
-+
-diff --git a/arch/nios2nommu/kernel/entry.S b/arch/nios2nommu/kernel/entry.S
-new file mode 100644
-index 0000000..7f71a01
---- /dev/null
-+++ b/arch/nios2nommu/kernel/entry.S
-@@ -0,0 +1,898 @@
-+/*
-+ *  linux/arch/nios2nommu/kernel/entry.S
-+ *
-+ *  Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
-+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
-+ *                      Kenneth Albanowski <kjahds@kjahds.com>,
-+ *  Copyright (C) 2000  Lineo Inc. (www.lineo.com)
-+ *  Copyright (C) 2004  Microtronix Datacom Ltd.
-+ *
-+ * Based on:
-+ *
-+ *  linux/arch/m68knommu/kernel/entry.S
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file README.legal in the main directory of this archive
-+ * for more details.
-+ *
-+ * Linux/m68k support by Hamish Macdonald
-+ *
-+ * 68060 fixes by Jesper Skov
-+ * ColdFire support by Greg Ungerer (gerg@snapgear.com)
-+ * 5307 fixes by David W. Miller
-+ * linux 2.4 support David McCullough <davidm@snapgear.com>
-+ */
-+
-+#include <linux/sys.h>
-+#include <linux/linkage.h>
-+#include <asm/asm-offsets.h>
-+#include <asm/asm-macros.h>
-+#include <asm/thread_info.h>
-+#include <asm/errno.h>
-+#include <asm/setup.h>
-+#include <asm/segment.h>
-+#include <asm/entry.h>
-+#include <asm/unistd.h>
-+#include <asm/traps.h>
-+#include <asm/processor.h>
-+
-+.text
-+.set noat
-+.set nobreak
-+
-+ENTRY(system_call)
-+/*    SAVE_ALL */
-+      rdctl   r10,status              /* enable intrs again */
-+      ori     r10,r10,0x0001
-+      wrctl   status,r10
-+
-+      movi    r2,-LENOSYS
-+      stw     r2,PT_R2(sp)            /* default return value in r2 */
-+                                      /* original r2 is in orig_r2 */
-+
-+      movui   r1,NR_syscalls
-+      bgtu    r3,r1,ret_from_exception
-+      slli    r1,r3,2
-+      movhi   r11,%hiadj(sys_call_table)
-+      add     r1,r1,r11
-+      ldw     r1,%lo(sys_call_table)(r1)
-+      beq     r1,r0,ret_from_exception
-+
-+      movi    r11,%lo(0xffffe000)     /* Get thread info pointer */
-+      and     r11,sp,r11
-+      ldw     r11,TI_FLAGS(r11)
-+      BTBNZ   r11,r11,TIF_SYSCALL_TRACE_ASM,1f
-+
-+      callr   r1
-+      stw     r2,PT_R2(sp)            /* save the return value */
-+      br      ret_from_exception
-+1:
-+      SAVE_SWITCH_STACK
-+      call    syscall_trace
-+      RESTORE_SWITCH_STACK
-+      /* wentao: restore r4-9, since they are trashed by syscall_trace */
-+      ldw     r4,PT_R4(sp)
-+      ldw     r5,PT_R5(sp)
-+      ldw     r6,PT_R6(sp)
-+      ldw     r7,PT_R7(sp)
-+      ldw     r8,PT_R8(sp)
-+      ldw     r9,PT_R9(sp)
-+      callr   r1
-+      stw     r2,PT_R2(sp)            /* save the return value */
-+      SAVE_SWITCH_STACK
-+      call    syscall_trace
-+      RESTORE_SWITCH_STACK
-+
-+ret_from_exception:
-+      ldw     r1,PT_STATUS_EXTENSION(sp)      /* check if returning to kernel */
-+      TSTBZ   r1,r1,PS_S_ASM,Luser_return     /* if so, skip resched, signals */
-+
-+restore_all:
-+      rdctl   r10,status                      /* disable intrs */
-+      andi    r10,r10,0xfffe
-+      wrctl   status, r10
-+      RESTORE_ALL
-+      eret
-+
-+Luser_return:
-+      GET_THREAD_INFO r24                     /* get thread_info pointer */
-+      ldw     r10,TI_FLAGS(r24)               /* get thread_info->flags */
-+      ANDI32  r11,r10,_TIF_WORK_MASK_ASM
-+      beq     r11,r0,restore_all              /* Nothing to do */
-+      BTBZ    r1,r10,TIF_NEED_RESCHED_ASM,Lsignal_return
-+
-+Lwork_resched:
-+      call    schedule
-+      br      ret_from_exception
-+
-+Lsignal_return:
-+      BTBZ    r1,r10,TIF_SIGPENDING_ASM,restore_all
-+      mov     r5,sp                   /* pt_regs */
-+      SAVE_SWITCH_STACK
-+      CLR     r4                      /* oldset = 0 */
-+      call    do_signal
-+      RESTORE_SWITCH_STACK
-+      br      restore_all
-+
-+/*
-+ * Handle software exceptions. Put here so external interrupts
-+ * can fall throught to ret_from_interrupt.
-+ */
-+
-+software_exception:
-+      ldw     r24,-4(ea)              // instruction that caused the exception
-+      xorhi   r24,r24,0x003b          // upper half of trap opcode
-+      xori    r24,r24,0x683a          // lower half of trap opcode
-+      bne     r24,r0,instruction_trap /* N - check for instruction trap */
-+      cmpeqi  r11,r2,TRAP_ID_SYSCALL  /* ? Is this a syscall */
-+      bne     r11,r0,system_call      /* Y - handle syscall */
-+      cmpeqi  r11,r2,TRAP_ID_APPDEBUG /* ? Is this an application debug */
-+      bne     r11,r0,app_debug        /* Y - handle app_debug */
-+      cmpeqi  r11,r2,63               /* ? Is this the old syscall number */
-+      bne     r11,r0,system_call      /* Y - handle syscall to catch older apps*/
-+      br      restore_all             /* N - everything else is ignored for now */
-+
-+app_debug:
-+      GET_THREAD_INFO r24                     /* get thread_info */
-+      ldw     r1,TI_TASK(r24)         /* get thread_info->task */
-+      ldw r24,(TASK_THREAD + THREAD_FLAGS)(r1)        /* get thread_info->task->thread.flags */
-+      ORI32 r24, r24, NIOS2_FLAG_DEBUG  /* set the debug flag */
-+      stw     r24,(TASK_THREAD + THREAD_FLAGS)(r1)    /* save thread_info->task->thread.flags */
-+      br      restore_all
-+
-+/*
-+ * This is the generic interrupt handler (for all hardware interrupt
-+ * sources). It figures out the vector number and calls the appropriate
-+ * interrupt service routine directly.
-+ */
-+ENTRY(inthandler)
-+      SAVE_ALL
-+      /*
-+       * Test to see if the exception was a software exception or caused by an
-+       * external interrupt, and vector accordingly.
-+       */
-+
-+      rdctl   r24,estatus
-+      andi    r24,r24,1
-+      beq     r24,r0,software_exception
-+      rdctl   r12,ipending
-+      beq     r12,r0,software_exception
-+
-+      movi    r24,-1
-+      stw     r24,PT_ORIG_R2(sp)
-+      
-+      /* 
-+       * Process an external hardware interrupt. 
-+       */
-+
-+      addi    ea,ea,-4                /* re-issue the interrupted instruction */
-+      stw     ea,PT_EA(sp)
-+      rdctl   r9,ienable              /* Isolate possible interrupts */
-+      and     r12,r12,r9
-+      beq     r12,r0,ret_from_interrupt /* No one to service done */
-+      movi    r4,%lo(-1)              /* Start from bit position 0, highest priority */
-+                                      /* This is the IRQ # for handler call */
-+1:    addi    r4,r4,1
-+      srl     r10,r12,r4
-+      andi    r10,r10,1               /* Isolate bit we are interested in */
-+      cmpeqi  r11,r4,32                 /* ? End of the register */
-+      bne     r11,r0,ret_from_interrupt /* Y - out of here */
-+      beq     r10,r0,1b
-+      mov     r5,sp                   /* Setup pt_regs pointer for handler call */
-+      PUSH    r4                      /* Save state for return */
-+      PUSH    r12
-+      call    process_int
-+      POP     r12
-+      POP     r4
-+      br      1b                      /* Check for other interrupts while here */
-+
-+ENTRY(ret_from_interrupt)
-+      ldw     r4,PT_STATUS_EXTENSION(sp)
-+      TSTBZ   r4,r4,PS_S_ASM,Luser_return     // Returning to user
-+
-+#ifdef CONFIG_PREEMPT
-+      GET_THREAD_INFO r1
-+      ldw     r4,TI_PREEMPT_COUNT(r1)
-+      bne     r4,r0,restore_all
-+
-+need_resched:
-+      ldw     r4,TI_FLAGS(r1)         // ? Need resched set
-+      BTBZ    r10,r4,TIF_NEED_RESCHED_ASM,restore_all
-+      ldw     r4,PT_ESTATUS(sp)       // ? Interrupts off
-+      BTBZ    r10,r4,NIOS2_STATUS_PIE_OFST_ASM,restore_all
-+      movia   r4,PREEMPT_ACTIVE_ASM
-+      stw     r4,TI_PREEMPT_COUNT(r1)
-+      rdctl   r10,status              /* enable intrs again */
-+      ori     r10,r10,0x0001
-+      wrctl   status,r10
-+      PUSH    r1
-+      call    schedule
-+      POP     r1
-+      mov     r4,r0
-+      stw     r4,TI_PREEMPT_COUNT(r1)
-+      rdctl   r10,status              /* disable intrs */
-+      andi    r10,r10,0xfffe
-+      wrctl   status, r10
-+      br      need_resched
-+#else
-+      br      restore_all
-+#endif
-+
-+
-+/*
-+ * Beware - when entering resume, prev (the current task) is
-+ * in r4, next (the new task) is in r5, don't change these
-+ * registers.
-+ */
-+ENTRY(resume)
-+
-+      rdctl   r7,status                       /* save thread status reg */
-+      stw     r7,TASK_THREAD+THREAD_KPSR(r4)  
-+
-+      andi    r7,r7,0x0fffe                   /* disable interrupts */
-+      wrctl   status,r7
-+
-+      movia   r8,status_extension             /* save status extension */
-+      ldw     r7,0(r8)
-+      stw     r7,TASK_THREAD+THREAD_KESR(r4)
-+
-+      SAVE_SWITCH_STACK
-+      stw     sp,TASK_THREAD+THREAD_KSP(r4)   /* save kernel stack pointer */
-+      ldw     sp,TASK_THREAD+THREAD_KSP(r5)   /* restore new thread stack */
-+      movia   r24,_current_thread             /* save thread */
-+      GET_THREAD_INFO r1
-+      stw     r1,0(r24)
-+      RESTORE_SWITCH_STACK
-+      
-+      ldw     r7,TASK_THREAD+THREAD_KESR(r5)  /* restore extended status reg */
-+      stw     r7,0(r8)
-+
-+      ldw     r7,TASK_THREAD+THREAD_KPSR(r5)  /* restore thread status reg */
-+      wrctl   status,r7
-+      ret
-+
-+ENTRY(ret_from_fork)
-+      call    schedule_tail
-+      br      ret_from_exception
-+
-+ENTRY(sys_fork)
-+      mov     r4,sp
-+      SAVE_SWITCH_STACK
-+      call    nios2_vfork
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_vfork)
-+      mov     r4,sp
-+      SAVE_SWITCH_STACK
-+      call    nios2_vfork
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_execve)
-+      mov     r4,sp
-+      SAVE_SWITCH_STACK
-+      call    nios2_execve
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_clone)
-+      mov     r4,sp
-+      SAVE_SWITCH_STACK
-+      call    nios2_clone
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_sigsuspend)
-+      mov     r4,sp
-+      SAVE_SWITCH_STACK
-+      call    do_sigsuspend
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_rt_sigsuspend)
-+      mov     r4,sp
-+      SAVE_SWITCH_STACK
-+      call    do_rt_sigsuspend
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_sigreturn)
-+      mov     r4,sp
-+      SAVE_SWITCH_STACK
-+      call    do_sigreturn
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_sigaltstack)
-+      ldw     r4,PT_R4(sp)
-+      ldw     r5,PT_R5(sp)
-+      ldw     r6,PT_SP(sp)
-+      SAVE_SWITCH_STACK
-+      call    do_sigaltstack
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+ENTRY(sys_rt_sigreturn)
-+      SAVE_SWITCH_STACK
-+      call    do_rt_sigreturn
-+      RESTORE_SWITCH_STACK
-+      ret
-+
-+/******************************************************************************
-+*                                                                             *
-+* License Agreement                                                           *
-+*                                                                             *
-+* Copyright (c) 2003 Altera Corporation, San Jose, California, USA.           *
-+* All rights reserved.                                                        *
-+*                                                                             *
-+* Permission is hereby granted, free of charge, to any person obtaining a     *
-+* copy of this software and associated documentation files (the "Software"),  *
-+* to deal in the Software without restriction, including without limitation   *
-+* the rights to use, copy, modify, merge, publish, distribute, sublicense,    *
-+* and/or sell copies of the Software, and to permit persons to whom the       *
-+* Software is furnished to do so, subject to the following conditions:        *
-+*                                                                             *
-+* The above copyright notice and this permission notice shall be included in  *
-+* all copies or substantial portions of the Software.                         *
-+*                                                                             *
-+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  *
-+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    *
-+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
-+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      *
-+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     *
-+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER         *
-+* DEALINGS IN THE SOFTWARE.                                                   *
-+*                                                                             *
-+* This agreement shall be governed in all respects by the laws of the State   *
-+* of California and by the laws of the United States of America.              *
-+*                                                                             *
-+******************************************************************************/
-+
-+    /*
-+     * This is the software exception handler for Nios2.
-+     */       
-+
-+     /*
-+      * Explicitly allow the use of r1 (the assembler temporary register)
-+      * within this code. This register is normally reserved for the use of
-+      * the compiler.
-+      */
-+
-+ENTRY(instruction_trap)
-+      RESTORE_ALL     // Clean off our save & setup for emulation
-+      
-+    /* INSTRUCTION EMULATION
-+    *  ---------------------
-+    *
-+    * Nios II processors generate exceptions for unimplemented instructions.
-+    * The routines below emulate these instructions.  Depending on the
-+    * processor core, the only instructions that might need to be emulated
-+    * are div, divu, mul, muli, mulxss, mulxsu, and mulxuu.
-+    *
-+    * The emulations match the instructions, except for the following
-+    * limitations:
-+    *
-+    * 1) The emulation routines do not emulate the use of the exception
-+    *    temporary register (et) as a source operand because the exception
-+    *    handler already has modified it.
-+    *
-+    * 2) The routines do not emulate the use of the stack pointer (sp) or the
-+    *    exception return address register (ea) as a destination because
-+    *    modifying these registers crashes the exception handler or the
-+    *    interrupted routine.
-+    *
-+    * Detailed Design
-+    * ---------------
-+    *
-+    * The emulation routines expect the contents of integer registers r0-r31
-+    * to be on the stack at addresses sp, 4(sp), 8(sp), ... 124(sp).  The
-+    * routines retrieve source operands from the stack and modify the
-+    * destination register's value on the stack prior to the end of the
-+    * exception handler.  Then all registers except the destination register
-+    * are restored to their previous values.
-+    *
-+    * The instruction that causes the exception is found at address -4(ea).
-+    * The instruction's OP and OPX fields identify the operation to be
-+    * performed.
-+    *
-+    * One instruction, muli, is an I-type instruction that is identified by
-+    * an OP field of 0x24.
-+    *
-+    * muli   AAAAA,BBBBB,IIIIIIIIIIIIIIII,-0x24-
-+    *           27    22                6      0    <-- LSB of field
-+    *
-+    * The remaining emulated instructions are R-type and have an OP field
-+    * of 0x3a.  Their OPX fields identify them.
-+    *
-+    * R-type AAAAA,BBBBB,CCCCC,XXXXXX,NNNNN,-0x3a-
-+    *           27    22    17     11     6      0  <-- LSB of field
-+    * 
-+    * 
-+    * Opcode Encoding.  muli is identified by its OP value.  Then OPX & 0x02
-+    * is used to differentiate between the division opcodes and the remaining
-+    * multiplication opcodes.
-+    *
-+    * Instruction   OP      OPX    OPX & 0x02
-+    * -----------   ----    ----   ----------
-+    * muli          0x24
-+    * divu          0x3a    0x24         0
-+    * div           0x3a    0x25         0
-+    * mul           0x3a    0x27      != 0
-+    * mulxuu        0x3a    0x07      != 0
-+    * mulxsu        0x3a    0x17      != 0
-+    * mulxss        0x3a    0x1f      != 0
-+    */
-+
-+
-+    /*
-+    * Save everything on the stack to make it easy for the emulation routines
-+    * to retrieve the source register operands.
-+    */
-+
-+    addi sp, sp, -128
-+    stw zero,  0(sp)    // Save zero on stack to avoid special case for r0.
-+    stw r1,    4(sp)
-+    stw r2,    8(sp)
-+    stw r3,   12(sp)
-+    stw r4,   16(sp)
-+    stw r5,   20(sp)
-+    stw r6,   24(sp)
-+    stw r7,   28(sp)
-+    stw r8,   32(sp)
-+    stw r9,   36(sp)
-+    stw r10,  40(sp)
-+    stw r11,  44(sp)
-+    stw r12,  48(sp)
-+    stw r13,  52(sp)
-+    stw r14,  56(sp)
-+    stw r15,  60(sp)
-+    stw r16,  64(sp)
-+    stw r17,  68(sp)
-+    stw r18,  72(sp)
-+    stw r19,  76(sp)
-+    stw r20,  80(sp)
-+    stw r21,  84(sp)
-+    stw r22,  88(sp)
-+    stw r23,  92(sp)
-+                        // Don't bother to save et.  It's already been changed.
-+    stw bt,  100(sp)
-+    stw gp,  104(sp)
-+    stw sp,  108(sp)
-+    stw fp,  112(sp)
-+                        // Don't bother to save ea.  It's already been changed.
-+    stw ba,  120(sp)
-+    stw ra,  124(sp)
-+
-+
-+    /*
-+    * Split the instruction into its fields.  We need 4*A, 4*B, and 4*C as
-+    * offsets to the stack pointer for access to the stored register values.
-+    */
-+    ldw r2,-4(ea)       // r2 = AAAAA,BBBBB,IIIIIIIIIIIIIIII,PPPPPP
-+    roli r3,r2,7        // r3 = BBB,IIIIIIIIIIIIIIII,PPPPPP,AAAAA,BB
-+    roli r4,r3,3        // r4 = IIIIIIIIIIIIIIII,PPPPPP,AAAAA,BBBBB
-+    roli r5,r4,2        // r5 = IIIIIIIIIIIIII,PPPPPP,AAAAA,BBBBB,II
-+    srai r4,r4,16       // r4 = (sign-extended) IMM16
-+    roli r6,r5,5        // r6 = XXXX,NNNNN,PPPPPP,AAAAA,BBBBB,CCCCC,XX
-+    andi r2,r2,0x3f     // r2 = 00000000000000000000000000,PPPPPP
-+    andi r3,r3,0x7c     // r3 = 0000000000000000000000000,AAAAA,00
-+    andi r5,r5,0x7c     // r5 = 0000000000000000000000000,BBBBB,00
-+    andi r6,r6,0x7c     // r6 = 0000000000000000000000000,CCCCC,00
-+
-+    /* Now
-+    * r2 = OP
-+    * r3 = 4*A
-+    * r4 = IMM16 (sign extended)
-+    * r5 = 4*B
-+    * r6 = 4*C
-+    */
-+
-+
-+    /*
-+    * Get the operands.
-+    *
-+    * It is necessary to check for muli because it uses an I-type instruction
-+    * format, while the other instructions are have an R-type format.
-+    *
-+    *  Prepare for either multiplication or division loop.
-+    *  They both loop 32 times.
-+    */
-+    movi r14,32
-+
-+    add  r3,r3,sp       // r3 = address of A-operand.
-+    ldw  r3,0(r3)       // r3 = A-operand.
-+    movi r7,0x24        // muli opcode (I-type instruction format)
-+    beq r2,r7,mul_immed // muli doesn't use the B register as a source
-+
-+    add  r5,r5,sp       // r5 = address of B-operand.
-+    ldw  r5,0(r5)       // r5 = B-operand.
-+                        // r4 = SSSSSSSSSSSSSSSS,-----IMM16------
-+                        // IMM16 not needed, align OPX portion
-+                        // r4 = SSSSSSSSSSSSSSSS,CCCCC,-OPX--,00000
-+    srli r4,r4,5        // r4 = 00000,SSSSSSSSSSSSSSSS,CCCCC,-OPX--
-+    andi r4,r4,0x3f     // r4 = 00000000000000000000000000,-OPX--
-+
-+    /* Now
-+    * r2 = OP
-+    * r3 = src1
-+    * r5 = src2
-+    * r4 = OPX (no longer can be muli)
-+    * r6 = 4*C
-+    */
-+
-+
-+
-+    /*
-+    *  Multiply or Divide?
-+    */
-+    andi r7,r4,0x02    // For R-type multiply instructions, OPX & 0x02 != 0
-+    bne r7,zero,multiply
-+
-+
-+    /* DIVISION
-+    *
-+    * Divide an unsigned dividend by an unsigned divisor using
-+    * a shift-and-subtract algorithm.  The example below shows
-+    * 43 div 7 = 6 for 8-bit integers.  This classic algorithm uses a
-+    * single register to store both the dividend and the quotient,
-+    * allowing both values to be shifted with a single instruction.
-+    *
-+    *                               remainder dividend:quotient
-+    *                               --------- -----------------
-+    *   initialize                   00000000     00101011:
-+    *   shift                        00000000     0101011:_
-+    *   remainder >= divisor? no     00000000     0101011:0
-+    *   shift                        00000000     101011:0_
-+    *   remainder >= divisor? no     00000000     101011:00
-+    *   shift                        00000001     01011:00_
-+    *   remainder >= divisor? no     00000001     01011:000
-+    *   shift                        00000010     1011:000_
-+    *   remainder >= divisor? no     00000010     1011:0000
-+    *   shift                        00000101     011:0000_
-+    *   remainder >= divisor? no     00000101     011:00000
-+    *   shift                        00001010     11:00000_
-+    *   remainder >= divisor? yes    00001010     11:000001
-+    *       remainder -= divisor   - 00000111
-+    *                              ----------
-+    *                                00000011     11:000001
-+    *   shift                        00000111     1:000001_
-+    *   remainder >= divisor? yes    00000111     1:0000011
-+    *       remainder -= divisor   - 00000111
-+    *                              ----------
-+    *                                00000000     1:0000011
-+    *   shift                        00000001     :0000011_
-+    *   remainder >= divisor? no     00000001     :00000110
-+    *
-+    * The quotient is 00000110.
-+    */
-+
-+divide:
-+    /*
-+    *  Prepare for division by assuming the result
-+    *  is unsigned, and storing its "sign" as 0.
-+    */
-+    movi r17,0
-+
-+
-+    // Which division opcode?
-+    xori r7,r4,0x25         // OPX of div
-+    bne r7,zero,unsigned_division
-+
-+
-+    /*
-+    *  OPX is div.  Determine and store the sign of the quotient.
-+    *  Then take the absolute value of both operands.
-+    */
-+    xor r17,r3,r5       // MSB contains sign of quotient
-+    bge r3,zero,dividend_is_nonnegative
-+    sub r3,zero,r3      // -r3
-+dividend_is_nonnegative:
-+    bge r5,zero,divisor_is_nonnegative
-+    sub r5,zero,r5      // -r5
-+divisor_is_nonnegative:
-+
-+
-+unsigned_division:
-+    // Initialize the unsigned-division loop.
-+    movi r13,0          // remainder = 0
-+
-+    /* Now
-+    * r3 = dividend : quotient
-+    * r4 = 0x25 for div, 0x24 for divu
-+    * r5 = divisor
-+    * r13 = remainder
-+    * r14 = loop counter (already initialized to 32)
-+    * r17 = MSB contains sign of quotient
-+    */
-+
-+
-+    /*
-+    *   for (count = 32; count > 0; --count)
-+    *   {
-+    */
-+divide_loop:
-+
-+    /*
-+    *       Division:
-+    *
-+    *       (remainder:dividend:quotient) <<= 1;
-+    */
-+    slli r13,r13,1
-+    cmplt r7,r3,zero        // r7 = MSB of r3
-+    or r13,r13,r7
-+    slli r3,r3,1
-+
-+
-+    /*
-+    *       if (remainder >= divisor)
-+    *       {
-+    *           set LSB of quotient
-+    *           remainder -= divisor;
-+    *       }
-+    */
-+    bltu r13,r5,div_skip
-+    ori r3,r3,1
-+    sub r13,r13,r5
-+div_skip:
-+
-+    /*
-+    *   }
-+    */
-+    subi r14,r14,1
-+    bne r14,zero,divide_loop
-+
-+
-+    /* Now
-+    * r3 = quotient
-+    * r4 = 0x25 for div, 0x24 for divu
-+    * r6 = 4*C
-+    * r17 = MSB contains sign of quotient
-+    */
-+
-+    
-+    /*
-+    *  Conditionally negate signed quotient.  If quotient is unsigned,
-+    *  the sign already is initialized to 0.
-+    */
-+    bge r17,zero,quotient_is_nonnegative
-+    sub r3,zero,r3      // -r3
-+quotient_is_nonnegative:
-+
-+
-+    /*
-+    *  Final quotient is in r3.
-+    */
-+    add r6,r6,sp
-+    stw r3,0(r6)           // write quotient to stack
-+    br restore_registers
-+
-+
-+
-+
-+    /* MULTIPLICATION
-+    *
-+    * A "product" is the number that one gets by summing a "multiplicand"
-+    * several times.  The "multiplier" specifies the number of copies of the
-+    * multiplicand that are summed.
-+    *
-+    * Actual multiplication algorithms don't use repeated addition, however.
-+    * Shift-and-add algorithms get the same answer as repeated addition, and
-+    * they are faster.  To compute the lower half of a product (pppp below)
-+    * one shifts the product left before adding in each of the partial products
-+    * (a * mmmm) through (d * mmmm).
-+    *
-+    * To compute the upper half of a product (PPPP below), one adds in the
-+    * partial products (d * mmmm) through (a * mmmm), each time following the
-+    * add by a right shift of the product.
-+    *
-+    *     mmmm
-+    *   * abcd
-+    *   ------
-+    *     ####  = d * mmmm
-+    *    ####   = c * mmmm
-+    *   ####    = b * mmmm
-+    *  ####     = a * mmmm
-+    * --------
-+    * PPPPpppp
-+    *
-+    * The example above shows 4 partial products.  Computing actual Nios II
-+    * products requires 32 partials.
-+    *
-+    * It is possible to compute the result of mulxsu from the result of mulxuu
-+    * because the only difference between the results of these two opcodes is
-+    * the value of the partial product associated with the sign bit of rA.
-+    *
-+    *   mulxsu = mulxuu - (rA < 0) ? rB : 0;
-+    *
-+    * It is possible to compute the result of mulxss from the result of mulxsu
-+    * because the only difference between the results of these two opcodes is
-+    * the value of the partial product associated with the sign bit of rB.
-+    *
-+    *   mulxss = mulxsu - (rB < 0) ? rA : 0;
-+    *
-+    */
-+
-+mul_immed:
-+    // Opcode is muli.  Change it into mul for remainder of algorithm.
-+    mov r6,r5              // Field B is dest register, not field C.
-+    mov r5,r4              // Field IMM16 is src2, not field B.
-+    movi r4,0x27           // OPX of mul is 0x27
-+
-+multiply:
-+    // Initialize the multiplication loop.
-+    movi r9,0           // mul_product    = 0
-+    movi r10,0          // mulxuu_product = 0
-+    mov r11,r5          // save original multiplier for mulxsu and mulxss
-+    mov r12,r5          // mulxuu_multiplier (will be shifted)
-+    movi r16,1          // used to create "rori B,A,1" from "ror B,A,r16"
-+
-+    /* Now
-+    * r3 = multiplicand
-+    * r5 = mul_multiplier
-+    * r6 = 4 * dest_register (used later as offset to sp)
-+    * r7 = temp
-+    * r9 = mul_product
-+    * r10 = mulxuu_product
-+    * r11 = original multiplier
-+    * r12 = mulxuu_multiplier
-+    * r14 = loop counter (already initialized)
-+    * r16 = 1
-+    */
-+
-+
-+    /*
-+    *   for (count = 32; count > 0; --count)
-+    *   {
-+    */
-+multiply_loop:
-+
-+    /*
-+    *       mul_product <<= 1;
-+    *       lsb = multiplier & 1;
-+    */
-+    slli r9,r9,1
-+    andi r7,r12,1
-+
-+    /*
-+    *       if (lsb == 1)
-+    *       {
-+    *           mulxuu_product += multiplicand;
-+    *       }
-+    */
-+    beq r7,zero,mulx_skip
-+    add r10,r10,r3
-+    cmpltu r7,r10,r3    // Save the carry from the MSB of mulxuu_product.
-+    ror r7,r7,r16       // r7 = 0x80000000 on carry, or else 0x00000000
-+mulx_skip:
-+
-+    /*
-+    *       if (MSB of mul_multiplier == 1)
-+    *       {
-+    *           mul_product += multiplicand;
-+    *       }
-+    */
-+    bge r5,zero,mul_skip
-+    add r9,r9,r3
-+mul_skip:
-+
-+    /*
-+    *       mulxuu_product >>= 1;           logical shift
-+    *       mul_multiplier <<= 1;           done with MSB
-+    *       mulx_multiplier >>= 1;          done with LSB
-+    */
-+    srli r10,r10,1
-+    or r10,r10,r7           // OR in the saved carry bit.
-+    slli r5,r5,1
-+    srli r12,r12,1
-+
-+
-+    /*
-+    *   }
-+    */
-+    subi r14,r14,1
-+    bne r14,zero,multiply_loop
-+
-+
-+    /*
-+    *  Multiply emulation loop done.
-+    */
-+
-+    /* Now
-+    * r3 = multiplicand
-+    * r4 = OPX
-+    * r6 = 4 * dest_register (used later as offset to sp)
-+    * r7 = temp
-+    * r9 = mul_product
-+    * r10 = mulxuu_product
-+    * r11 = original multiplier
-+    */
-+
-+
-+    // Calculate address for result from 4 * dest_register
-+    add r6,r6,sp
-+
-+
-+    /*
-+    *  Select/compute the result based on OPX.
-+    */
-+
-+
-+    // OPX == mul?  Then store.
-+    xori r7,r4,0x27
-+    beq r7,zero,store_product
-+
-+    // It's one of the mulx.. opcodes.  Move over the result.
-+    mov r9,r10
-+
-+    // OPX == mulxuu?  Then store.
-+    xori r7,r4,0x07
-+    beq r7,zero,store_product
-+
-+    // Compute mulxsu
-+    //
-+    // mulxsu = mulxuu - (rA < 0) ? rB : 0;
-+    //
-+    bge r3,zero,mulxsu_skip
-+    sub r9,r9,r11
-+mulxsu_skip:
-+
-+    // OPX == mulxsu?  Then store.
-+    xori r7,r4,0x17
-+    beq r7,zero,store_product
-+
-+    // Compute mulxss
-+    //
-+    // mulxss = mulxsu - (rB < 0) ? rA : 0;
-+    //
-+    bge r11,zero,mulxss_skip
-+    sub r9,r9,r3
-+mulxss_skip:
-+    // At this point, assume that OPX is mulxss, so store
-+
-+
-+store_product:
-+    stw  r9,0(r6)
-+
-+
-+restore_registers:
-+                        // No need to restore r0.
-+    ldw r1,    4(sp)
-+    ldw r2,    8(sp)
-+    ldw r3,   12(sp)
-+    ldw r4,   16(sp)
-+    ldw r5,   20(sp)
-+    ldw r6,   24(sp)
-+    ldw r7,   28(sp)
-+    ldw r8,   32(sp)
-+    ldw r9,   36(sp)
-+    ldw r10,  40(sp)
-+    ldw r11,  44(sp)
-+    ldw r12,  48(sp)
-+    ldw r13,  52(sp)
-+    ldw r14,  56(sp)
-+    ldw r15,  60(sp)
-+    ldw r16,  64(sp)
-+    ldw r17,  68(sp)
-+    ldw r18,  72(sp)
-+    ldw r19,  76(sp)
-+    ldw r20,  80(sp)
-+    ldw r21,  84(sp)
-+    ldw r22,  88(sp)
-+    ldw r23,  92(sp)
-+    ldw et,   96(sp)
-+    ldw bt,  100(sp)
-+    ldw gp,  104(sp)
-+                        // Don't corrupt sp.
-+    ldw fp,  112(sp)
-+                        // Don't corrupt ea.
-+    ldw ba,  120(sp)
-+    ldw ra,  124(sp)
-+    addi sp, sp, 128
-+    eret
-+
-+.set at
-+.set break
-+
-diff --git a/arch/nios2nommu/kernel/head.S b/arch/nios2nommu/kernel/head.S
-new file mode 100644
-index 0000000..f1cba65
---- /dev/null
-+++ b/arch/nios2nommu/kernel/head.S
-@@ -0,0 +1,228 @@
-+/*
-+ * head.S for Altera's Excalibur development board with nios processor
-+ *
-+ * (c) Vic Phillips, Microtronix Datacom Ltd., 2001
-+ * (C) Copyright 2004  Microtronix Datacom Ltd
-+ *
-+ * Based on the following from the Excalibur sdk distribution:
-+ *    NA_MemoryMap.s, NR_JumpToStart.s, NR_Setup.s, NR_CWPManager.s
-+ *
-+ * This program is free software; you can redistribute it and/or modify it under
-+ * the terms of the GNU General Public License as published by the Free
-+ * Software Foundation; either version 2 of the License, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc., 675
-+ * Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <asm/asm-offsets.h>
-+#include <asm/asm-macros.h>
-+
-+
-+#ifdef CONFIG_CRC_CHECK
-+/**********************************************/
-+/* Define where the CRC table lives in flash. */
-+/* The __CRC_Sector_Size is the flash sector  */
-+/* size for the address range.                */
-+/**********************************************/
-+
-+      GEQU    __CRC_Table_Begin,(na_flash)+0x4000   /* Second sector of main board flash */
-+      GEQU    __CRC_Sector_Size,0x2000
-+#endif
-+
-+/*
-+ * This global variable is used as an extension to the nios'
-+ * STATUS register to emulate a user/supervisor mode.
-+ */
-+      .data
-+      .align  2
-+      .set noat
-+      .global status_extension
-+status_extension:
-+      .long   0
-+
-+      .global _current_thread
-+_current_thread:
-+      .long   0
-+/*
-+ * Input(s): passed from u-boot
-+ *   r4 - Optional pointer to a board information structure.
-+ *   r5 - Optional pointer to the physical starting address of the init RAM
-+ *        disk.
-+ *   r6 - Optional pointer to the physical ending address of the init RAM
-+ *        disk.
-+ *   r7 - Optional pointer to the physical starting address of any kernel
-+ *        command-line parameters.
-+ */
-+
-+/*
-+ * First executable code - detected and jumped to by the ROM bootstrap
-+ * if the code resides in flash (looks for "Nios" at offset 0x0c from
-+ * the potential executable image).
-+ */
-+      .text
-+      .global _start
-+_start:
-+      wrctl   status,r0               /* Disable interrupts */
-+      
-+      /* Flush all cache lines within the instruction cache */
-+
-+      movia   r1,NIOS2_ICACHE_SIZE
-+      movui   r2,NIOS2_ICACHE_LINE_SIZE
-+
-+text_flush:
-+      flushi  r1
-+      sub     r1,r1,r2
-+      bgt     r1,r0,text_flush
-+      br      1f
-+
-+      /* This is the default location for the exception 
-+       * handler. Code in jump to our handler
-+       */
-+      
-+      movia   r24,inthandler
-+      jmp     r24
-+1:            
-+      /*
-+       * After flushing the instruction cache, we must flush the data
-+       * cache.
-+       */
-+
-+      movia   r1,NIOS2_DCACHE_SIZE
-+      movi    r2,NIOS2_DCACHE_LINE_SIZE
-+
-+data_flush:
-+      flushd  0(r1)
-+      sub     r1,r1,r2
-+      bgt     r1,r0,data_flush
-+
-+NR_MoveStart:
-+#ifdef CONFIG_BREAK_ON_START
-+      break
-+#endif //CONFIG_BREAK_ON_START
-+      nextpc  r1                      /* Find out where we are */
-+chkadr:       
-+      movia   r2,chkadr
-+      beq     r1,r2,finish_move       /* We are running in RAM done */
-+      addi    r1,r1,(_start - chkadr) /* Source */
-+      movia   r2,_start               /* Destination */
-+      movia   r3,__bss_start          /* End of copy */
-+      
-+loop_move:                            // r1: src, r2: dest, r3: last dest
-+      ldw     r8,0(r1)                // load a word from [r1]
-+      stw     r8,0(r2)                // stort a word to dest [r2]
-+      flushd  0(r2)                   // Flush cache for safty
-+      addi    r1,r1,4                 // inc the src addr
-+      addi    r2,r2,4                 // inc the dest addr
-+      blt     r2,r3,loop_move
-+              
-+      movia   r1,finish_move          // VMA(_start)->l1
-+      jmp     r1                      // jmp to _start        
-+
-+finish_move:
-+
-+      //------------------------------------
-+      // Disable interrupts on known devices
-+      //
-+#ifdef NA_ENET_ASM
-+#ifdef NA_ENET_RESET_ASM
-+      movia   r1,NA_ENET_RESET_ASM    // ethernet reset address
-+      stwio   r0,0(r1)                // reset
-+#endif
-+#ifdef NA_ENET_RESET_N_ASM
-+      movia   r1,NA_ENET_RESET_N_ASM  // ethernet reset address
-+      stwio   r0,0(r1)                // reset
-+#endif
-+      nop                             // give it some time
-+      nop                             //
-+      nop                             //
-+      nop                             //
-+#endif
-+#ifdef NA_TIMER0_ASM
-+      movia   r1,NA_TIMER0_ASM            // get timer address
-+      stwio   r0,NP_TIMERCONTROL_ASM(r1)  // clear interrupt enable
-+      stwio   r0,NP_TIMERSTATUS_ASM(r1)   // clear interrupt condition
-+#endif
-+#ifdef NA_UART0_ASM
-+      movia   r1,NA_UART0_ASM
-+      stwio   r0,NP_UARTCONTROL_ASM(r1)       // clear interrupt enable
-+      stwio   r0,NP_UARTSTATUS_ASM(r1)        // clear interrupt status
-+#endif
-+#ifdef NA_UART1_ASM
-+      movia   r1,NA_UART1_ASM
-+      stwio   r0,NP_UARTCONTROL_ASM(r1)       // clear interrupt enable
-+      stwio   r0,NP_UARTSTATUS_ASM(r1)        // clear interrupt status
-+#endif
-+#ifdef NA_UART2_ASM
-+      movia   r1,NA_UART2_ASM
-+      stwio   r0,NP_UARTCONTROL_ASM(r1)       // clear interrupt enable
-+      stwio   r0,NP_UARTSTATUS_ASM(r1)        // clear interrupt status
-+#endif
-+#ifdef NA_UART3_ASM
-+      movia   r1,NA_UART3_ASM
-+      stwio   r0,NP_UARTCONTROL_ASM(r1)       // clear interrupt enable
-+      stwio   r0,NP_UARTSTATUS_ASM(r1)        // clear interrupt status
-+#endif
-+#ifdef NA_IDE_INTERFACE_ASM
-+      movia   r1,NA_IDE_INTERFACE_ASM // ATA reset
-+      stwio   r0,0(r1)                // write to control register
-+#endif
-+#ifdef NA_ENET_ASM
-+#ifdef NA_ENET_RESET_ASM
-+      movia   r1,NA_ENET_RESET_ASM    // ethernet reset address
-+      movui   r2,1                    // reset
-+      stwio   r2,0(r1)                //
-+#endif
-+#ifdef NA_ENET_RESET_N_ASM
-+      movia   r1,NA_ENET_RESET_N_ASM  // ethernet reset address
-+      movui   r2,1                    // reset
-+      stwio   r2,0(r1)                //
-+#endif
-+#endif
-+      wrctl   ienable,r0              // Mask off all possible interrupts
-+
-+      //------------------------------------------------------
-+      // Zero out the .bss segment (uninitialized common data)
-+      //
-+      movia   r2,__bss_start          // presume nothing is between
-+      movia   r1,_end                 // the .bss and _end.
-+1:
-+      stb     r0,0(r2)
-+      addi    r2,r2,1
-+      bne     r1,r2,1b
-+
-+      //------------------------------------------------------
-+      // Call main() with interrupts disabled
-+      //
-+      movia   r1,status_extension     // get the STATUS extension address
-+      movi    r2,PS_S_ASM             // set initial mode = supervisor
-+      stw     r2,0(r1)
-+      
-+      movia   r1,init_thread_union    // set stack at top of the task union
-+      addi    sp,r1,THREAD_SIZE_ASM
-+      movia   r2,_current_thread      // Remember current thread
-+      stw     r1,0(r2)
-+
-+      movia   r1,nios2_boot_init      // save args r4-r7 passed from u-boot
-+      callr   r1
-+      
-+      movia   r1,main                 // call main as a subroutine
-+      callr   r1
-+
-+      //------------------------------------------------------------------
-+      // If we return from main,  break to the oci debugger and buggered we are
-+      //
-+      break   
-+
-+      /* End of startup code */
-+.set at
-+
-+
-diff --git a/arch/nios2nommu/kernel/init_task.c b/arch/nios2nommu/kernel/init_task.c
-new file mode 100644
-index 0000000..867e8fb
---- /dev/null
-+++ b/arch/nios2nommu/kernel/init_task.c
-@@ -0,0 +1,69 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/kernel/init_task.c
-+ *
-+ * Ported from arch/m68knommu/kernel/init_task.c
-+ *
-+ * Copyright (C) 2003, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/init.h>
-+#include <linux/init_task.h>
-+#include <linux/fs.h>
-+#include <linux/mqueue.h>
-+
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+
-+static struct fs_struct init_fs = INIT_FS;
-+static struct files_struct init_files = INIT_FILES;
-+static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
-+static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-+struct mm_struct init_mm = INIT_MM(init_mm);
-+
-+EXPORT_SYMBOL(init_mm);
-+
-+/*
-+ * Initial task structure.
-+ *
-+ * All other task structs will be allocated on slabs in fork.c
-+ */
-+__asm__(".align 2");
-+struct task_struct init_task = INIT_TASK(init_task);
-+
-+
-+/*
-+ * Initial thread structure.
-+ *
-+ * We need to make sure that this is 8192-byte aligned due to the
-+ * way process stacks are handled. This is done by having a special
-+ * "init_task" linker map entry..
-+ */
-+union thread_union init_thread_union
-+      __attribute__((__section__(".data.init_task"))) =
-+              { INIT_THREAD_INFO(init_task) };
-+
-diff --git a/arch/nios2nommu/kernel/io.c b/arch/nios2nommu/kernel/io.c
-new file mode 100644
-index 0000000..e1b0b12
---- /dev/null
-+++ b/arch/nios2nommu/kernel/io.c
-@@ -0,0 +1,143 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * Optimized IO string functions.
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/io.h>
-+
-+void insl(unsigned long port, void *dst, unsigned long count)
-+{
-+      unsigned long read32;
-+
-+      if ((unsigned long)dst & 2){
-+              /* Unaligned destination pointer, need to do
-+               * two 16 bit writes for each read.
-+               */
-+              unsigned short *p=(unsigned short*)dst;
-+              while (count--){
-+                      read32 = inl(port);
-+                      *p++ = read32 & 0xFFFF;
-+                      *p++ = read32 >> 16;
-+              }
-+      }
-+      else {
-+              unsigned long *p=(unsigned long*)dst;
-+              while (count--)
-+                      *p++ = inl(port);
-+      }
-+}
-+
-+void insw(unsigned long port, void *dst, unsigned long count)
-+{
-+      unsigned long dst1=(unsigned long)dst;
-+      if (count > 8) {
-+              /* Long word align buffer ptr */
-+              if      (dst1 & 2) {
-+                      *(unsigned short*)dst1 = inw(port);
-+                      dst1 += sizeof(unsigned short);
-+                      count--;
-+              }
-+
-+              /* Input pairs of short and store as longs */
-+              while (count >= 8) {
-+                      *((unsigned long *)dst1) = inw(port) + (inw(port) << 16); dst1+=sizeof(unsigned long);
-+                      *((unsigned long *)dst1) = inw(port) + (inw(port) << 16); dst1+=sizeof(unsigned long);
-+                      *((unsigned long *)dst1) = inw(port) + (inw(port) << 16); dst1+=sizeof(unsigned long);
-+                      *((unsigned long *)dst1) = inw(port) + (inw(port) << 16); dst1+=sizeof(unsigned long);
-+                      count -= 8;
-+              }
-+      }
-+
-+      /* Input remaining shorts */
-+      while (count--) {
-+              *((unsigned short *)dst1) = inw(port);
-+              dst1 += sizeof(unsigned short);
-+      }
-+}
-+
-+
-+void outsl(unsigned long port, void *src, unsigned long count)
-+{
-+      unsigned long src1=(unsigned long)src;
-+      unsigned long write32;
-+      
-+      if (src1 & 2){
-+              /* Unaligned source pointer, need to read
-+               * two 16 bit shorts before writing to register.
-+               */
-+              while (count--){
-+                      write32 = *(unsigned short *)src1;
-+                      src1+=sizeof(unsigned short);
-+                      write32 |= *((unsigned short *)src1) << 16;
-+                      src1+=sizeof(unsigned short);
-+                      outl(write32,port);
-+              }
-+      }
-+      else {
-+              while (count--) {
-+                      outl(*(unsigned long *)src1,port);
-+                      src1+=sizeof(unsigned long);
-+              }
-+      }
-+}
-+
-+void outsw(unsigned long port, void *src, unsigned long count)
-+{
-+      unsigned int lw;
-+      unsigned long src1=(unsigned long)src;
-+
-+      if (count > 8) {
-+              /* Long word align buffer ptr */
-+              if      (src1 & 2) {
-+                      outw( *(unsigned short *)src1, port );
-+                      count--;
-+                      src1 += sizeof(unsigned short);
-+              }
-+
-+              /* Read long words and output as pairs of short */
-+              while (count >= 8) {
-+                      lw = *(unsigned long *)src1;
-+                      src1+=sizeof(unsigned long);
-+                      outw(lw, port);
-+                      outw((lw >> 16), port);
-+                      lw = *(unsigned long *)src1;
-+                      src1+=sizeof(unsigned long);
-+                      outw(lw, port);
-+                      outw((lw >> 16), port);
-+                      lw = *(unsigned long *)src1;
-+                      src1+=sizeof(unsigned long);
-+                      outw(lw, port);
-+                      outw((lw >> 16), port);
-+                      lw = *(unsigned long *)src1;
-+                      src1+=sizeof(unsigned long);
-+                      outw(lw, port);
-+                      outw((lw >> 16), port);
-+                      count -= 8;
-+              }
-+      }
-+
-+      /* Output remaining shorts */
-+      while (count--) {
-+              outw( *(unsigned short *)src1, port );
-+              src1 += sizeof(unsigned short);
-+      }
-+}
-diff --git a/arch/nios2nommu/kernel/irq.c b/arch/nios2nommu/kernel/irq.c
-new file mode 100644
-index 0000000..f1b2347
---- /dev/null
-+++ b/arch/nios2nommu/kernel/irq.c
-@@ -0,0 +1,245 @@
-+/*
-+ * linux/arch/$(ARCH)/irq.c -- general exception handling code
-+ *
-+ * Cloned from Linux/m68k.
-+ *
-+ * No original Copyright holder listed,
-+ * Probabily original (C) Roman Zippel (assigned DJD, 1999)
-+ *
-+ * Copyright 1999-2000 D. Jeff Dionne, <jeff@rt-control.com>
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file COPYING in the main directory of this archive
-+ * for more details.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/seq_file.h>
-+
-+#include <asm/system.h>
-+#include <asm/irq.h>
-+#include <asm/page.h>
-+#include <asm/nios.h>
-+#include <asm/hardirq.h>
-+
-+/* table for system interrupt handlers */
-+irq_hand_t irq_list[NR_IRQS];
-+
-+/* The number of spurious interrupts */
-+volatile unsigned int num_spurious;
-+
-+#define NUM_IRQ_NODES 16
-+static irq_node_t nodes[NUM_IRQ_NODES];
-+
-+void __init init_irq_proc(void)
-+{
-+      /* Insert /proc/irq driver here */
-+}
-+
-+static irqreturn_t default_irq_handler(int irq, void *ptr)
-+{
-+#if 1
-+      printk(KERN_INFO "%s(%d): default irq handler vec=%d [0x%x]\n",
-+              __FILE__, __LINE__, irq, irq);
-+#endif
-+      disable_irq(irq);
-+      return(IRQ_NONE);
-+}
-+
-+/*
-+ * void init_IRQ(void)
-+ *
-+ * Parameters:        None
-+ *
-+ * Returns:   Nothing
-+ *
-+ * This function should be called during kernel startup to initialize
-+ * the IRQ handling routines.
-+ */
-+
-+void __init init_IRQ(void)
-+{
-+      int i;
-+
-+      for (i = 0; i < NR_IRQS; i++) {
-+              irq_list[i].handler = default_irq_handler;
-+              irq_list[i].flags   = IRQ_FLG_STD;
-+              irq_list[i].dev_id  = NULL;
-+              irq_list[i].devname = NULL;
-+      }
-+
-+      for (i = 0; i < NUM_IRQ_NODES; i++)
-+              nodes[i].handler = NULL;
-+
-+      /* turn off all interrupts */
-+      clrimr(0);
-+
-+#ifdef DEBUG
-+      printk("init_IRQ done\n");
-+#endif
-+}
-+
-+irq_node_t *new_irq_node(void)
-+{
-+      irq_node_t *node;
-+      short i;
-+
-+      for (node = nodes, i = NUM_IRQ_NODES-1; i >= 0; node++, i--)
-+              if (!node->handler)
-+                      return node;
-+
-+      printk (KERN_INFO "new_irq_node: out of nodes\n");
-+      return NULL;
-+}
-+
-+int request_irq(unsigned int irq,
-+              irq_handler_t handler,
-+                unsigned long flags,
-+              const char *devname,
-+              void *dev_id)
-+{
-+      if (irq >= NR_IRQS) {
-+              printk (KERN_ERR "%s: Unknown IRQ %d from %s\n", __FUNCTION__, irq, devname);
-+              return -ENXIO;
-+      }
-+
-+      if (!(irq_list[irq].flags & IRQ_FLG_STD)) {
-+              if (irq_list[irq].flags & IRQ_FLG_LOCK) {
-+                      printk(KERN_ERR "%s: IRQ %d from %s is not replaceable\n",
-+                             __FUNCTION__, irq, irq_list[irq].devname);
-+                      return -EBUSY;
-+              }
-+              if (flags & IRQ_FLG_REPLACE) {
-+                      printk(KERN_ERR "%s: %s can't replace IRQ %d from %s\n",
-+                             __FUNCTION__, devname, irq, irq_list[irq].devname);
-+                      return -EBUSY;
-+              }
-+      }
-+      irq_list[irq].handler = handler;
-+      irq_list[irq].flags   = flags;
-+      irq_list[irq].dev_id  = dev_id;
-+      irq_list[irq].devname = devname;
-+
-+      setimr(1<<irq);
-+
-+      return 0;
-+}
-+
-+void free_irq(unsigned int irq, void *dev_id)
-+{
-+      if (irq >= NR_IRQS) {
-+              printk (KERN_ERR "%s: Unknown IRQ %d\n", __FUNCTION__, irq);
-+              return;
-+      }
-+
-+      if (irq_list[irq].dev_id != dev_id)
-+              printk(KERN_ERR "%s: Removing probably wrong IRQ %d from %s\n",
-+                     __FUNCTION__, irq, irq_list[irq].devname);
-+
-+      irq_list[irq].handler = default_irq_handler;
-+      irq_list[irq].flags   = IRQ_FLG_STD;
-+      irq_list[irq].dev_id  = NULL;
-+      irq_list[irq].devname = NULL;
-+
-+      clrimr(~(1<<irq));
-+}
-+
-+/* usually not useful in embedded systems */
-+unsigned long probe_irq_on (void)
-+{
-+      return 0;
-+}
-+
-+int probe_irq_off (unsigned long irqs)
-+{
-+      return 0;
-+}
-+
-+void enable_irq(unsigned int irq)
-+{
-+      setimr(1<<irq);
-+}
-+
-+void disable_irq(unsigned int irq)
-+{
-+      clrimr(~(1<<irq));
-+}
-+
-+int show_interrupts(struct seq_file *p, void *v)
-+{
-+      int i = *(loff_t *) v;
-+
-+      if (i == 0) {
-+              seq_printf(p, "   : %10u   spurious\n", num_spurious);
-+      }
-+
-+      if ((i < NR_IRQS) && (!(irq_list[i].flags & IRQ_FLG_STD))) {
-+              seq_printf(p, "%3d: %10u ", i, kstat_cpu(0).irqs[i]);
-+              if (irq_list[i].flags & IRQ_FLG_LOCK)
-+                      seq_printf(p, "L ");
-+              else
-+                      seq_printf(p, "  ");
-+              seq_printf(p, "%s\n", irq_list[i].devname);
-+      }
-+
-+      return 0;
-+}
-+
-+#ifdef CONFIG_PREEMPT_TIMES
-+extern void latency_cause(int,int);
-+#else
-+#define latency_cause(a, b)
-+#endif
-+asmlinkage void process_int(unsigned long vec, struct pt_regs *fp)
-+{
-+
-+      /* give the machine specific code a crack at it first */
-+      irq_enter();
-+      kstat_cpu(0).irqs[vec]++;
-+      latency_cause(-99,~vec);
-+
-+      if (irq_list[vec].handler) {
-+              if ((irq_list[vec].handler(vec, irq_list[vec].dev_id))==IRQ_NONE)
-+                      ;
-+      } else
-+#ifdef DEBUG
-+              {
-+              printk(KERN_ERR "No interrupt handler for level %ld\n", vec);
-+////          asm("trap 5");
-+              }
-+#else
-+  #if 1
-+              printk(KERN_ERR "Ignoring interrupt %ld: no handler\n", vec);
-+  #else
-+              panic("No interrupt handler for level %ld\n", vec);
-+  #endif
-+#endif
-+
-+      irq_exit();
-+}
-+
-+int get_irq_list(char *buf)
-+{
-+      int i, len = 0;
-+
-+      /* autovector interrupts */
-+      for (i = 0; i < NR_IRQS; i++) {
-+              if (irq_list[i].handler) {
-+                      len += sprintf(buf+len, "auto %2d: %10u ", i,
-+                                     i ? kstat_cpu(0).irqs[i] : num_spurious);
-+                      if (irq_list[i].flags & IRQ_FLG_LOCK)
-+                              len += sprintf(buf+len, "L ");
-+                      else
-+                              len += sprintf(buf+len, "  ");
-+                      len += sprintf(buf+len, "%s\n", irq_list[i].devname);
-+              }
-+      }
-+      return len;
-+}
-+EXPORT_SYMBOL(request_irq);
-+EXPORT_SYMBOL(free_irq);
-diff --git a/arch/nios2nommu/kernel/module.c b/arch/nios2nommu/kernel/module.c
-new file mode 100644
-index 0000000..99b270f
---- /dev/null
-+++ b/arch/nios2nommu/kernel/module.c
-@@ -0,0 +1,173 @@
-+/*  Kernel module help for Nios2.
-+    Copyright (C) 2004 Microtronix Datacom Ltd.
-+    Copyright (C) 2001,03  Rusty Russell
-+
-+    This program is free software; you can redistribute it and/or modify
-+    it under the terms of the GNU General Public License as published by
-+    the Free Software Foundation; either version 2 of the License, or
-+    (at your option) any later version.
-+
-+    This program is distributed in the hope that it will be useful,
-+    but WITHOUT ANY WARRANTY; without even the implied warranty of
-+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+    GNU General Public License for more details.
-+
-+    You should have received a copy of the GNU General Public License
-+    along with this program; if not, write to the Free Software
-+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+    
-+    Written by Wentao Xu <xuwentao@microtronix.com>
-+*/
-+#include <linux/moduleloader.h>
-+#include <linux/elf.h>
-+#include <linux/vmalloc.h>
-+#include <linux/fs.h>
-+#include <linux/string.h>
-+#include <linux/kernel.h>
-+
-+#if 0
-+#define DEBUGP printk
-+#else
-+#define DEBUGP(fmt , ...)
-+#endif
-+
-+void *module_alloc(unsigned long size)
-+{
-+      if (size == 0)
-+              return NULL;
-+      return vmalloc(size);
-+}
-+
-+
-+/* Free memory returned from module_alloc */
-+void module_free(struct module *mod, void *module_region)
-+{
-+      vfree(module_region);
-+      /* FIXME: If module_region == mod->init_region, trim exception
-+           table entries. */
-+}
-+
-+/* We don't need anything special. */
-+int module_frob_arch_sections(Elf_Ehdr *hdr,
-+                            Elf_Shdr *sechdrs,
-+                            char *secstrings,
-+                            struct module *mod)
-+{
-+      return 0;
-+}
-+
-+int apply_relocate(Elf32_Shdr *sechdrs,
-+                 const char *strtab,
-+                 unsigned int symindex,
-+                 unsigned int relsec,
-+                 struct module *me)
-+{
-+      printk(KERN_ERR "module %s: NO-ADD RELOCATION unsupported\n",
-+             me->name);
-+      return -ENOEXEC;
-+}
-+
-+
-+int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab,
-+                      unsigned int symindex, unsigned int relsec,
-+                      struct module *mod)
-+{
-+      unsigned int i;
-+      Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
-+
-+      DEBUGP ("Applying relocate section %u to %u\n", relsec,
-+              sechdrs[relsec].sh_info);
-+
-+      for (i = 0; i < sechdrs[relsec].sh_size / sizeof (*rela); i++) {
-+              /* This is where to make the change */
-+              uint32_t word;
-+              uint32_t *loc
-+                      = ((void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
-+                         + rela[i].r_offset);
-+              /* This is the symbol it is referring to.  Note that all
-+                 undefined symbols have been resolved.  */
-+              Elf32_Sym *sym
-+                      = ((Elf32_Sym *)sechdrs[symindex].sh_addr
-+                         + ELF32_R_SYM (rela[i].r_info));
-+              uint32_t v = sym->st_value + rela[i].r_addend;
-+
-+              switch (ELF32_R_TYPE (rela[i].r_info)) {
-+              case R_NIOS2_NONE:
-+                      break;
-+                      
-+              case R_NIOS2_BFD_RELOC_32:
-+                      *loc += v;
-+                      break;
-+                      
-+              case R_NIOS2_PCREL16:
-+                      v -= (uint32_t)loc + 4;
-+                      if ((int32_t)v > 0x7fff ||
-+                                      (int32_t)v < -(int32_t)0x8000) {
-+                              printk(KERN_ERR
-+                                     "module %s: relocation overflow\n",
-+                                     mod->name);
-+                              return -ENOEXEC;
-+                      }
-+                      word = *loc;
-+                      *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
-+                      break;
-+                      
-+              case R_NIOS2_CALL26:
-+                      if (v & 3) {
-+                              printk(KERN_ERR
-+                                     "module %s: dangerous relocation\n",
-+                                     mod->name);
-+                              return -ENOEXEC;
-+                      }
-+                      if ((v >> 28) != ((uint32_t)loc >> 28)) {
-+                              printk(KERN_ERR
-+                                     "module %s: relocation overflow\n",
-+                                     mod->name);
-+                              return -ENOEXEC;
-+                      }
-+                      *loc = (*loc & 0x3f) | ((v >> 2) << 6);
-+                      break;
-+                      
-+              case R_NIOS2_HI16:
-+                      word = *loc;
-+                      *loc = ((((word >> 22) << 16) | ((v >>16) & 0xffff)) << 6) | 
-+                                      (word & 0x3f);
-+                      break;
-+                                      
-+              case R_NIOS2_LO16:
-+                      word = *loc;
-+                      *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | 
-+                                      (word & 0x3f);
-+                      break;
-+                                      
-+              case R_NIOS2_HIADJ16:
-+                      {
-+                              Elf32_Addr word2;
-+                              
-+                              word = *loc;
-+                              word2 = ((v >> 16) + ((v >> 15) & 1)) & 0xffff;
-+                              *loc = ((((word >> 22) << 16) | word2) << 6) | 
-+                                              (word & 0x3f);
-+                      }
-+                      break;
-+
-+              default:
-+                      printk (KERN_ERR "module %s: Unknown reloc: %u\n",
-+                              mod->name, ELF32_R_TYPE (rela[i].r_info));
-+                      return -ENOEXEC;
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+int module_finalize(const Elf_Ehdr *hdr,
-+                  const Elf_Shdr *sechdrs,
-+                  struct module *me)
-+{
-+      return 0;
-+}
-+
-+void module_arch_cleanup(struct module *mod)
-+{
-+}
-diff --git a/arch/nios2nommu/kernel/nios2_ksyms.c b/arch/nios2nommu/kernel/nios2_ksyms.c
-new file mode 100644
-index 0000000..720f007
---- /dev/null
-+++ b/arch/nios2nommu/kernel/nios2_ksyms.c
-@@ -0,0 +1,113 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/kernel/nios_ksyms.c
-+ *
-+ * Derived from Nios1
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * vic - copied from v850
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+//;dgt2;tmp;
-+
-+#include <linux/module.h>
-+#include <linux/linkage.h>
-+#include <linux/sched.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/user.h>
-+#include <linux/elfcore.h>
-+#include <linux/in6.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/setup.h>
-+#include <asm/pgalloc.h>
-+#include <asm/irq.h>
-+#include <asm/io.h>
-+#include <asm/semaphore.h>
-+#include <asm/checksum.h>
-+#include <asm/hardirq.h>
-+#include <asm/current.h>
-+
-+extern void dump_thread(struct pt_regs *, struct user *);
-+/* platform dependent support */
-+
-+EXPORT_SYMBOL(__ioremap);
-+EXPORT_SYMBOL(iounmap);
-+EXPORT_SYMBOL(dump_fpu);
-+EXPORT_SYMBOL(dump_thread);
-+
-+EXPORT_SYMBOL(kernel_thread);
-+
-+/* Networking helper routines. */
-+EXPORT_SYMBOL(csum_partial_copy);
-+
-+EXPORT_SYMBOL(memcpy);
-+EXPORT_SYMBOL(memset);
-+EXPORT_SYMBOL(memmove);
-+
-+EXPORT_SYMBOL(__down);
-+EXPORT_SYMBOL(__down_interruptible);
-+EXPORT_SYMBOL(__down_trylock);
-+EXPORT_SYMBOL(__up);
-+
-+EXPORT_SYMBOL(get_wchan);
-+
-+/*
-+ * libgcc functions - functions that are used internally by the
-+ * compiler...  (prototypes are not correct though, but that
-+ * doesn't really matter since they're not versioned).
-+ */
-+extern void __gcc_bcmp(void);
-+extern void __ashldi3(void);
-+extern void __ashrdi3(void);
-+extern void __cmpdi2(void);
-+extern void __divdi3(void);
-+extern void __divsi3(void);
-+extern void __lshrdi3(void);
-+extern void __moddi3(void);
-+extern void __modsi3(void);
-+extern void __muldi3(void);
-+extern void __mulsi3(void);
-+extern void __negdi2(void);
-+extern void __ucmpdi2(void);
-+extern void __udivdi3(void);
-+extern void __udivmoddi4(void);
-+extern void __udivsi3(void);
-+extern void __umoddi3(void);
-+extern void __umodsi3(void);
-+
-+        /* gcc lib functions */
-+EXPORT_SYMBOL(__gcc_bcmp);
-+EXPORT_SYMBOL(__ashldi3);
-+EXPORT_SYMBOL(__ashrdi3);
-+EXPORT_SYMBOL(__cmpdi2);
-+EXPORT_SYMBOL(__divdi3);
-+EXPORT_SYMBOL(__divsi3);
-+EXPORT_SYMBOL(__lshrdi3);
-+EXPORT_SYMBOL(__moddi3);
-+EXPORT_SYMBOL(__modsi3);
-+EXPORT_SYMBOL(__muldi3);
-+EXPORT_SYMBOL(__mulsi3);
-+EXPORT_SYMBOL(__negdi2);
-+EXPORT_SYMBOL(__ucmpdi2);
-+EXPORT_SYMBOL(__udivdi3);
-+EXPORT_SYMBOL(__udivmoddi4);
-+EXPORT_SYMBOL(__udivsi3);
-+EXPORT_SYMBOL(__umoddi3);
-+EXPORT_SYMBOL(__umodsi3);
-diff --git a/arch/nios2nommu/kernel/nios_gdb_stub.c b/arch/nios2nommu/kernel/nios_gdb_stub.c
-new file mode 100644
-index 0000000..103925b
---- /dev/null
-+++ b/arch/nios2nommu/kernel/nios_gdb_stub.c
-@@ -0,0 +1,1456 @@
-+// Modified for uClinux - Vic - Apr 2002
-+// From:
-+
-+// File: nios_gdb_stub.c
-+// Date: 2000 June 20
-+// Author dvb \ Altera Santa Cruz
-+
-+#ifndef __KERNEL__
-+#include "nios.h"
-+#else
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <asm/nios.h>
-+#endif
-+
-+#include "nios_gdb_stub.h"
-+
-+#define na_debug_peripheral_irq 8
-+
-+enum
-+{
-+  na_BreakpointTrap     = 3,
-+  na_SingleStepTrap     = 4,
-+  na_StartGDBTrap       = 5
-+};
-+
-+
-+#ifdef __KERNEL__
-+
-+extern int _etext;
-+
-+static void puts( unsigned char *s )
-+{
-+      while(*s) {
-+              while (!(nasys_printf_uart->np_uartstatus & np_uartstatus_trdy_mask));
-+              nasys_printf_uart->np_uarttxdata = *s++;
-+      }
-+}
-+
-+#endif        // __KERNEL__
-+
-+// --------------------------------
-+// Local Prototypes
-+
-+#if GDB_DEBUG_PRINT
-+
-+static void StringFit(char *s,int w);
-+
-+// --------------------------------
-+// Debugging The Debugger
-+
-+void GDB_RawMessage(char *s)
-+      {
-+      StringFit(s,32);
-+      nr_pio_lcdwritescreen(s);
-+      }
-+#else
-+      #define GDB_RawMessage(a,b,c)   // define away to nothing
-+#endif
-+
-+#if GDB_DEBUG_PRINT
-+void GDB_Print2(char *s,int n1,int n2)
-+      {
-+      char st[1000];
-+
-+      sprintf(st,s,n1,n2);
-+      GDB_RawMessage(st);
-+      }
-+#else
-+      #define GDB_Print2(a,b,c)       // define away to nothing
-+#endif
-+
-+// If string is longer than w, cut out the middle.
-+
-+#if GDB_DEBUG_PRINT
-+int StringLen(char *s)
-+      {
-+      int l = 0;
-+
-+      while(*s++)
-+              l++;
-+      return l;
-+      }
-+
-+static void StringFit(char *s,int w)
-+      {
-+      if(StringLen(s) > w)
-+              {
-+              int i;
-+
-+
-+              w = w / 2;
-+
-+              for(i = 0; i < w; i++)
-+                      {
-+                      s[i + w] = s[StringLen(s) - w + i];
-+                      }
-+              s[w + w] = 0;
-+              }
-+      }
-+#endif
-+
-+// ---------------------------------------------
-+// Generic routines for dealing with
-+// hex input, output, and parsing
-+// (Adapted from other stubs.)
-+
-+NiosGDBGlobals gdb = {0};             // not static: the ISR uses it!
-+
-+static char dHexChars[16] = "0123456789abcdef";
-+
-+/*
-+ * HexCharToValue -- convert a characters
-+ *                   to its hex value, or -1 if not.
-+ */
-+char HexCharToValue(char c)
-+{
-+      char result=0;
-+
-+      if(c >= '0' && c <= '9')
-+              result = c - '0';
-+      else if(c >= 'a' && c <= 'f')
-+              result = c - 'a' + 10;
-+      else if(c >= 'A' && c <= 'F')
-+              result = c - 'A' + 10;
-+      else
-+              result = -1;
-+      return result;
-+}
-+
-+/*
-+ * HexStringToValue -- convert a 2*byte_width string of characters
-+ *                   to its little endian hex value,
-+ *                 or -1 if not.
-+ *            This routine is for strings of hex values
-+ */
-+unsigned long HexStringToValue(char *c, int byte_width)
-+{
-+      unsigned long result=0;
-+      unsigned char a,b;
-+      int i=0;
-+
-+      while (i < byte_width)
-+      {
-+              a = HexCharToValue(*c++);
-+              if (a & 0x80) return a;
-+              b = HexCharToValue(*c++);
-+              if (b & 0x80) return b;
-+              b = (a<<4) | (b&0x0f);
-+              result |= b << (i*8);
-+              i++;
-+      }
-+      return result;
-+}
-+
-+/*
-+ * Hex2Value -- convert a non-hex char delimited string
-+ *            to its big endian hex value.
-+ *            This routine is for address and byte count values
-+ */
-+
-+char *Hex2Value(char *hexIn, int *valueOut)
-+      {
-+      char c;
-+      int digitValue;
-+      int value = 0;
-+
-+      while(1)
-+              {
-+              c = *hexIn;
-+              digitValue = HexCharToValue(c);
-+              if(digitValue < 0)
-+                      {
-+                      *valueOut = value;
-+                      return hexIn;
-+                      }
-+              hexIn++;
-+              value = (value << 4) + digitValue;
-+              }
-+      }
-+
-+/*
-+ * HexToMem -- convert a string to a specified
-+ *             number of bytes in memory.
-+ *
-+ *            JMB -- make this thing a bit smarter so
-+ *                       that it selects the byte width to
-+ *                       write based on the number of bytes
-+ *                       and the destination address alignment.
-+ *                       This is to support writes to non-byte enabled
-+ *                       peripheral registers...I don't like it.
-+ *                       Beware! there are cases where it wont work
-+ */
-+char *HexToMem(char *hexIn, char *memOut, int memByteCount)
-+{
-+      int i;
-+      unsigned long x;
-+      short *memOutS=0;
-+      long *memOutL=0;
-+      int byte_width;
-+
-+      //determine maximum byte width
-+      if (((memByteCount%2) != 0) || (((unsigned int)memOut%2) != 0))
-+              byte_width = 1;
-+      else if (((memByteCount % 4) != 0) || (((unsigned int)memOut % 4) != 0))
-+      {
-+              byte_width = 2;
-+              memOutS = (short *)memOut;
-+      }
-+      else
-+      {
-+              byte_width = 4;
-+              memOutL = (long *)memOut;
-+      }
-+      for(i = 0; i < memByteCount; i+=byte_width)
-+      {
-+              x = HexStringToValue(hexIn,byte_width);
-+              hexIn += byte_width*2;
-+              switch (byte_width)
-+              {
-+              case 1:
-+                      *memOut++ = (unsigned char) 0x000000ff & x;
-+                      break;
-+              case 2:
-+                      *memOutS++ = (unsigned short) 0x0000ffff & x;
-+                      break;
-+              case 4:
-+                      *memOutL++ = x;
-+                      break;
-+              default:
-+                      //How could this ever happen???
-+                      break;
-+              }
-+      }
-+
-+      return hexIn;
-+}
-+
-+char *MemToHex(char *memIn, char *hexOut, int memByteCount)
-+{
-+      int i,j;
-+      int byte_width;
-+      unsigned long x=0;
-+      unsigned short *memInS=0;
-+      unsigned long *memInL=0;
-+
-+      //determine maximum byte width
-+      if (((memByteCount % 2) != 0) || (((unsigned int)memIn % 2) != 0))
-+              byte_width = 1;
-+      else if (((memByteCount % 4) != 0) || (((unsigned int)memIn % 4) != 0))
-+      {
-+              byte_width = 2;
-+              memInS = (short *)memIn;
-+      }
-+      else
-+      {
-+              byte_width = 4;
-+              memInL = (long *)memIn;
-+      }
-+
-+      for(i = 0; i < memByteCount; i+=byte_width)
-+      {
-+              switch (byte_width)
-+              {
-+              case 1:
-+                      x = *memIn++;
-+                      break;
-+              case 2:
-+                      x = *memInS++;
-+                      break;
-+              case 4:
-+                      x = *memInL++;
-+                      break;
-+              default:
-+                      //How would we get here?
-+                      break;
-+              }
-+
-+              for (j=0; j<byte_width; j++)
-+              {
-+                      *hexOut++ = dHexChars[(x&0x000000f0)>>4];
-+                      *hexOut++ = dHexChars[x&0x0000000f];
-+                      x = x>>8;
-+              }
-+      }
-+
-+      *hexOut = 0;
-+
-+      return hexOut;
-+}
-+
-+//Send just the + or - to indicate
-+//ACK or NACK
-+void GDBPutAck (char ack)
-+{
-+      if (gdb.comlink == ne_gdb_serial)
-+              GDBPutChar (ack);
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+      else
-+      {
-+              if (gdb.host_ip_address != 0)
-+                      nr_plugs_send_to (gdb.gdb_eth_plug, &ack, 1, 0,
-+                              gdb.host_ip_address,
-+                              gdb.host_port_number);
-+      }
-+#endif
-+#endif
-+}
-+
-+/*
-+ * Once a $ comes in, use GetGDBPacket to
-+ * retrieve a full gdb packet, and verify
-+ * checksum, and reply + or -.
-+ */
-+int GetGDBPacket(char *aBuffer)
-+{
-+      int checksum=0;
-+      int length=0;
-+      char c;
-+      int x=0;
-+
-+      if (gdb.comlink == ne_gdb_serial)
-+      {
-+              while ((c = GDBGetChar ()) != '$') ;
-+
-+startPacket:
-+              length = 0;
-+              checksum = 0;
-+              while(((c = GDBGetChar()) != '#') && (length < kTextBufferSize))
-+              {
-+                      if(c == '$')
-+                              goto startPacket;
-+                      checksum += c;
-+                      aBuffer[length++] = c;
-+                      aBuffer[length] = 0;
-+              }
-+
-+              c = GDBGetChar();
-+              x = HexCharToValue(c) << 4;
-+              c = GDBGetChar();
-+              x += HexCharToValue(c);
-+
-+
-+              checksum &= 0xff;
-+
-+              GDB_Print2("GetPacket %d",length,0);
-+      }
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+      else
-+      {
-+              int srcidx;
-+              // wait till beginning of packet
-+              while (gdb.textBuffer[0] != '$') nr_plugs_idle();
-+startEPacket:
-+              length = 0;
-+              checksum = 0;
-+              srcidx = 1;
-+
-+              //loop until packet terminator
-+              //leave enough room for the checksum at the end
-+              while (((c = gdb.textBuffer[srcidx++]) != '#') && (srcidx < kTextBufferSize-2))
-+              {
-+                      if (c == '$')
-+                              goto startEPacket;
-+
-+                      checksum += c;
-+                      aBuffer[length++] = c;
-+              }
-+
-+              c = gdb.textBuffer[srcidx++];
-+              x = HexCharToValue(c) << 4;
-+              c = gdb.textBuffer[srcidx++];
-+              x += HexCharToValue (c);
-+
-+              aBuffer[length++] = 0;
-+
-+              checksum &= 0xff;
-+
-+              GDB_Print2("GetPacket %d",length,0);
-+      }
-+#endif
-+#endif
-+
-+      if(checksum != x)
-+      {
-+              GDBPutAck('-');
-+              length = 0;
-+      }
-+      else
-+      {
-+              GDBPutAck('+');
-+      }
-+      return length;
-+}
-+
-+//Wait for acknowledgement
-+//Should we have some way of timing out???
-+//return TRUE if ACK
-+//return FALSE if NACK
-+int GDBGetACK (void)
-+{
-+      char c;
-+      if (gdb.comlink == ne_gdb_serial)
-+      {
-+              while (1)
-+              {
-+                      c = GDBGetChar ();
-+                      if (c == '+') return (1);
-+                      else if (c == '-') return (0);
-+              }
-+
-+      }
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+      else
-+      {
-+              gdb.ACKstatus = ne_gdb_ack_waiting;
-+              while (1)
-+              {
-+                      nr_plugs_idle ();
-+                      if (gdb.ACKstatus == ne_gdb_ack_acked)
-+                      {
-+                              gdb.ACKstatus = ne_gdb_ack_notwaiting;
-+                              return (1);
-+                      }
-+                      else if (gdb.ACKstatus == ne_gdb_ack_nacked)
-+                      {
-+                              gdb.ACKstatus = ne_gdb_ack_notwaiting;
-+                              return (0);
-+                      }
-+              }
-+      }
-+#endif
-+#endif
-+      return(0);
-+}
-+
-+/*
-+ * Send a packet, preceded by $,
-+ * and followed by #checksum.
-+ */
-+void PutGDBPacket(char *aBuffer)
-+{
-+      int checksum;
-+      char c;
-+      char *origPtr;
-+      int cnt=0;
-+
-+      origPtr = aBuffer; // Remember in case we get a NACK
-+      if (gdb.comlink == ne_gdb_serial)
-+      {
-+startPutSerial:
-+              GDBPutChar('$');
-+              checksum = 0;
-+              while((c = *aBuffer++) != 0)
-+              {
-+                      checksum += c;
-+                      GDBPutChar(c);
-+              }
-+              GDBPutChar('#');
-+              GDBPutChar(dHexChars[(checksum >> 4) & 15]);
-+              GDBPutChar(dHexChars[checksum & 15]);
-+
-+              if (!GDBGetACK ())
-+              {
-+                aBuffer = origPtr;
-+                      if (++cnt < GDB_RETRY_CNT) goto startPutSerial;
-+              }
-+      }
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+      else
-+      {
-+              if (gdb.host_ip_address != 0)
-+              {
-+                      int i;
-+                      int result;
-+                      char c1;
-+
-+                      i = 0;
-+                      c = aBuffer[i];
-+                      if (c==0) return; //there is no data in packet, so why bother sending
-+                      aBuffer[i++] = '$';
-+                      checksum = 0;
-+                      do
-+                      {
-+                              checksum += c;
-+                              c1 = aBuffer[i];
-+                              aBuffer[i++] = c;
-+                              c = c1;
-+                      } while (c != 0);
-+
-+                      aBuffer[i++] = '#';
-+                      aBuffer[i++] = dHexChars[(checksum >> 4) & 15];
-+                      aBuffer[i++] = dHexChars[checksum & 15];
-+                      aBuffer[i++] = 0;
-+startPutEth:
-+                      result = nr_plugs_send_to (gdb.gdb_eth_plug, aBuffer, i, 0,
-+                              gdb.host_ip_address,
-+                              gdb.host_port_number);
-+
-+                      if (!GDBGetACK ())
-+                      {
-+                              if (++cnt < GDB_RETRY_CNT) goto startPutEth;
-+                      }
-+                      aBuffer[0] = 0; //clear packet to
-+              }
-+      }
-+#endif
-+#endif
-+}
-+
-+int PutTracePacket(char *aBuffer, int size)
-+{
-+      int checksum;
-+#ifdef ethernet_exists
-+      char c;
-+#endif
-+      int i;
-+      int cnt=0;
-+
-+      if (gdb.comlink == ne_gdb_serial)
-+      {
-+startPutSerial:
-+              GDBPutChar('$');
-+              checksum = 0;
-+              for (i=0; i<size; i++)
-+              {
-+                      checksum += aBuffer[i];
-+                      GDBPutChar (aBuffer[i]);
-+              }
-+              GDBPutChar('#');
-+              GDBPutChar(dHexChars[(checksum >> 4) & 15]);
-+              GDBPutChar(dHexChars[checksum & 15]);
-+
-+              if (!GDBGetACK ())
-+              {
-+                      if (++cnt < GDB_RETRY_CNT) goto startPutSerial;
-+              }
-+      }
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+      else
-+      {
-+              int result;
-+              char c1;
-+
-+              checksum = 0;
-+              c = '$';
-+              for (i=0; i<size; i++)
-+              {
-+                      checksum += aBuffer[i];
-+                      c1 = aBuffer[i];
-+                      aBuffer[i] = c;
-+                      c = c1;
-+              }
-+              aBuffer[i++] = c;
-+
-+              aBuffer[i++] = '#';
-+              aBuffer[i++] = dHexChars[(checksum >> 4) & 15];
-+              aBuffer[i++] = dHexChars[checksum & 15];
-+              aBuffer[i++] = 0;
-+ethResend:
-+              if (gdb.host_ip_address != 0)
-+              {
-+                      result = nr_plugs_send_to (gdb.gdb_eth_plug, aBuffer, i, 0,
-+                              gdb.host_ip_address,
-+                              gdb.host_port_number);
-+              }
-+              if (!GDBGetACK ())
-+              {
-+                      if (++cnt < GDB_RETRY_CNT) goto ethResend;
-+              }
-+              aBuffer[0]=0;
-+      }
-+#endif
-+#endif
-+      if (cnt < GDB_RETRY_CNT) return 1;
-+      else return 0;
-+}
-+
-+void PutGDBOKPacket(char *aBuffer)
-+      {
-+      aBuffer[0] = 'O';
-+      aBuffer[1] = 'K';
-+      aBuffer[2] = 0;
-+      PutGDBPacket(aBuffer);
-+      }
-+
-+#if nasys_debug_core
-+
-+//some defines used exclusively for TRACE data xfer
-+//stepsize is the ascii hex step value i.e. twice the binary length
-+#define stepsize (2*(2*sizeof(int) + sizeof (char)))
-+#define MAX_TRACE_BYTES       (((int)((2*MAX_DATA_SIZE-2)/stepsize))*stepsize)
-+
-+int Trace_Read_Intercept (char *aBuffer)
-+{
-+      int cnt=0;
-+      unsigned int data;
-+      unsigned char code;
-+      int byteCount;
-+      unsigned char *w;
-+      unsigned short dataAccumulate;
-+      int status;
-+
-+      w = aBuffer;
-+      w++;    //skip past the m
-+      if (*w++ == 't')  //see if this is a special "memory trace" packet
-+      {
-+              w = Hex2Value(w,&byteCount); //get the number of bytes to transfer
-+
-+              //turn byteCount to a multiple of stepsize
-+              byteCount = ((int)(byteCount/stepsize))*stepsize;
-+
-+              //wait until fifo empties
-+              nm_debug_get_reg(status, np_debug_write_status);
-+              while (status&np_debug_write_status_writing_mask) nm_debug_get_reg(status,np_debug_write_status);
-+
-+              // loop through total size
-+              while (byteCount > 0)
-+              {
-+                      w=aBuffer;      //reset w to beginning of buffer
-+
-+                      //calculate the number of bytes in this packet
-+                      if (byteCount > MAX_TRACE_BYTES) dataAccumulate = MAX_TRACE_BYTES;
-+                      else dataAccumulate = byteCount;
-+
-+                      //insert data size at beginning of packet
-+                      w = MemToHex((char *)&dataAccumulate, w, sizeof (dataAccumulate));
-+
-+                      byteCount -= dataAccumulate; //decrement byteCount
-+
-+                      // accumulate a full buffer
-+                      for (cnt=0; cnt<dataAccumulate; cnt+=stepsize)
-+                      {
-+                              int valid;
-+                              nm_debug_set_reg (1, np_debug_read_sample); //begin transaction
-+
-+                              //wait until data is ready
-+                              nm_debug_get_reg (valid, np_debug_data_valid);
-+                              while (!valid) nm_debug_get_reg(valid,np_debug_data_valid) ;
-+
-+                              nm_debug_get_reg (data, np_debug_trace_address);
-+                              w = MemToHex ((char *)&data, w, sizeof (int));
-+
-+                              nm_debug_get_reg (data, np_debug_trace_data);
-+                              w = MemToHex ((char *)&data, w, sizeof (int));
-+
-+                              nm_debug_get_reg (data, np_debug_trace_code);
-+                              w = MemToHex ((char *)&data, w, sizeof (char));
-+                      }
-+
-+                      //if one of our data packets doesn't make it, stop sending them
-+                      //if (PutTracePacket (aBuffer,dataAccumulate+4) != 1) //+4 for size filed
-+                      //      byteCount = 0;
-+                      /* kenw - My module can't handle the incoming data fast enough.  So
-+                       * send this one packet, and wait for another mt command.
-+                       */
-+                      PutTracePacket (aBuffer,dataAccumulate+4);
-+                      byteCount = 0;
-+              }
-+              return 1;
-+      }
-+      return 0;
-+}
-+
-+/*
-+#undef stepsize
-+#undef MAX_TRACE_BYTES
-+*/
-+
-+#endif
-+
-+void DoGDBCommand_m(char *aBuffer)
-+      {
-+      char *w;
-+      int startAddr,byteCount;
-+
-+#if nasys_debug_core
-+      /* intercept some access to the dbg peripheral */
-+      if (Trace_Read_Intercept (aBuffer)) return;
-+#endif
-+
-+      w = aBuffer;
-+      w++;                            // past 'm'
-+      w = Hex2Value(w,&startAddr);
-+      w++;                            // past ','
-+      w = Hex2Value(w,&byteCount);
-+
-+      if (byteCount > MAX_DATA_SIZE) byteCount = MAX_DATA_SIZE;
-+
-+      // mA,L -- request memory
-+      w = aBuffer;
-+      w = MemToHex((char *)startAddr,w,byteCount);
-+      PutGDBPacket(aBuffer);
-+      }
-+
-+void DoGDBCommand_M(char *aBuffer)
-+      {
-+      char *w;
-+      int startAddr,byteCount;
-+
-+      w = aBuffer;
-+      w++;                            // past 'M'
-+      w = Hex2Value(w,&startAddr);
-+      w++;                            // past ','
-+      w = Hex2Value(w,&byteCount);
-+      w++;                            // past ':'
-+
-+      GDB_Print2("M from %x to %x",startAddr,byteCount);
-+
-+      // MA,L:values -- write to memory
-+
-+      w = HexToMem(w,(char *)startAddr,byteCount);
-+
-+      // Send "OK"
-+      PutGDBOKPacket(aBuffer);
-+      }
-+
-+int Debug_Read_Intercept (char *aBuffer)
-+{
-+      unsigned int data;
-+      int index;
-+      unsigned char *w;
-+
-+      w = aBuffer;
-+      w++;    //skip past the g
-+      if (*w++ == 'g')  //see if this is a special "register read" packet
-+      {
-+          w = Hex2Value(w,&index); //get the index of the register to be read
-+
-+          nm_debug_get_reg (data, index);
-+
-+          //assemble the output packet
-+          w=aBuffer;  //reset w to beginning of buffer
-+          w = MemToHex((char *)&data, w, sizeof (data));
-+          *w++ = 0;
-+
-+          //now send it
-+          PutTracePacket (aBuffer,sizeof (data) * 2);
-+
-+          return 1;
-+      }
-+      return 0;
-+}
-+
-+// Return the values of all the registers
-+void DoGDBCommand_g(NiosGDBGlobals *g)
-+      {
-+      char *w;
-+
-+      if (Debug_Read_Intercept (g->textBuffer)) return;
-+
-+      w = g->textBuffer;
-+
-+      w = MemToHex((char *)(&g->registers),w,sizeof(g->registers));
-+      PutGDBPacket(g->textBuffer);
-+      GDB_Print2("Sent            Registers",0,0);
-+      }
-+
-+int Debug_Write_Intercept (char *aBuffer)
-+{
-+      unsigned int data;
-+      int index;
-+      unsigned char *w;
-+
-+      w = aBuffer;
-+      w++;    //skip past the g
-+      if (*w++ == 'g')  //see if this is a special "register read" packet
-+      {
-+          w = Hex2Value(w,&index); //get the index of the register to be written
-+          w++;                                // past ','
-+          w = Hex2Value(w,&data);
-+
-+          nm_debug_set_reg (data, index);
-+
-+          //now send it
-+          // Send "OK"
-+          PutGDBOKPacket(aBuffer);
-+
-+          return 1;
-+      }
-+      return 0;
-+}
-+
-+void DoGDBCommand_G(NiosGDBGlobals *g)
-+      {
-+      char *w;
-+
-+      if (Debug_Write_Intercept (g->textBuffer)) return;
-+
-+      w = g->textBuffer;
-+      w++;    // skip past 'G'
-+      w = HexToMem(w,(char *)(&g->registers), sizeof(g->registers) );
-+
-+      // Send "OK"
-+      PutGDBOKPacket(g->textBuffer);
-+
-+      GDB_Print2("Received        Registers",0,0);
-+      }
-+
-+// Return last signal value
-+void DoGDBCommand_qm(NiosGDBGlobals *g)
-+      {
-+      char *w;
-+
-+      w = g->textBuffer;
-+
-+      *w++ = 'S';
-+      *w++ = '2';
-+      *w++ = '3';     // make up a signal for now...
-+      *w++ = 0;
-+      PutGDBPacket(g->textBuffer);
-+      }
-+
-+void DoGDBCommand_q(NiosGDBGlobals *g)
-+{
-+#ifdef na_ssram_detect_in
-+      short int* ssram_exists;
-+#endif
-+      char *w;
-+      w = g->textBuffer;
-+
-+      w++;    /* skip past the q */
-+      switch (*w) {
-+              case ('A'):
-+                      w = g->textBuffer;
-+
-+                      /* handle intialization information */
-+                      /* is nios_ocd available? */
-+#ifdef nasys_debug_core
-+                      *w++ = nasys_debug_core + '0';
-+#else
-+                      *w++ = '0';
-+#endif
-+                      *w++ = ',';
-+
-+                      /* determine if the SSRAM debugger board is
-+                       * physically present */
-+#ifdef na_ssram_detect_in
-+                      ssram_exists = (short int*) na_ssram_detect_in;
-+                      *w++ = !(*ssram_exists) + '0';
-+#else
-+                      *w++ = '0';
-+#endif
-+                      *w++ = ',';
-+
-+                      /* print out the max size of a trace packet */
-+#if nasys_debug_core
-+                      sprintf (w, "%04x", MAX_TRACE_BYTES);
-+#else
-+                      sprintf (w, "0000");
-+#endif
-+
-+                      break;
-+              case ('B'):
-+                      w = g->textBuffer;
-+
-+                      /* returns 1 if it was an OCD interrupt
-+                       * returns 0 if it was software breakpoint */
-+                      if (gdb.trapNumber == nasys_debug_core_irq) {
-+                              *w++ = '1';
-+                      } else {
-+                              *w++ = '0';
-+                      }
-+
-+                      *w++ = 0;
-+                      break;
-+              default:
-+                      w = g->textBuffer;
-+
-+                      *w = 0;
-+                      break;
-+      }
-+
-+      PutGDBPacket(g->textBuffer);
-+}
-+
-+
-+void GDBInsertBreakpoint(NiosGDBGlobals *g,short *address)
-+      {
-+      NiosGDBBreakpoint *b;
-+
-+      GDB_Print2("breakpoint 0x%x",(int)address,0);
-+      if(g->breakpointCount < kMaximumBreakpoints)
-+              {
-+              b = &g->breakpoint[g->breakpointCount++];
-+              b->address = address;
-+              b->oldContents = *b->address;
-+              *b->address = 0x7904;
-+              }
-+      }
-+
-+void GDBRemoveBreakpoints(NiosGDBGlobals *g)
-+      {
-+      NiosGDBBreakpoint *b;
-+      int i;
-+
-+      for(i = 0; i < g->breakpointCount; i++)
-+              {
-+              b = &g->breakpoint[i];
-+              *b->address = b->oldContents;
-+              b->address = 0;
-+              }
-+
-+      g->breakpointCount = 0;
-+      }
-+
-+int NiosInstructionIsTrap5(unsigned short instruction)
-+      {
-+      return instruction == 0x7905;
-+      }
-+
-+int NiosInstructionIsPrefix(unsigned short instruction)
-+      {
-+      return (instruction >> 11) == 0x13;
-+      }
-+
-+int NiosInstructionIsSkip(unsigned short instruction)
-+      {
-+      int op6;
-+      int op11;
-+
-+      op6 = (instruction >> 10);
-+      op11 = (instruction >> 5);
-+
-+      return (op6 == 0x14             // SKP0
-+              || op6 == 0x15          // SKP1
-+              || op11 == 0x3f6        // SKPRz
-+              || op11 == 0x3f7        // SKPS
-+              || op11 == 0x3fa);      // SKPRnz
-+      }
-+
-+int NiosInstructionIsBranch(unsigned short instruction,short *pc,short **branchTargetOut)
-+      {
-+      int op4;
-+      int op7;
-+      int op10;
-+      short *branchTarget = 0;
-+      int result = 0;
-+
-+      op4 = (instruction >> 12);
-+      op7 = (instruction >> 9);
-+      op10 = (instruction >> 6);
-+
-+      if(op4 == 0x08)         // BR, BSR
-+              {
-+              int offset;
-+
-+              result = 1;
-+              offset = instruction & 0x07ff;
-+              if(offset & 0x400)      // sign extend
-+                      offset |= 0xffffF800;
-+              branchTarget = pc + offset + 1; // short * gets x2 scaling automatically
-+              }
-+      else if(op10 == 0x1ff)  // JMP, CALL
-+              {
-+              result = 1;
-+              branchTarget = (short *)(gdb.registers.r[instruction & 31] * 2);
-+              }
-+      else if(op7 == 0x3d)    // JMPC, CALLC
-+              {
-+              result = 1;
-+              branchTarget = pc + 1 + (instruction & 0x0ffff);
-+#ifdef __nios32__
-+              branchTarget = (short *)((int)branchTarget & 0xffffFFFc);       // align 32...
-+#else
-+              branchTarget = (short *)((int)branchTarget & 0xFFFe);           // align 16...
-+#endif
-+              branchTarget = (short *)(*(int *)branchTarget);
-+              }
-+
-+      if(branchTargetOut)
-+              *branchTargetOut = branchTarget;
-+
-+      return result;
-+      }
-+
-+// -------------------------
-+// Step at address
-+//
-+// "stepping" involves inserting a
-+// breakpoint at some reasonable
-+// spot later than the current program
-+// counter
-+//
-+// On the Nios processor, this is
-+// nontrivial. For example, we should
-+// not break up a PFX instruction.
-+
-+void DoGDBCommand_s(NiosGDBGlobals *g)
-+      {
-+      char *w;
-+      int x;
-+      short *pc;
-+      short *branchTarget;
-+      unsigned short instruction;
-+      int stepType;
-+
-+      /*
-+       * First, if there's an argument to the packet,
-+       * set the new program-counter value
-+       */
-+
-+      w = g->textBuffer;
-+      w++;
-+      if(HexCharToValue(*w) >= 0)
-+              {
-+              w = Hex2Value(w,&x);
-+              g->registers.pc = x;
-+              }
-+
-+      /*
-+       * Scan forward to see what the
-+       * most appropriate location(s) for
-+       * a breakpoint will be.
-+       *
-+       * The rules are:
-+       *  1. If *pc == PFX, break after modified instruction.
-+       *  2. If *pc == BR,BSR,JMP,CALL, break at destination
-+       *  3. If *pc == SKIP, break right after SKIP AND after optional instruction,
-+                       which might, of course, be prefixed.
-+       *  4. Anything else, just drop in the breakpoint.
-+       */
-+
-+      pc = (short *)(int)g->registers.pc;
-+
-+      instruction = *pc;
-+      stepType = 0;
-+
-+      if(NiosInstructionIsPrefix(instruction))
-+              {
-+              /*
-+               * PFX instruction: skip til after it
-+               */
-+              while(NiosInstructionIsPrefix(instruction))
-+                      {
-+                      pc++;
-+                      instruction = *pc;
-+                      }
-+
-+              GDBInsertBreakpoint(g,pc + 1);
-+              stepType = 1;
-+              }
-+      else if(NiosInstructionIsBranch(instruction,pc,&branchTarget))
-+              {
-+              GDBInsertBreakpoint(g,branchTarget);
-+              stepType = 2;
-+              }
-+      else if(NiosInstructionIsSkip(instruction))
-+              {
-+              short *pc2;
-+              stepType = 3;
-+
-+              /*
-+               * Skip gets to breaks: one after the skippable instruction,
-+               * and the skippable instruction itself.
-+               *
-+               * Since Skips know how to skip over PFX's, we have to, too.
-+               */
-+              pc2 = pc;       // the Skip instruction
-+              do
-+                      {
-+                      pc2++;
-+                      } while(NiosInstructionIsPrefix(*pc2));
-+              // pc2 now points to first non-PFX after Skip
-+              GDBInsertBreakpoint(g,pc2+1);
-+              GDBInsertBreakpoint(g,pc+1);
-+              }
-+      else
-+              GDBInsertBreakpoint(g,pc+1);            // the genericest case
-+
-+      GDB_Print2("Program Steppingat 0x%x (%d)",g->registers.pc,stepType);
-+      }
-+
-+// -----------------------------
-+// Continue at address
-+
-+void DoGDBCommand_c(NiosGDBGlobals *g)
-+      {
-+      char *w;
-+      int x;
-+      w = g->textBuffer;
-+
-+      w++;            // past command
-+
-+      // Anything in the packet? if so,
-+      // use it to set the PC value
-+
-+      if(HexCharToValue(*w) >= 0)
-+              {
-+              w = Hex2Value(w,&x);
-+              g->registers.pc = x;
-+              }
-+
-+      GDB_Print2("Program Running at 0x%x",g->registers.pc,0);
-+      }
-+
-+// ----------------------
-+// Kill
-+
-+void DoGDBCommand_k(NiosGDBGlobals *g)
-+      {
-+      return;
-+      }
-+
-+
-+/*
-+ * If we've somehow skidded
-+ * to a stop just after a PFX instruction
-+ * back up the program counter by one.
-+ *
-+ * That way, we can't end up with an accidentally-unprefixed
-+ * instruction.
-+ *
-+ * We do this just before we begin running
-+ * again, so that when the host queries our
-+ * registers, we report the place we actually
-+ * stopped.
-+ */
-+
-+void MaybeAdjustProgramCounter(NiosGDBGlobals *g)
-+      {
-+      short instruction;
-+      if(g->registers.pc)
-+              {
-+              instruction = *(short *)(int)(g->registers.pc - 2);
-+              if(NiosInstructionIsPrefix(instruction))
-+                      g->registers.pc -= 2;
-+              else
-+                      {
-+                      // If the *current* instruction is Trap5, we must skip it!
-+                      instruction = *(short *)(int)(g->registers.pc);
-+                      if(NiosInstructionIsTrap5(instruction))
-+                              g->registers.pc += 2;
-+                      }
-+              }
-+      }
-+
-+/*
-+ * GDBMainLoop - this is the main processing loop
-+ * for the GDB stub.
-+ */
-+void GDBMainLoop (void)
-+{
-+      while(1)
-+      {
-+              if (GetGDBPacket(gdb.textBuffer) > 0)
-+              {
-+
-+                      GDB_Print2(gdb.textBuffer,0,0);
-+                      switch(gdb.textBuffer[0])
-+                      {
-+                      case 's':
-+                              DoGDBCommand_s(&gdb);
-+                              goto startRunning;
-+                              break;
-+
-+                      case 'c':       // continue
-+                              DoGDBCommand_c(&gdb);
-+
-+                              // if the PC is something other than 0, it's
-+                              // probably ok to exit and go there
-+
-+                      startRunning:
-+                              if(gdb.registers.pc)
-+                              {
-+                                      MaybeAdjustProgramCounter(&gdb);
-+                                      return;
-+                              }
-+                              break;
-+
-+                      case 'm':       // memory read
-+                              DoGDBCommand_m(gdb.textBuffer);
-+                              break;
-+
-+                      case 'M':       // memory set
-+                              DoGDBCommand_M(gdb.textBuffer);
-+                              break;
-+
-+                      case 'g':       // registers read
-+                              DoGDBCommand_g(&gdb);
-+                              break;
-+
-+                      case 'G':       //registers set
-+                              DoGDBCommand_G(&gdb);
-+                              break;
-+
-+                      case 'k':       //kill process
-+                              DoGDBCommand_k(&gdb);
-+                              break;
-+
-+                      case '?':       // last exception value
-+                              DoGDBCommand_qm(&gdb);
-+                              break;
-+
-+                      case 'q':
-+                              DoGDBCommand_q(&gdb);
-+                              break;
-+
-+                      default:        // return empty packet, means "yeah yeah".
-+                              gdb.textBuffer[0] = 0;
-+                              PutGDBPacket(gdb.textBuffer);
-+                      break;
-+                      }
-+              }
-+      }
-+
-+}
-+
-+// ----------main------------
-+void GDBMain(void)
-+{
-+      int i;
-+
-+      for(i = 0; i < kTextBufferSize; i++)
-+              gdb.textBuffer[i] = i;
-+
-+      GDBRemoveBreakpoints(&gdb);
-+
-+#ifdef __KERNEL__
-+/*
-+ * Inform the user that they need to add the symbol file for the application
-+ * that is just starting up.  Display the  .text  .data  .bss  regions.
-+ */
-+      if (gdb.trapNumber == 5) {
-+              extern struct task_struct *_current_task;
-+              sprintf(gdb.textBuffer,
-+                              "\r\n\nGDB: trap 5 at 0x%08lX", gdb.registers.pc);
-+              puts(gdb.textBuffer);
-+              if (_current_task) {
-+                      if ( _current_task->mm->start_code > _etext )
-+                              sprintf(gdb.textBuffer,
-+                                      "\r\nGDB: Enter the following command in the nios-elf-gdb Console Window:"
-+                                      "\r\nGDB:    add-symbol-file %s.abself 0x%08lX 0x%08lX 0x%08lX\r\n\n",
-+                                      _current_task->comm,
-+                                      (unsigned long)_current_task->mm->start_code,
-+                                      (unsigned long)_current_task->mm->start_data,
-+                                      (unsigned long)_current_task->mm->end_data );
-+                      else
-+                              sprintf(gdb.textBuffer,
-+                                      ", kernel process: %s\r\n", _current_task->comm );
-+              } else
-+                      sprintf(gdb.textBuffer,
-+                              ", kernel process unknown\r\n" );
-+              puts(gdb.textBuffer);
-+      }
-+#endif
-+
-+      // Send trapnumber for breakpoint encountered. No other signals.
-+
-+      gdb.textBuffer[0] = 'S';
-+      gdb.textBuffer[1] = '0';
-+
-+#if nasys_debug_core
-+      if (gdb.trapNumber == nasys_debug_core_irq)
-+      {
-+          /* gdb.textBuffer[2] = '8'; */
-+          gdb.textBuffer[2] = '5';
-+      }
-+      else
-+      {
-+          gdb.textBuffer[2] = '5';
-+      }
-+#else
-+      gdb.textBuffer[2] = '5';
-+#endif
-+      gdb.textBuffer[3] = 0;
-+      PutGDBPacket(gdb.textBuffer);
-+
-+      GDB_Print2("Trap %2d         At 0x%x",
-+              gdb.trapNumber,gdb.registers.pc);
-+//    printf ("Trap %d at 0x%x\n",gdb.trapNumber,gdb.registers.pc);
-+//    for (i=0;i<32;i++) printf ("    register[%d] = 0x%x\n",i,gdb.registers.r[i]);
-+
-+      GDBMainLoop ();
-+}
-+
-+// +----------------------------------
-+// | gdb_eth_proc -- gets called for udp packets
-+// | from the host bound for gdb stub
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+int gdb_eth_proc(int plug_handle,
-+              void *context,
-+              ns_plugs_packet *p,
-+              void *payload,
-+              int payload_length)
-+{
-+      int i;
-+      char *buf = (char *)payload;
-+      // if this is a stop request, set a flag to stop after nr_plugs_idle
-+      // leave it up to the host to prevent stops from being sent while stub is running???
-+
-+      if (*buf == 3) gdb.stop = 1;
-+
-+      // if we're waiting for an ack, check that here
-+      if (gdb.ACKstatus == ne_gdb_ack_waiting)
-+      {
-+              if (buf[0] == '+')
-+              {
-+                      gdb.ACKstatus = ne_gdb_ack_acked;
-+                      return 0;
-+              }
-+              else if (buf[0] == '-')
-+              {
-+                      gdb.ACKstatus = ne_gdb_ack_nacked;
-+                      return 0;
-+              }
-+      }
-+      strcpy (gdb.textBuffer, buf);   //all commands should be zero terminated strings
-+
-+      gdb.textBuffer[payload_length] = 0;     //terminate string
-+
-+      gdb.host_ip_address=((ns_plugs_ip_packet *)(p[ne_plugs_ip].header))->source_ip_address;
-+      gdb.host_port_number=((ns_plugs_udp_packet *)(p[ne_plugs_udp].header))->source_port;
-+
-+      return 0;
-+}
-+
-+int nr_dbg_plugs_idle (void)
-+{
-+      int result;
-+
-+      result = nr_plugs_idle ();
-+      if (gdb.stop)
-+      {
-+              gdb.stop = 0;
-+//;dgt2;tmp;          asm ("TRAP #5");
-+      }
-+      return result;
-+}
-+#endif
-+#endif
-+
-+
-+/*
-+ * int main(void)
-+ *
-+ * All we really do here is install our trap # 3,
-+ * and call it once, so that we're living down in
-+ * the GDBMain, trap handler.
-+ */
-+
-+extern int StubBreakpointHandler;
-+extern int StubHarmlessHandler;
-+#if nasys_debug_core
-+extern int StubHWBreakpointHandler;
-+#endif
-+#ifdef nasys_debug_uart
-+extern int StubUartHandler;
-+#endif
-+
-+void gdb_local_install(int active)
-+{
-+      unsigned int *vectorTable;
-+      unsigned int stubBreakpointHandler;
-+      unsigned int stubHarmlessHandler;
-+#if nasys_debug_core
-+      unsigned int stubHWBreakpointHandler;
-+#endif
-+
-+      gdb.breakpointCount = 0;
-+      gdb.textBuffer[0] = 0;
-+
-+      vectorTable = (int *)nasys_vector_table;
-+      stubBreakpointHandler = ( (unsigned int)(&StubBreakpointHandler) ) >> 1;
-+      stubHarmlessHandler = ( (unsigned int)(&StubHarmlessHandler) ) >> 1;
-+#if nasys_debug_core
-+      stubHWBreakpointHandler = ( (unsigned int)(&StubHWBreakpointHandler) ) >> 1;
-+#endif
-+
-+      /*
-+       * Breakpoint & single step both go here
-+       */
-+      vectorTable[na_BreakpointTrap] = stubBreakpointHandler;
-+      vectorTable[na_SingleStepTrap] = stubBreakpointHandler;
-+      vectorTable[na_StartGDBTrap] = active ? stubBreakpointHandler : stubHarmlessHandler;
-+      /*
-+       * If it exists, Hardware Breakpoint has a different entry point
-+       */
-+#if nasys_debug_core
-+      vectorTable[na_debug_peripheral_irq] = stubHWBreakpointHandler;
-+#endif
-+
-+#ifndef __KERNEL__
-+#ifdef nasys_debug_uart
-+      if (gdb.comlink == ne_gdb_serial)
-+      {
-+              np_uart *uart = (np_uart *)nasys_debug_uart;
-+              unsigned int stubUartHandler = ((unsigned int)(&StubUartHandler)) >> 1;
-+
-+              vectorTable[nasys_debug_uart_irq] = stubUartHandler;      //set Uart int vector
-+              uart->np_uartcontrol = np_uartcontrol_irrdy_mask; //enable Rx intr
-+      }
-+#endif
-+#endif
-+}
-+
-+void nios_gdb_install(int active)
-+{
-+      gdb.comlink = ne_gdb_serial;
-+      gdb_local_install (active);
-+}
-+
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+void nios_gdb_install_ethernet (int active)
-+{
-+      int result;
-+      host_16 host_port = GDB_ETH_PORT;
-+
-+      gdb.comlink = ne_gdb_ethernet;
-+      gdb_local_install (active);
-+
-+      result = nr_plugs_create (&gdb.gdb_eth_plug, ne_plugs_udp, host_port, gdb_eth_proc, 0, 0);
-+      //if unabled to open ethernet plug, switch back to default serial interface
-+      if (result)
-+      {
-+              printf ("nr_plugs_create failed %d\n",result);
-+              gdb.comlink = ne_gdb_serial;
-+              return;
-+      }
-+      result = nr_plugs_connect (gdb.gdb_eth_plug, 0, -1, -1);
-+      if (result)
-+      {
-+              printf ("nr_plugs_connect fialed %d\n",result);
-+              gdb.comlink = ne_gdb_serial;
-+              return;
-+      }
-+}
-+#endif
-+#endif
-+
-+#ifdef nios_gdb_breakpoint
-+      #undef nios_gdb_breakpoint
-+#endif
-+
-+void nios_gdb_breakpoint(void)
-+      {
-+      /*
-+       * If you arrived here, you didn't include
-+       * the file "nios_peripherals.h", which
-+       * defines nios_gdb_breakpoint as a
-+       * macro that expands to TRAP 5.
-+       *
-+       * (No problem, you can step out
-+       * of this routine.)
-+       */
-+//;dgt2;tmp;  asm("TRAP 5");
-+      }
-+
-+// end of file
-diff --git a/arch/nios2nommu/kernel/nios_gdb_stub.h b/arch/nios2nommu/kernel/nios_gdb_stub.h
-new file mode 100644
-index 0000000..3900109
---- /dev/null
-+++ b/arch/nios2nommu/kernel/nios_gdb_stub.h
-@@ -0,0 +1,105 @@
-+// file: nios_gdb_stub.h
-+// Author: Altera Santa Cruz \ 2000
-+//
-+// You can modify this header file to
-+// enable some features useful for
-+// debugging the debugger. They're
-+// good features also to just show
-+// signs of life on your Nios board.
-+// But they consume valuable peripherals!
-+//
-+// The 'GDB_DEBUG_PRINT' option ties
-+// up the LCD living on the 5v port,
-+// showing useful internals of the stub.
-+//
-+// dvb@altera.com
-+//
-+
-+#ifdef ETHER_DEBUG
-+#ifdef na_enet
-+#define ethernet_exists
-+#endif
-+#endif
-+
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+#include "plugs.h"
-+#endif
-+#endif
-+
-+#define MAX_DATA_SIZE         650
-+#define kTextBufferSize               ((2*MAX_DATA_SIZE)+4)
-+#define kMaximumBreakpoints   4
-+#define GDB_ETH_PORT          7070
-+#define       GDB_WHOLE_PACKET        0
-+#define       GDB_SKIP_FIRST          1
-+#define GDB_RETRY_CNT         3
-+
-+/*
-+ * This register structure must match
-+ * its counterpart in the GDB host, since
-+ * it is blasted across in byte notation.
-+ */
-+typedef struct
-+      {
-+      int r[32];
-+      long pc;
-+      short ctl0;
-+      short ctl1;
-+      short ctl2;
-+      short ctl3;
-+      } NiosGDBRegisters;
-+
-+typedef struct
-+      {
-+      short *address;
-+      short oldContents;
-+      } NiosGDBBreakpoint;
-+
-+typedef struct
-+      {
-+      NiosGDBRegisters registers;
-+      int trapNumber;                         // stashed by ISR, to distinguish types
-+      char textBuffer[kTextBufferSize];
-+      int breakpointCount;                    // breakpoints used for stepping
-+      int comlink;
-+      int stop;
-+      int gdb_eth_plug;
-+      NiosGDBBreakpoint breakpoint[kMaximumBreakpoints];
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+      volatile int ACKstatus;
-+      net_32 host_ip_address;
-+      net_16 host_port_number;
-+#endif
-+#endif
-+      } NiosGDBGlobals;
-+
-+#ifdef ETHER_DEBUG
-+#ifdef ethernet_exists
-+enum
-+{
-+      ne_gdb_ack_notwaiting,
-+      ne_gdb_ack_waiting,
-+      ne_gdb_ack_acked,
-+      ne_gdb_ack_nacked
-+};
-+#endif
-+#endif
-+
-+enum 
-+{
-+      ne_gdb_serial,
-+      ne_gdb_ethernet
-+};
-+
-+#ifndef GDB_DEBUG_PRINT
-+      #define GDB_DEBUG_PRINT 0
-+#endif
-+
-+void GDB_Main(void);  // initialize gdb and begin.
-+
-+char GDBGetChar(void);
-+void GDBPutChar(char c);
-+void GDB_Print2(char *s,int v1,int v2);
-+
-diff --git a/arch/nios2nommu/kernel/nios_gdb_stub_io.c b/arch/nios2nommu/kernel/nios_gdb_stub_io.c
-new file mode 100644
-index 0000000..e0d8f82
---- /dev/null
-+++ b/arch/nios2nommu/kernel/nios_gdb_stub_io.c
-@@ -0,0 +1,39 @@
-+// Modified for uClinux - Vic - Apr 2002
-+// From:
-+
-+// file: nios_gdb_stub_IO.c
-+//
-+// Single character I/O for Nios GDB Stub
-+
-+#ifndef __KERNEL__
-+#include "nios.h"
-+#else
-+#include <asm/nios.h>
-+#endif
-+
-+#include "nios_gdb_stub.h"
-+
-+#ifdef nasys_debug_uart
-+      #define GDB_UART nasys_debug_uart
-+#endif
-+
-+char GDBGetChar(void)
-+{
-+      char c = 0;
-+
-+#ifdef GDB_UART
-+      while( (c = (char)nr_uart_rxchar(GDB_UART)) < 0 )
-+                      ;
-+#endif
-+
-+      return c;
-+}
-+
-+void GDBPutChar(char c)
-+{
-+#ifdef GDB_UART
-+      nr_uart_txchar(c, GDB_UART);
-+#endif
-+}
-+
-+// End of file
-diff --git a/arch/nios2nommu/kernel/nios_gdb_stub_isr.S b/arch/nios2nommu/kernel/nios_gdb_stub_isr.S
-new file mode 100644
-index 0000000..c4af09a
---- /dev/null
-+++ b/arch/nios2nommu/kernel/nios_gdb_stub_isr.S
-@@ -0,0 +1,99 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * Assembly language portions of Nios GDB Stub
-+ *
-+ * arch\nios2nommu\kernel\switch.S
-+ *
-+ * Derived from Nios1
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * Modified for uClinux - Vic - Apr 2002
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+//;dgt2;tmp;
-+
-+      .equ    ethernet_exists, 1
-+
-+
-+      .equ    gdbRegistersGeneral,0
-+      .equ    gdbRegistersPC,32
-+      .equ    gdbRegistersCtl0Ctl1,33
-+      .equ    gdbRegistersCtl2Ctl3,34
-+      .equ    gdbTrapNumber,35                ; ISR can report trap number here
-+
-+
-+      .text
-+
-+      .global StubBreakpointHandler
-+      .global StubHarmlessHandler
-+      .global StubButtonHandler
-+      .global StubHWBreakpointHandler
-+      .global GDBMain
-+
-+      .comm   _gdb_stub_stack,1024,4  ; Local stack, statically allocated.
-+      .equ    gdbStubStacktop,_gdb_stub_stack+992
-+
-+
-+StubHarmlessHandler:
-+//;dgt2;tmp
-+
-+      .equ    gdbBreakChar,0x3
-+      .global StubUartHandler
-+
-+StubUartHandler:
-+//;dgt2;tmp
-+
-+StubUartRx:
-+//;dgt2;tmp
-+
-+StubHWBreakpointHandler:
-+//;dgt2;tmp
-+
-+StubBreakpointHandler:
-+//;dgt2;tmp
-+
-+#ifdef __KERNEL__
-+;----------------------------------------
-+;         Name: nr_uart_rxchar
-+;  Description: Read character if available
-+;        Input: %o0: UART base to use
-+;       Output: %o0 = character 0-0xff, or -1 if none present
-+; Side Effects: %g0 & %g1 altered
-+;    CWP Depth: 0
-+;
-+
-+      .global nr_uart_rxchar
-+nr_uart_rxchar:
-+//;dgt2;tmp
-+
-+
-+;----------------------------------------
-+;         Name: nr_uart_txchar
-+;  Description: Send a single byte out the UART
-+;        Input: %o0 = A character
-+;               %o1 = the UART to use, 0 for default
-+;       Output: none
-+; Side Effects: %g0 & %g1 altered, CPU waits for UART
-+;    CWP Depth: 0
-+;
-+
-+; nr_uart_txchar
-+              .global nr_uart_txchar
-+nr_uart_txchar:
-+//;dgt2;tmp
-+
-+#endif
-diff --git a/arch/nios2nommu/kernel/pio.c b/arch/nios2nommu/kernel/pio.c
-new file mode 100644
-index 0000000..013a64b
---- /dev/null
-+++ b/arch/nios2nommu/kernel/pio.c
-@@ -0,0 +1,154 @@
-+/*
-+ *  linux/arch/nios2nommu/kernel/pio.c
-+ *  "Example" drivers(LEDs and 7 seg displays) of the PIO interface
-+ *  on Nios Development Kit.
-+ *
-+ *  Copyright (C) 2004 Microtronix Datacom Ltd
-+ *
-+ *  This program is free software; you can redistribute it and/or
-+ *  modify it under the terms of the GNU General Public License
-+ *  as published by the Free Software Foundation; either version
-+ *  2 of the License, or (at your option) any later version.
-+ * 
-+ *  Written by Wentao Xu <wentao@microtronix.com>
-+ */
-+ 
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/timer.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/ioport.h>
-+#include <asm/io.h>
-+
-+MODULE_AUTHOR("Microtronix Datacom Ltd.");
-+MODULE_DESCRIPTION("Drivers of PIO devices (LEDs and 7 seg) on Nios kit");
-+MODULE_LICENSE("GPL");
-+
-+#undef CONFIG_PIO_SEG
-+#ifdef na_seven_seg_pio
-+#define CONFIG_PIO_SEG
-+#define PIO_SEG_IO    na_seven_seg_pio
-+#endif
-+
-+#undef CONFIG_PIO_LED
-+#ifdef na_led_pio
-+#define CONFIG_PIO_LED
-+#define PIO_LED_IO            na_led_pio
-+#endif
-+
-+#define PDEBUG printk
-+
-+/* routines for 7-segment hex display */
-+#ifdef CONFIG_PIO_SEG
-+static unsigned char _hex_digits_data[] = {
-+      0x01, 0x4f, 0x12, 0x06, 0x4c, /* 0-4 */
-+      0x24, 0x20, 0x0f, 0x00, 0x04, /* 5-9 */
-+      0x08, 0x60, 0x72, 0x42, 0x30, /* a-e */
-+      0x38                              /* f   */
-+};
-+
-+void pio_seg_write(int value)
-+{
-+  int led_value;
-+
-+  /* Left Hand Digit, goes to PIO bits 8-14 */
-+  led_value = _hex_digits_data[value & 0xF];
-+  led_value |= (_hex_digits_data[(value >> 4) & 0xF]) << 8;
-+
-+  outl(led_value, &(PIO_SEG_IO->np_piodata));
-+}
-+
-+static void __init pio_seg_init(void)
-+{
-+      pio_seg_write(0);
-+}
-+#endif
-+
-+
-+/* routines for LED display */
-+#ifdef CONFIG_PIO_LED
-+void pio_led_write(int value)
-+{
-+      np_pio *pio=(np_pio *)(PIO_LED_IO);
-+      
-+    //outl(-1, &pio->np_piodirection); 
-+      outl(value, &pio->np_piodata);
-+}
-+
-+static void __init pio_led_init(void)
-+{
-+      np_pio *pio=(np_pio *)(PIO_LED_IO);
-+      
-+    outl(-1, &pio->np_piodirection); 
-+    outl(0x0, &pio->np_piodata);
-+}
-+#endif
-+
-+/* timing routines */
-+#if defined(CONFIG_PIO_SEG) || defined(CONFIG_PIO_LED)
-+static struct timer_list display_timer;
-+static int restart_timer=1;
-+static int timer_counter=0;
-+static void display_timeout(unsigned long unused)
-+{
-+#ifdef CONFIG_PIO_SEG
-+      pio_seg_write(++timer_counter);
-+#endif        
-+
-+#ifdef CONFIG_PIO_LED
-+      pio_led_write(timer_counter);
-+#endif
-+      if (restart_timer) {
-+              display_timer.expires = jiffies + HZ; /* one second */
-+              add_timer(&display_timer);
-+      }
-+}
-+#endif
-+
-+int __init pio_init(void)
-+{
-+#ifdef CONFIG_PIO_SEG
-+      request_mem_region((unsigned long)PIO_SEG_IO, sizeof(np_pio), "pio_7seg");
-+      pio_seg_init();
-+#endif        
-+
-+#ifdef CONFIG_PIO_LED
-+      request_mem_region((unsigned long)PIO_LED_IO, sizeof(np_pio), "pio_led");
-+      pio_led_init();
-+#endif
-+
-+#if defined(CONFIG_PIO_SEG) || defined(CONFIG_PIO_LED)
-+      /* init timer */
-+      init_timer(&display_timer);
-+      display_timer.function = display_timeout;
-+      display_timer.data = 0;
-+      display_timer.expires = jiffies + HZ * 10; /* 10 seconds */
-+      add_timer(&display_timer);
-+#endif
-+
-+      return 0;
-+}
-+
-+static void __exit pio_exit(void)
-+{
-+#ifdef CONFIG_PIO_SEG
-+      pio_seg_write(0);
-+      release_mem_region((unsigned long)PIO_SEG_IO, sizeof(np_pio));
-+#endif        
-+
-+#ifdef CONFIG_PIO_LED
-+      pio_led_write(0);
-+      release_mem_region((unsigned long)PIO_LED_IO, sizeof(np_pio));
-+#endif
-+
-+#if defined(CONFIG_PIO_SEG) || defined(CONFIG_PIO_LED)
-+      restart_timer=0;
-+      del_timer_sync(&display_timer);
-+#endif
-+}
-+module_init(pio_init);
-+module_exit(pio_exit);
-+
-diff --git a/arch/nios2nommu/kernel/process.c b/arch/nios2nommu/kernel/process.c
-new file mode 100644
-index 0000000..4cd353c
---- /dev/null
-+++ b/arch/nios2nommu/kernel/process.c
-@@ -0,0 +1,578 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/kernel/process.c
-+ *
-+ * Derived from M68knommu
-+ *
-+ *  Copyright (C) 1995  Hamish Macdonald
-+ *  Copyright (C) 2000-2002, David McCullough <davidm@snapgear.com>
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ *  68060 fixes by Jesper Skov
-+ * Jan/20/2004                dgt         NiosII
-+ *                            rdusp() === (pt_regs *) regs->sp
-+ *                            Monday:
-+ *                             asm-nios2nommu\processor.h now bears
-+ *                              inline thread_saved_pc
-+ *                                      (struct thread_struct *t)
-+ *                             Friday: it's back here now
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/*
-+ * This file handles the architecture-dependent parts of process handling..
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/stddef.h>
-+#include <linux/unistd.h>
-+#include <linux/ptrace.h>
-+#include <linux/slab.h>
-+#include <linux/user.h>
-+#include <linux/a.out.h>
-+#include <linux/interrupt.h>
-+#include <linux/reboot.h>
-+#include <linux/uaccess.h>
-+#include <linux/fs.h>
-+#include <linux/err.h>
-+
-+#include <asm/system.h>
-+#include <asm/traps.h>
-+#include <asm/setup.h>
-+#include <asm/pgtable.h>
-+#include <asm/cacheflush.h>
-+
-+asmlinkage void ret_from_fork(void);
-+
-+/*
-+ * The following aren't currently used.
-+ */
-+void (*pm_idle)(void) = NULL;
-+EXPORT_SYMBOL(pm_idle);
-+
-+void (*pm_power_off)(void) = NULL;
-+EXPORT_SYMBOL(pm_power_off);
-+
-+void default_idle(void)
-+{
-+      local_irq_disable();
-+      if (!need_resched()) {
-+              local_irq_enable();
-+              __asm__("nop");   // was asm sleep
-+      } else
-+              local_irq_enable();
-+}
-+
-+void (*idle)(void) = default_idle;
-+
-+/*
-+ * The idle thread. There's no useful work to be
-+ * done, so just try to conserve power and have a
-+ * low exit latency (ie sit in a loop waiting for
-+ * somebody to say that they'd like to reschedule)
-+ */
-+void cpu_idle(void)
-+{
-+      while (1) {
-+              while (!need_resched())
-+                      idle();
-+              preempt_enable_no_resched();
-+              schedule();
-+              preempt_disable();
-+      }
-+}
-+
-+/*
-+ * The development boards have no way to pull a board
-+ * reset. Just jump to the cpu reset address and let
-+ * the code in head.S take care of disabling peripherals.
-+ */
-+
-+void machine_restart(char * __unused)
-+{
-+      local_irq_disable();
-+      __asm__ __volatile__ (
-+      "jmp    %0\n\t"
-+      : 
-+      : "r" (CPU_RESET_ADDRESS)
-+      : "r4");
-+}
-+
-+EXPORT_SYMBOL(machine_restart);
-+
-+void machine_halt(void)
-+{
-+      local_irq_disable();
-+      for (;;);
-+}
-+
-+EXPORT_SYMBOL(machine_halt);
-+
-+void exit_thread(void)
-+{
-+}
-+
-+void release_thread(struct task_struct *dead_task)
-+{
-+      /* nothing to do ... */
-+}
-+
-+/*
-+ * There is no way to power off the development
-+ * boards. So just spin lock for now. If you have
-+ * your own board with power down circuits add you
-+ * specific code here.
-+ */
-+
-+void machine_power_off(void)
-+{
-+      local_irq_disable();
-+      for (;;);
-+}
-+
-+EXPORT_SYMBOL(machine_power_off);
-+
-+void show_regs(struct pt_regs * regs)
-+{
-+      printk(KERN_NOTICE "\n");
-+
-+      printk(KERN_NOTICE "r1:  %08lx r2:  %08lx r3:  %08lx r4:  %08lx\n",
-+             regs->r1,  regs->r2,  regs->r3,  regs->r4);
-+
-+      printk(KERN_NOTICE "r5:  %08lx r6:  %08lx r7:  %08lx r8:  %08lx\n",
-+             regs->r5,  regs->r6,  regs->r7,  regs->r8);
-+
-+      printk(KERN_NOTICE "r9:  %08lx r10: %08lx r11: %08lx r12: %08lx\n",
-+             regs->r9,  regs->r10, regs->r11, regs->r12);
-+
-+      printk(KERN_NOTICE "r13: %08lx r14: %08lx r15: %08lx\n",
-+             regs->r13, regs->r14, regs->r15);
-+
-+      printk(KERN_NOTICE "ra:  %08lx fp:  %08lx sp:  %08lx gp:  %08lx\n",
-+             regs->ra,  regs->fp,  regs->sp,  regs->gp);
-+
-+      printk(KERN_NOTICE "ea:  %08lx estatus:  %08lx statusx:  %08lx\n",
-+             regs->ea,  regs->estatus,  regs->status_extension);
-+}
-+
-+/*
-+ * Create a kernel thread
-+ */
-+int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-+{
-+      long retval;
-+      long clone_arg = flags | CLONE_VM;
-+      mm_segment_t fs;
-+
-+      fs = get_fs();
-+      set_fs(KERNEL_DS);
-+
-+    __asm__ __volatile(
-+
-+        "    movi    r2,    %6\n\t"     /* TRAP_ID_SYSCALL          */
-+        "    movi    r3,    %1\n\t"     /* __NR_clone               */
-+        "    mov     r4,    %5\n\t"     /* (clone_arg               */
-+                                        /*   (flags | CLONE_VM))    */
-+        "    movia   r5,    -1\n\t"     /* usp: -1                  */
-+        "    trap\n\t"                  /* sys_clone                */
-+        "\n\t"
-+        "    cmpeq   r4,    r3, zero\n\t"/*2nd return valu in r3    */
-+        "    bne     r4,    zero, 1f\n\t"/* 0: parent, just return.  */
-+                                         /* See copy_thread, called */
-+                                         /*  by do_fork, called by  */
-+                                         /*  nios2_clone, called by */
-+                                         /*  sys_clone, called by   */
-+                                         /*  syscall trap handler.  */
-+
-+        "    mov     r4,    %4\n\t"     /* fn's parameter (arg)     */
-+        "\n\t"
-+        "\n\t"
-+        "    callr   %3\n\t"            /* Call function (fn)       */
-+        "\n\t"
-+        "    mov     r4,    r2\n\t"     /* fn's rtn code//;dgt2;tmp;*/
-+        "    movi    r2,    %6\n\t"     /* TRAP_ID_SYSCALL          */
-+        "    movi    r3,    %2\n\t"     /* __NR_exit                */
-+        "    trap\n\t"                  /* sys_exit()               */
-+
-+           /* Not reached by child.                                 */
-+        "1:\n\t"
-+        "    mov     %0,    r2\n\t"     /* error rtn code (retval)  */
-+
-+        :   "=r" (retval)               /* %0                       */
-+
-+        :   "i" (__NR_clone)            /* %1                       */
-+          , "i" (__NR_exit)             /* %2                       */
-+          , "r" (fn)                    /* %3                       */
-+          , "r" (arg)                   /* %4                       */
-+          , "r" (clone_arg)             /* %5  (flags | CLONE_VM)   */
-+          , "i" (TRAP_ID_SYSCALL)       /* %6                       */
-+
-+        :   "r2"                        /* Clobbered                */
-+          , "r3"                        /* Clobbered                */
-+          , "r4"                        /* Clobbered                */
-+          , "r5"                        /* Clobbered                */
-+          , "ra"                        /* Clobbered        //;mex1 */
-+        );
-+
-+      set_fs(fs);
-+      return retval;
-+}
-+
-+void flush_thread(void)
-+{
-+      /* Now, this task is no longer a kernel thread. */
-+      current->thread.flags &= ~NIOS2_FLAG_KTHREAD;
-+
-+#ifdef CONFIG_FPU
-+      unsigned long zero = 0;
-+#endif
-+      set_fs(USER_DS);
-+#ifdef CONFIG_FPU
-+      if (!FPU_IS_EMU)
-+...;dgt2;
-+              asm volatile (".chip 68k/68881\n\t"
-+                            "frestore %0@\n\t"
-+                            ".chip 68k" : : "a" (&zero));
-+#endif
-+}
-+
-+/*
-+ * "nios2_fork()".. By the time we get here, the
-+ * non-volatile registers have also been saved on the
-+ * stack. We do some ugly pointer stuff here.. (see
-+ * also copy_thread)
-+ */
-+
-+asmlinkage int nios2_fork(struct pt_regs *regs)
-+{
-+      /* fork almost works, enough to trick you into looking elsewhere :-( */
-+      return(-EINVAL);
-+}
-+
-+/*
-+ * nios2_execve() executes a new program.
-+ */
-+asmlinkage int nios2_execve(struct pt_regs *regs)
-+{
-+      int error;
-+      char * filename;
-+
-+      lock_kernel();
-+      filename = getname((char *) regs->r4);
-+      error = PTR_ERR(filename);
-+      if (IS_ERR(filename))
-+              goto out;
-+      error = do_execve(filename,
-+                        (char **) regs->r5,
-+                        (char **) regs->r6,
-+                        regs);
-+      putname(filename);
-+out:
-+      unlock_kernel();
-+      return error;
-+}
-+
-+asmlinkage int nios2_vfork(struct pt_regs *regs)
-+{
-+      return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, 0, NULL, NULL);
-+}
-+
-+asmlinkage int nios2_clone(struct pt_regs *regs)
-+{
-+    /* r4: clone_flags, r5: child_stack (usp)               */
-+
-+      unsigned long clone_flags;
-+      unsigned long newsp;
-+
-+      clone_flags = regs->r4;
-+      newsp = regs->r5;
-+      if (!newsp)
-+              newsp = regs->sp;
-+        return do_fork(clone_flags, newsp, regs, 0, NULL, NULL);
-+}
-+
-+int copy_thread(int nr, unsigned long clone_flags,
-+              unsigned long usp, unsigned long topstk,
-+              struct task_struct * p, struct pt_regs * regs)
-+{
-+      struct pt_regs * childregs;
-+      struct switch_stack * childstack, *stack;
-+      unsigned long stack_offset, *retp;
-+
-+      stack_offset = THREAD_SIZE - sizeof(struct pt_regs);
-+      childregs = (struct pt_regs *) ((unsigned long) p->stack + stack_offset);
-+      p->thread.kregs = childregs;
-+
-+      *childregs = *regs;
-+      childregs->r2 = 0;      //;dgt2;...redundant?...see "rtnvals" below
-+
-+      retp = ((unsigned long *) regs);
-+      stack = ((struct switch_stack *) retp) - 1;
-+
-+      childstack = ((struct switch_stack *) childregs) - 1;
-+      *childstack = *stack;
-+      childstack->ra = (unsigned long)ret_from_fork;
-+
-+      if (usp == -1)
-+              p->thread.kregs->sp = (unsigned long) childstack;
-+      else
-+              p->thread.kregs->sp = usp;
-+
-+      p->thread.ksp = (unsigned long)childstack;
-+
-+#ifdef CONFIG_FPU
-+      if (!FPU_IS_EMU) {
-+              /* Copy the current fpu state */
-+...;dgt2;
-+              asm volatile ("fsave %0" : : "m" (p->thread.fpstate[0]) : "memory");
-+
-+              if (p->thread.fpstate[0])
-+                asm volatile ("fmovemx %/fp0-%/fp7,%0\n\t"
-+                              "fmoveml %/fpiar/%/fpcr/%/fpsr,%1"
-+                              : : "m" (p->thread.fp[0]), "m" (p->thread.fpcntl[0])
-+                              : "memory");
-+              /* Restore the state in case the fpu was busy */
-+              asm volatile ("frestore %0" : : "m" (p->thread.fpstate[0]));
-+      }
-+#endif
-+
-+      /* Set the return value for the child. */
-+      childregs->r2 = 0;  //;dgt2;...redundant?...see childregs->r2 above
-+      childregs->r3 = 1;  //;dgt2;...eg: kernel_thread parent test
-+
-+      /* Set the return value for the parent. */
-+      regs->r2 = p->pid;  // Return child pid to parent
-+      regs->r3 = 0;       //;dgt2;...eg: kernel_thread parent test
-+
-+      return 0;
-+}
-+
-+/* Fill in the fpu structure for a core dump.  */
-+
-+int dump_fpu(struct pt_regs *regs, struct user_m68kfp_struct *fpu)
-+{
-+#ifdef CONFIG_FPU
-+      char fpustate[216];
-+
-+      if (FPU_IS_EMU) {
-+              int i;
-+
-+              memcpy(fpu->fpcntl, current->thread.fpcntl, 12);
-+              memcpy(fpu->fpregs, current->thread.fp, 96);
-+              /* Convert internal fpu reg representation
-+               * into long double format
-+               */
-+              for (i = 0; i < 24; i += 3)
-+                      fpu->fpregs[i] = ((fpu->fpregs[i] & 0xffff0000) << 15) |
-+                                       ((fpu->fpregs[i] & 0x0000ffff) << 16);
-+              return 1;
-+      }
-+
-+      /* First dump the fpu context to avoid protocol violation.  */
-+...;dgt2;tmp;
-+      asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
-+      if (!fpustate[0])
-+              return 0;
-+
-+      asm volatile ("fmovem %/fpiar/%/fpcr/%/fpsr,%0"
-+              :: "m" (fpu->fpcntl[0])
-+              : "memory");
-+      asm volatile ("fmovemx %/fp0-%/fp7,%0"
-+              :: "m" (fpu->fpregs[0])
-+              : "memory");
-+#endif
-+      return 1;
-+}
-+
-+/*
-+ * fill in the user structure for a core dump..
-+ */
-+void dump_thread(struct pt_regs * regs, struct user * dump)
-+{
-+      struct switch_stack *sw;
-+
-+      /* changed the size calculations - should hopefully work better. lbt */
-+      dump->magic = CMAGIC;
-+      dump->start_code = 0;
-+      dump->start_stack = regs->sp & ~(PAGE_SIZE - 1);
-+      dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
-+      dump->u_dsize = ((unsigned long) (current->mm->brk +
-+                                        (PAGE_SIZE-1))) >> PAGE_SHIFT;
-+      dump->u_dsize -= dump->u_tsize;
-+      dump->u_ssize = 0;
-+
-+      if (dump->start_stack < TASK_SIZE)
-+              dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
-+
-+      dump->u_ar0 = (struct user_regs_struct *)((int)&dump->regs - (int)dump);
-+      sw = ((struct switch_stack *)regs) - 1;
-+      dump->regs.r1 = regs->r1;
-+      dump->regs.r2 = regs->r2;
-+      dump->regs.r3 = regs->r3;
-+      dump->regs.r4 = regs->r4;
-+      dump->regs.r5 = regs->r5;
-+      dump->regs.r6 = regs->r6;
-+      dump->regs.r7 = regs->r7;
-+      dump->regs.r8 = regs->r8;
-+      dump->regs.r9 = regs->r9;
-+      dump->regs.r10 = regs->r10;
-+      dump->regs.r11 = regs->r11;
-+      dump->regs.r12 = regs->r12;
-+      dump->regs.r13 = regs->r13;
-+      dump->regs.r14 = regs->r14;
-+      dump->regs.r15 = regs->r15;
-+      dump->regs.r16 = sw->r16;
-+      dump->regs.r17 = sw->r17;
-+      dump->regs.r18 = sw->r18;
-+      dump->regs.r19 = sw->r19;
-+      dump->regs.r20 = sw->r20;
-+      dump->regs.r21 = sw->r21;
-+      dump->regs.r22 = sw->r22;
-+      dump->regs.r23 = sw->r23;
-+      dump->regs.ra = sw->ra;
-+      dump->regs.fp = sw->fp;
-+      dump->regs.gp = sw->gp;
-+      dump->regs.sp = regs->sp;
-+      dump->regs.orig_r2 = regs->orig_r2;
-+      dump->regs.estatus = regs->estatus;
-+      dump->regs.ea = regs->ea;
-+      /* dump floating point stuff */
-+      //      dump->u_fpvalid = dump_fpu (regs, &dump->m68kfp);
-+}
-+
-+/*
-+ *    Generic dumping code. Used for panic and debug.
-+ */
-+void dump(struct pt_regs *fp)
-+{
-+      unsigned long   *sp;
-+      unsigned char   *tp;
-+      int             i;
-+
-+      printk(KERN_EMERG "\nCURRENT PROCESS:\n\n");
-+      printk(KERN_EMERG "COMM=%s PID=%d\n", current->comm, current->pid);
-+
-+      if (current->mm) {
-+              printk(KERN_EMERG "TEXT=%08x-%08x DATA=%08x-%08x BSS=%08x-%08x\n",
-+                      (int) current->mm->start_code,
-+                      (int) current->mm->end_code,
-+                      (int) current->mm->start_data,
-+                      (int) current->mm->end_data,
-+                      (int) current->mm->end_data,
-+                      (int) current->mm->brk);
-+              printk(KERN_EMERG "USER-STACK=%08x  KERNEL-STACK=%08x\n\n",
-+                      (int) current->mm->start_stack,
-+                      (int)(((unsigned long) current) + THREAD_SIZE));
-+      }
-+
-+      printk(KERN_EMERG "PC: %08lx\n", fp->ea);
-+      printk(KERN_EMERG "SR: %08lx    SP: %08lx\n", (long) fp->estatus, (long) fp);
-+      printk(KERN_EMERG "r4: %08lx    r5: %08lx    r6: %08lx    r7: %08lx\n",
-+              fp->r4, fp->r5, fp->r6, fp->r7);
-+      printk(KERN_EMERG "r8: %08lx    r9: %08lx    r10: %08lx    r11: %08lx\n",
-+              fp->r8, fp->r9, fp->r10, fp->r11);
-+      printk(KERN_EMERG "\nUSP: %08x   TRAPFRAME: %08x\n", (unsigned int) fp->sp,
-+              (unsigned int) fp);
-+
-+      printk(KERN_EMERG "\nCODE:");
-+      tp = ((unsigned char *) fp->ea) - 0x20;
-+      for (sp = (unsigned long *) tp, i = 0; (i < 0x40);  i += 4) {
-+              if ((i % 0x10) == 0)
-+                      printk(KERN_EMERG "\n%08x: ", (int) (tp + i));
-+              printk(KERN_EMERG "%08x ", (int) *sp++);
-+      }
-+      printk(KERN_EMERG "\n");
-+
-+      printk(KERN_EMERG "\nKERNEL STACK:");
-+      tp = ((unsigned char *) fp) - 0x40;
-+      for (sp = (unsigned long *) tp, i = 0; (i < 0xc0); i += 4) {
-+              if ((i % 0x10) == 0)
-+                      printk(KERN_EMERG "\n%08x: ", (int) (tp + i));
-+              printk(KERN_EMERG "%08x ", (int) *sp++);
-+      }
-+      printk(KERN_EMERG "\n");
-+      printk(KERN_EMERG "\n");
-+
-+      printk(KERN_EMERG "\nUSER STACK:");
-+      tp = (unsigned char *) (fp->sp - 0x10);
-+      for (sp = (unsigned long *) tp, i = 0; (i < 0x80); i += 4) {
-+              if ((i % 0x10) == 0)
-+                      printk(KERN_EMERG "\n%08x: ", (int) (tp + i));
-+              printk(KERN_EMERG "%08x ", (int) *sp++);
-+      }
-+      printk(KERN_EMERG "\n\n");
-+}
-+
-+/*
-+ * These bracket the sleeping functions..
-+ */
-+extern void scheduling_functions_start_here(void);
-+extern void scheduling_functions_end_here(void);
-+#define first_sched   ((unsigned long) scheduling_functions_start_here)
-+#define last_sched    ((unsigned long) scheduling_functions_end_here)
-+
-+unsigned long get_wchan(struct task_struct *p)
-+{
-+      unsigned long fp, pc;
-+      unsigned long stack_page;
-+      int count = 0;
-+      if (!p || p == current || p->state == TASK_RUNNING)
-+              return 0;
-+
-+      stack_page = (unsigned long)p;
-+      fp = ((struct switch_stack *)p->thread.ksp)->fp;        //;dgt2
-+      do {
-+              if (fp < stack_page+sizeof(struct task_struct) ||
-+                  fp >= 8184+stack_page)                          //;dgt2;tmp
-+                      return 0;
-+              pc = ((unsigned long *)fp)[1];
-+              if (!in_sched_functions(pc))
-+                      return pc;
-+              fp = *(unsigned long *) fp;
-+      } while (count++ < 16);                                 //;dgt2;tmp
-+      return 0;
-+}
-+
-+/* Return saved PC of a blocked thread. */
-+unsigned long thread_saved_pc(struct task_struct *t)
-+{
-+      return (t->thread.kregs->ea);
-+}
-+
-+/*
-+ * Do necessary setup to start up a newly executed thread.
-+ * Will statup in user mode (status_extension = 0).
-+ */
-+void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)
-+{
-+      memset((void *) regs, 0, sizeof(struct pt_regs));
-+      regs->estatus = NIOS2_STATUS_PIE_MSK;   // No user mode setting, at least not for now
-+      regs->ea = pc;
-+      regs->sp = sp;
-+
-+      /* check if debug flag is set */
-+      if (current->thread.flags & NIOS2_FLAG_DEBUG ) {
-+              if ( *(u32*)pc == NIOS2_OP_NOP ) {
-+                      *(u32*)pc = NIOS2_OP_BREAK;
-+                      flush_icache_range(pc, pc+4);
-+              }
-+      }
-+}
-diff --git a/arch/nios2nommu/kernel/ptrace.c b/arch/nios2nommu/kernel/ptrace.c
-new file mode 100644
-index 0000000..e6ff3b3
---- /dev/null
-+++ b/arch/nios2nommu/kernel/ptrace.c
-@@ -0,0 +1,352 @@
-+/*
-+ *  linux/arch/m68knommu/kernel/ptrace.c
-+ *
-+ *  Copyright (C) 1994 by Hamish Macdonald
-+ *  Taken from linux/kernel/ptrace.c and modified for M680x0.
-+ *  linux/kernel/ptrace.c is by Ross Biro 1/23/92, edited by Linus Torvalds
-+ *
-+ * This file is subject to the terms and conditions of the GNU General
-+ * Public License.  See the file COPYING in the main directory of
-+ * this archive for more details.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/errno.h>
-+#include <linux/ptrace.h>
-+#include <linux/user.h>
-+
-+#include <asm/uaccess.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/processor.h>
-+
-+/*
-+ * does not yet catch signals sent when the child dies.
-+ * in exit.c or in signal.c.
-+ */
-+
-+/* determines which bits in the SR the user has access to. */
-+/* 1 = access 0 = no access */
-+#define SR_MASK 0x00000000
-+
-+/* Find the stack offset for a register, relative to thread.ksp. */
-+#define PT_REG(reg)   ((long)&((struct pt_regs *)0)->reg)
-+#define SW_REG(reg)   ((long)&((struct switch_stack *)0)->reg \
-+                       - sizeof(struct switch_stack))
-+/* Mapping from PT_xxx to the stack offset at which the register is
-+   saved.  Notice that usp has no stack-slot and needs to be treated
-+   specially (see get_reg/put_reg below). */
-+static int regoff[] = {
-+      -1, PT_REG(r1), PT_REG(r2), PT_REG(r3), PT_REG(r4),
-+      PT_REG(r5), PT_REG(r6), PT_REG(r7), PT_REG(r8),
-+      PT_REG(r9), PT_REG(r10), PT_REG(r11), PT_REG(r12),
-+      PT_REG(r13), PT_REG(r14), PT_REG(r15), SW_REG(r16),
-+      SW_REG(r17), SW_REG(r18), SW_REG(r19), SW_REG(r20),
-+      SW_REG(r21), SW_REG(r22), SW_REG(r23), -1, -1,
-+      PT_REG(gp), PT_REG(sp), -1, -1, PT_REG(ra), -1,
-+      PT_REG(estatus), -1, -1, -1
-+};
-+
-+/*
-+ * Get contents of register REGNO in task TASK.
-+ */
-+static inline long get_reg(struct task_struct *task, int regno)
-+{
-+      unsigned long *addr;
-+
-+      if (regno == PTR_R0)
-+              return 0;
-+      else if (regno == PTR_BA)
-+              return 0;
-+      else if (regno == PTR_STATUS)
-+              return 0;
-+      else if (regno == PTR_IENABLE)
-+              return 0;
-+      else if (regno == PTR_IPENDING)
-+              return 0;
-+      else if (regno < sizeof(regoff)/sizeof(regoff[0]))
-+              addr = (unsigned long *)(task->thread.kregs + regoff[regno]);
-+      else
-+              return 0;
-+      return *addr;
-+}
-+
-+/*
-+ * Write contents of register REGNO in task TASK.
-+ */
-+static inline int put_reg(struct task_struct *task, int regno,
-+                        unsigned long data)
-+{
-+      unsigned long *addr;
-+
-+      if (regno == PTR_R0)
-+              return -1;
-+      else if (regno == PTR_BA)
-+              return -1;
-+      else if (regno == PTR_STATUS)
-+              return -1;
-+      else if (regno == PTR_IENABLE)
-+              return -1;
-+      else if (regno == PTR_IPENDING)
-+              return -1;
-+      else if (regno < sizeof(regoff)/sizeof(regoff[0]))
-+              addr = (unsigned long *) (task->thread.kregs + regoff[regno]);
-+      else
-+              return -1;
-+      *addr = data;
-+      return 0;
-+}
-+
-+/*
-+ * Called by kernel/ptrace.c when detaching..
-+ *
-+ * Nothing special to do here, no processor debug support.
-+ */
-+void ptrace_disable(struct task_struct *child)
-+{
-+}
-+
-+long arch_ptrace(struct task_struct *child, long request, long addr, long data)
-+{
-+      int ret;
-+
-+      switch (request) {
-+              /* when I and D space are separate, these will need to be fixed. */
-+              case PTRACE_PEEKTEXT: /* read word at location addr. */ 
-+              case PTRACE_PEEKDATA: {
-+                      unsigned long tmp;
-+                      int copied;
-+
-+                      copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);
-+                      ret = -EIO;
-+                      if (copied != sizeof(tmp))
-+                              break;
-+                      ret = put_user(tmp,(unsigned long *) data);
-+                      break;
-+              }
-+
-+              /* read the word at location addr in the USER area. */
-+              case PTRACE_PEEKUSR: {
-+                      unsigned long tmp;
-+                      
-+                      ret = -EIO;
-+                      if ((addr & 3) || addr < 0 ||
-+                          addr > sizeof(struct user) - 3)
-+                              break;
-+                      
-+                      tmp = 0;  /* Default return condition */
-+                      addr = addr >> 2; /* temporary hack. */
-+                      ret = -EIO;
-+                      if (addr < 19) {
-+                              tmp = get_reg(child, addr);
-+#if 0 // No FPU stuff
-+                      } else if (addr >= 21 && addr < 49) {
-+                              tmp = child->thread.fp[addr - 21];
-+#ifdef CONFIG_M68KFPU_EMU
-+                              /* Convert internal fpu reg representation
-+                               * into long double format
-+                               */
-+                              if (FPU_IS_EMU && (addr < 45) && !(addr % 3))
-+                                      tmp = ((tmp & 0xffff0000) << 15) |
-+                                            ((tmp & 0x0000ffff) << 16);
-+#endif
-+#endif
-+                      } else if (addr == 49) {
-+                              tmp = child->mm->start_code;
-+                      } else if (addr == 50) {
-+                              tmp = child->mm->start_data;
-+                      } else if (addr == 51) {
-+                              tmp = child->mm->end_code;
-+                      } else
-+                              break;
-+                      ret = put_user(tmp,(unsigned long *) data);
-+                      break;
-+              }
-+
-+              /* when I and D space are separate, this will have to be fixed. */
-+              case PTRACE_POKETEXT: /* write the word at location addr. */
-+              case PTRACE_POKEDATA:
-+                      ret = 0;
-+                      if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data))
-+                              break;
-+                      ret = -EIO;
-+                      break;
-+
-+              case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
-+                      ret = -EIO;
-+                      if ((addr & 3) || addr < 0 ||
-+                          addr > sizeof(struct user) - 3)
-+                              break;
-+
-+                      addr = addr >> 2; /* temporary hack. */
-+                          
-+                      if (addr == PTR_ESTATUS) {
-+                              data &= SR_MASK;
-+                              data |= get_reg(child, PTR_ESTATUS) & ~(SR_MASK);
-+                      }
-+                      if (addr < 19) {
-+                              if (put_reg(child, addr, data))
-+                                      break;
-+                              ret = 0;
-+                              break;
-+                      }
-+#if 0 // No FPU stuff
-+                      if (addr >= 21 && addr < 48)
-+                      {
-+#ifdef CONFIG_M68KFPU_EMU
-+                              /* Convert long double format
-+                               * into internal fpu reg representation
-+                               */
-+                              if (FPU_IS_EMU && (addr < 45) && !(addr % 3)) {
-+                                      data = (unsigned long)data << 15;
-+                                      data = (data & 0xffff0000) |
-+                                             ((data & 0x0000ffff) >> 1);
-+                              }
-+#endif
-+                              child->thread.fp[addr - 21] = data;
-+                              ret = 0;
-+                      }
-+#endif
-+                      break;
-+
-+              case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
-+              case PTRACE_CONT: { /* restart after signal. */
-+
-+                      ret = -EIO;
-+                      if ((unsigned long) data > _NSIG)
-+                              break;
-+                      if (request == PTRACE_SYSCALL)
-+                              set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-+                      else
-+                              clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-+                      child->exit_code = data;
-+                      wake_up_process(child);
-+                      ret = 0;
-+                      break;
-+              }
-+
-+              /*
-+               * make the child exit.  Best I can do is send it a sigkill. 
-+               * perhaps it should be put in the status that it wants to 
-+               * exit.
-+               */
-+              case PTRACE_KILL: {
-+
-+                      ret = 0;
-+                      if (child->state == EXIT_ZOMBIE) /* already dead */
-+                              break;
-+                      child->exit_code = SIGKILL;
-+                      wake_up_process(child);
-+                      break;
-+              }
-+
-+              /*
-+               * Single stepping requires placing break instructions in
-+               * the code to break back. If you are stepping through a 
-+               * conditional branch you need to decode the test and put
-+               * the break in the correct location.
-+               */
-+              case PTRACE_SINGLESTEP: {  /* set the trap flag. */
-+
-+                      ret = -EIO;
-+                      if ((unsigned long) data > _NSIG)
-+                              break;
-+                      clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-+
-+                      child->exit_code = data;
-+                      /* give it a chance to run. */
-+                      wake_up_process(child);
-+                      ret = 0;
-+                      break;
-+              }
-+
-+              case PTRACE_DETACH:     /* detach a process that was attached. */
-+                      ret = ptrace_detach(child, data);
-+                      break;
-+
-+              case PTRACE_GETREGS: { /* Get all gp regs from the child. */
-+                      int i;
-+                      unsigned long tmp;
-+                      for (i = 0; i < 19; i++) {
-+                          tmp = get_reg(child, i);
-+                          if (put_user(tmp, (unsigned long *) data)) {
-+                              ret = -EFAULT;
-+                              break;
-+                          }
-+                          data += sizeof(long);
-+                      }
-+                      ret = 0;
-+                      break;
-+              }
-+
-+              case PTRACE_SETREGS: { /* Set all gp regs in the child. */
-+                      int i;
-+                      unsigned long tmp;
-+                      for (i = 0; i < 19; i++) {
-+                          if (get_user(tmp, (unsigned long *) data)) {
-+                              ret = -EFAULT;
-+                              break;
-+                          }
-+                          if (i == PTR_ESTATUS) {
-+                              tmp &= SR_MASK;
-+                              tmp |= get_reg(child, PTR_ESTATUS) & ~(SR_MASK);
-+                          }
-+                          put_reg(child, i, tmp);
-+                          data += sizeof(long);
-+                      }
-+                      ret = 0;
-+                      break;
-+              }
-+
-+#ifdef PTRACE_GETFPREGS
-+              case PTRACE_GETFPREGS: { /* Get the child FPU state. */
-+                      ret = 0;
-+                      if (copy_to_user((void *)data, &child->thread.fp,
-+                                       sizeof(struct user_m68kfp_struct)))
-+                              ret = -EFAULT;
-+                      break;
-+              }
-+#endif
-+
-+#ifdef PTRACE_SETFPREGS
-+              case PTRACE_SETFPREGS: { /* Set the child FPU state. */
-+                      ret = 0;
-+                      if (copy_from_user(&child->thread.fp, (void *)data,
-+                                         sizeof(struct user_m68kfp_struct)))
-+                              ret = -EFAULT;
-+                      break;
-+              }
-+#endif
-+
-+              default:
-+                      ret = -EIO;
-+                      break;
-+      }
-+      return ret;
-+}
-+
-+asmlinkage void syscall_trace(void)
-+{
-+      if (!test_thread_flag(TIF_SYSCALL_TRACE))
-+              return;
-+      if (!(current->ptrace & PT_PTRACED))
-+              return;
-+      current->exit_code = SIGTRAP;
-+      current->state = TASK_STOPPED;
-+      ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
-+                               ? 0x80 : 0));
-+      /*
-+       * this isn't the same as continuing with a signal, but it will do
-+       * for normal use.  strace only continues with a signal if the
-+       * stopping signal is not SIGTRAP.  -brl
-+       */
-+      if (current->exit_code) {
-+              send_sig(current->exit_code, current, 1);
-+              current->exit_code = 0;
-+      }
-+}
-diff --git a/arch/nios2nommu/kernel/semaphore.c b/arch/nios2nommu/kernel/semaphore.c
-new file mode 100644
-index 0000000..0c7d11b
---- /dev/null
-+++ b/arch/nios2nommu/kernel/semaphore.c
-@@ -0,0 +1,155 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/kernel/semaphore.c
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+/*
-+ *  Generic semaphore code. Buyer beware. Do your own
-+ * specific changes in <asm/semaphore-helper.h>
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/err.h>
-+#include <asm/semaphore-helper.h>
-+
-+#ifndef CONFIG_RMW_INSNS
-+spinlock_t semaphore_wake_lock;
-+#endif
-+
-+/*
-+ * Semaphores are implemented using a two-way counter:
-+ * The "count" variable is decremented for each process
-+ * that tries to sleep, while the "waking" variable is
-+ * incremented when the "up()" code goes to wake up waiting
-+ * processes.
-+ *
-+ * Notably, the inline "up()" and "down()" functions can
-+ * efficiently test if they need to do any extra work (up
-+ * needs to do something only if count was negative before
-+ * the increment operation.
-+ *
-+ * waking_non_zero() (from asm/semaphore.h) must execute
-+ * atomically.
-+ *
-+ * When __up() is called, the count was negative before
-+ * incrementing it, and we need to wake up somebody.
-+ *
-+ * This routine adds one to the count of processes that need to
-+ * wake up and exit.  ALL waiting processes actually wake up but
-+ * only the one that gets to the "waking" field first will gate
-+ * through and acquire the semaphore.  The others will go back
-+ * to sleep.
-+ *
-+ * Note that these functions are only called when there is
-+ * contention on the lock, and as such all this is the
-+ * "non-critical" part of the whole semaphore business. The
-+ * critical part is the inline stuff in <asm/semaphore.h>
-+ * where we want to avoid any extra jumps and calls.
-+ */
-+asmlinkage void __up(struct semaphore *sem)
-+{
-+      wake_one_more(sem);
-+      wake_up(&sem->wait);
-+}
-+
-+/*
-+ * Perform the "down" function.  Return zero for semaphore acquired,
-+ * return negative for signalled out of the function.
-+ *
-+ * If called from __down, the return is ignored and the wait loop is
-+ * not interruptible.  This means that a task waiting on a semaphore
-+ * using "down()" cannot be killed until someone does an "up()" on
-+ * the semaphore.
-+ *
-+ * If called from __down_interruptible, the return value gets checked
-+ * upon return.  If the return value is negative then the task continues
-+ * with the negative value in the return register (it can be tested by
-+ * the caller).
-+ *
-+ * Either form may be used in conjunction with "up()".
-+ *
-+ */
-+
-+
-+#define DOWN_HEAD(task_state)                                         \
-+                                                                      \
-+                                                                      \
-+      current->state = (task_state);                                  \
-+      add_wait_queue(&sem->wait, &wait);                              \
-+                                                                      \
-+      /*                                                              \
-+       * Ok, we're set up.  sem->count is known to be less than zero  \
-+       * so we must wait.                                             \
-+       *                                                              \
-+       * We can let go the lock for purposes of waiting.              \
-+       * We re-acquire it after awaking so as to protect              \
-+       * all semaphore operations.                                    \
-+       *                                                              \
-+       * If "up()" is called before we call waking_non_zero() then    \
-+       * we will catch it right away.  If it is called later then     \
-+       * we will have to go through a wakeup cycle to catch it.       \
-+       *                                                              \
-+       * Multiple waiters contend for the semaphore lock to see       \
-+       * who gets to gate through and who has to wait some more.      \
-+       */                                                             \
-+      for (;;) {
-+
-+#define DOWN_TAIL(task_state)                 \
-+              current->state = (task_state);  \
-+      }                                       \
-+      current->state = TASK_RUNNING;          \
-+      remove_wait_queue(&sem->wait, &wait);
-+
-+void __sched __down(struct semaphore * sem)
-+{
-+      DECLARE_WAITQUEUE(wait, current);
-+
-+      DOWN_HEAD(TASK_UNINTERRUPTIBLE)
-+      if (waking_non_zero(sem))
-+              break;
-+      schedule();
-+      DOWN_TAIL(TASK_UNINTERRUPTIBLE)
-+}
-+
-+int __sched __down_interruptible(struct semaphore * sem)
-+{
-+      DECLARE_WAITQUEUE(wait, current);
-+      int ret = 0;
-+
-+      DOWN_HEAD(TASK_INTERRUPTIBLE)
-+
-+      ret = waking_non_zero_interruptible(sem, current);
-+      if (ret)
-+      {
-+              if (ret == 1)
-+                      /* ret != 0 only if we get interrupted -arca */
-+                      ret = 0;
-+              break;
-+      }
-+      schedule();
-+      DOWN_TAIL(TASK_INTERRUPTIBLE)
-+      return ret;
-+}
-+
-+int __down_trylock(struct semaphore * sem)
-+{
-+      return waking_non_zero_trylock(sem);
-+}
-diff --git a/arch/nios2nommu/kernel/setup.c b/arch/nios2nommu/kernel/setup.c
-new file mode 100644
-index 0000000..1f1627b
---- /dev/null
-+++ b/arch/nios2nommu/kernel/setup.c
-@@ -0,0 +1,663 @@
-+/*
-+  21Mar2001    1.1    dgt/microtronix: Altera Excalibur/Nios32 port
-+  30Jun2003           kenw/microtronix: Remove cmdline check in flash
-+*/
-+
-+/*
-+ *  linux/arch/niosnommu/kernel/setup.c
-+ *
-+ *  Copyright (C) 2004       Microtronix Datacom Ltd.
-+ *  Copyright (C) 2001       Vic Phillips {vic@microtronix.com}
-+ *  Copyleft  (C) 2000       James D. Schettine {james@telos-systems.com}
-+ *  Copyright (C) 1999       Greg Ungerer (gerg@moreton.com.au)
-+ *  Copyright (C) 1998,2000  D. Jeff Dionne <jeff@lineo.ca>
-+ *  Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
-+ *  Copyright (C) 1995       Hamish Macdonald
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+/*
-+ * This file handles the architecture-dependent parts of system setup
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+#include <linux/fs.h>
-+#include <linux/fb.h>
-+#include <linux/module.h>
-+#include <linux/console.h>
-+#include <linux/genhd.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/major.h>
-+#include <linux/bootmem.h>
-+#include <linux/initrd.h>
-+#include <linux/seq_file.h>
-+
-+#include <asm/irq.h>
-+#include <asm/byteorder.h>
-+#include <asm/asm-offsets.h>
-+#include <asm/pgtable.h>
-+
-+#ifdef CONFIG_BLK_DEV_INITRD
-+#include <linux/blk.h>
-+#endif
-+
-+#ifdef CONFIG_NIOS_SPI
-+#include <asm/spi.h>
-+extern ssize_t spi_write(struct file *filp, const char *buf, size_t count, loff_t *ppos);
-+extern ssize_t spi_read (struct file *filp, char *buf, size_t count, loff_t *ppos);
-+extern loff_t spi_lseek (struct file *filp, loff_t offset, int origin);
-+extern int spi_open     (struct inode *inode, struct file *filp);
-+extern int spi_release  (struct inode *inode, struct file *filp);
-+#endif
-+
-+#ifdef CONFIG_CONSOLE
-+extern struct consw *conswitchp;
-+#endif
-+
-+unsigned long rom_length;
-+unsigned long memory_start;
-+unsigned long memory_end;
-+
-+EXPORT_SYMBOL(memory_start);
-+EXPORT_SYMBOL(memory_end);
-+
-+#ifndef CONFIG_CMDLINE
-+#define CONFIG_CMDLINE        "CONSOLE=/dev/ttyS0 root=/dev/rom0 ro"
-+#endif
-+
-+#ifndef CONFIG_PASS_CMDLINE
-+static char default_command_line[] = CONFIG_CMDLINE;
-+#endif
-+static char __initdata command_line[COMMAND_LINE_SIZE] = { 0, };
-+
-+
-+/*                               r1  r2  r3  r4  r5  r6  r7  r8  r9 r10 r11*/
-+/*                               r12 r13 r14 r15 or2                      ra  fp  sp  gp es  ste  ea*/
-+static struct pt_regs fake_regs = { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\
-+                                  0,  0,  0,  0,  0, (unsigned long)cpu_idle,  0,  0,  0, 0,   0,  0};
-+
-+#define CPU "NIOS2"
-+
-+#if defined (CONFIG_CS89x0) || defined (CONFIG_SMC91111) || defined (CONFIG_OPEN_ETH) || defined (CONFIG_MTIP1000_ETH) || defined (CONFIG_DM9000_ETH) || defined (CONFIG_SMC91X) || defined (CONFIG_DM9000) || defined (CONFIG_DM9KS)
-+    #if defined (CONFIG_MTIP1000_ETH)                       //;dgt3;
-+        #include <../drivers/net/mtip1000.h>                //;dgt3;
-+    #endif                                                  //;dgt3;
-+
-+    unsigned char *excalibur_enet_hwaddr;
-+    unsigned char excalibur_enet_hwaddr_array[6];
-+#endif
-+
-+// save args passed from u-boot, called from head.S
-+void nios2_boot_init(unsigned r4,unsigned r5,unsigned r6,unsigned r7)
-+{
-+#if defined(CONFIG_PASS_CMDLINE)
-+  if (r4 == 0x534f494e)   // r4 is magic NIOS, to become board info check in the future
-+    {
-+#if defined(CONFIG_BLK_DEV_INITRD)
-+      /*
-+       * If the init RAM disk has been configured in, and there's a valid
-+       * starting address for it, set it up.
-+       */
-+      if (r5) {
-+              initrd_start = r5;
-+              initrd_end = r6;
-+      }
-+#endif                                /* CONFIG_BLK_DEV_INITRD */
-+      if (r7)
-+              strncpy(command_line, (char *)r7, COMMAND_LINE_SIZE);
-+    }
-+#endif
-+}
-+
-+inline void flash_command(int base, int offset, short data)
-+{
-+      volatile unsigned short * ptr=(unsigned short*) (base);
-+
-+      ptr[0x555]=0xaa;
-+      ptr[0x2aa]=0x55;
-+      ptr[offset]=data;
-+}
-+
-+inline void exit_se_flash(int base)
-+{
-+      flash_command(base, 0x555, 0x90);
-+      *(unsigned short*)base=0;
-+}
-+
-+void __init setup_arch(char **cmdline_p)
-+{
-+      int bootmap_size;
-+      extern int _stext, _etext;
-+      extern int _edata, _end;
-+#ifdef DEBUG
-+      extern int _sdata, _sbss, _ebss;
-+#ifdef CONFIG_BLK_DEV_BLKMEM
-+      extern int *romarray;
-+#endif
-+#endif
-+#if 0                                                     // krh
-+      unsigned char *psrc=(unsigned char *)((NIOS_FLASH_START + NIOS_FLASH_END)>>1);
-+      int i=0;
-+#endif                                                            // krh
-+
-+      memory_start = PAGE_ALIGN((unsigned long)&_end);
-+      memory_end = (unsigned long) nasys_program_mem_end;
-+
-+#if 0                                                       //;kenw;
-+      /* copy the command line from booting paramter region */
-+    #if defined (nasys_am29lv065d_flash_0)                  //;dgt;
-+      {                                                     //;dgt;
-+        // ...TBA...                                        //;dgt;
-+      }                                                     //;dgt;
-+    #else                                                   //;dgt;
-+          flash_command((int)psrc, 0x555, 0x88);
-+          while ((*psrc!=0xFF) && (i<sizeof(command_line))) {
-+              command_line[i++]=*psrc++;
-+          }
-+          command_line[i]=0;
-+          exit_se_flash(((NIOS_FLASH_START + NIOS_FLASH_END)>>1) );
-+          if (command_line[0]==0)
-+    #endif                                                  //;dgt;
-+#endif                                                      //;kenw;
-+#ifndef CONFIG_PASS_CMDLINE
-+              memcpy(command_line, default_command_line, sizeof(default_command_line));
-+#endif
-+
-+      printk("\x0F\r\n\nuClinux/Nios II\n");
-+      printk("Altera Nios II support (C) 2004 Microtronix Datacom Ltd.\n");
-+
-+#ifdef DEBUG
-+      printk("KERNEL -> TEXT=0x%08x-0x%08x DATA=0x%08x-0x%08x "
-+              "BSS=0x%08x-0x%08x\n", (int) &_stext, (int) &_etext,
-+              (int) &_sdata, (int) &_edata,
-+              (int) &_sbss, (int) &_ebss);
-+      printk("KERNEL -> MEM=0x%06x-0x%06x STACK=0x%06x-0x%06x\n",
-+              (int) memory_start, (int) memory_end,
-+              (int) memory_end, (int) nasys_program_mem_end);
-+#endif
-+
-+      init_mm.start_code = (unsigned long) &_stext;
-+      init_mm.end_code = (unsigned long) &_etext;
-+      init_mm.end_data = (unsigned long) &_edata;
-+      init_mm.brk = (unsigned long) 0;
-+      init_task.thread.kregs = &fake_regs;
-+
-+#if 0
-+      ROOT_DEV = MKDEV(BLKMEM_MAJOR,0);
-+#endif
-+
-+      /* Keep a copy of command line */
-+      *cmdline_p = &command_line[0];
-+
-+      memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
-+      saved_command_line[COMMAND_LINE_SIZE-1] = 0;
-+
-+#ifdef DEBUG
-+      if (strlen(*cmdline_p))
-+              printk("Command line: '%s'\n", *cmdline_p);
-+      else
-+              printk("No Command line passed\n");
-+#endif
-+
-+
-+#if defined (CONFIG_CS89x0) || defined (CONFIG_SMC91111) || defined (CONFIG_OPEN_ETH) || defined (CONFIG_MTIP1000_ETH) || defined (CONFIG_DM9000_ETH) || defined (CONFIG_SMC91X) || defined (CONFIG_DM9000) || defined (CONFIG_DM9KS)
-+
-+    #if defined (CONFIG_MTIP1000_ETH)                       //;dgt3;
-+        (*((np_mtip_mac *)                                  //;dgt3;
-+                (na_mtip_mac_control_port))).               //;dgt3;
-+                    COMMAND_CONFIG = 0;                     //;dgt3;
-+    #endif                                                  //;dgt3;
-+
-+      /* now read the hwaddr of the ethernet --wentao*/
-+
-+    #if 1                                                   //;dgt2;
-+//    #if defined (nasys_am29lv065d_flash_0)                //;dgt;
-+      {                                                     //;dgt;
-+        unsigned char   *flashptr               =           //;dgt;
-+            ((unsigned char *)                              //;dgt;
-+                ((                                          //;dgt;
-+                  #if defined (na_flash_kernel_end)         //;dgt2;
-+                      na_flash_kernel_end                   //;dgt2;
-+                  #else                                     //;dgt2;
-+                    #if defined (na_flash_kernel_base)      //;dgt2;
-+                      na_flash_kernel_base      +           //;dgt;
-+                    #else                                   //;dgt2;
-+                      na_flash_kernel           +           //;dgt2;
-+                    #endif                                  //;dgt2;
-+                      na_flash_kernel_size                  //;dgt2;
-+                  #endif                                    //;dgt2;
-+                      - 0x00010000)));                      //;dgt;
-+          // last 64K of Altera stratix/cyclone flash       //;dgt;
-+                                                            //;dgt;
-+        if((*((unsigned long *) flashptr)) == 0x00005AFE)   //;dgt;
-+          {                                                 //;dgt;
-+            memcpy(excalibur_enet_hwaddr_array,             //;dgt;
-+                   ((void*) (flashptr+4)),6);               //;dgt;
-+          }                                                 //;dgt;
-+          else                                              //;dgt;
-+          {                                                 //;dgt;
-+            printk("\nsetup_arch: No persistant network"    //;dgt;
-+                        " settings signature at %08lX\n",   //;dgt;
-+                   ((unsigned long) flashptr));             //;dgt;
-+            *((unsigned long *)                             //;dgt;
-+                 (&(excalibur_enet_hwaddr_array[0]))) =     //;dgt;
-+                    0x00ED0700;                             //;dgt2;
-+                      /* 0x00-07-ED: Altera Corporation.    //;dgt;     */
-+            *((unsigned short *)                            //;dgt;
-+                 (&(excalibur_enet_hwaddr_array[4]))) =     //;dgt;
-+                    0x0000;                                 //;dgt;
-+            /* Should be: 0x-00-07-ED-0A-03-(Random# 0-256) //;dgt2;    */
-+            /* 0x-00-07-ED-0A-xx-yy   Vermont boards        //;dgt2;    */
-+            /* 0x-00-07-ED-0B-xx-yy   Rhode Island boards   //;dgt2;    */
-+            /* 0x-00-07-ED-0C-xx-yy   Delaware boards       //;dgt2;    */
-+            /*                00        Internal Altera     //;dgt2;    */
-+            /*                01        Beta, pre-production//;dgt2;    */
-+            /*                02        Beta, pre-production//;dgt2;    */
-+            /*                03        Customer use        //;dgt2;    */
-+          }                                                 //;dgt;
-+      }                                                     //;dgt;
-+    #else                                                   //;dgt;
-+        flash_command(NIOS_FLASH_START, 0x555, 0x88);
-+        memcpy(excalibur_enet_hwaddr_array,(void*)NIOS_FLASH_START,6);
-+        exit_se_flash(NIOS_FLASH_START);;
-+    #endif                                                  //;dgt;
-+
-+      /* now do the checking, make sure we got a valid addr */
-+      if (excalibur_enet_hwaddr_array[0] & (unsigned char)1)
-+      {
-+              printk("Ethernet hardware address:Clearing invalid bit #0\n");
-+              excalibur_enet_hwaddr_array[0] ^= (unsigned char)1;
-+      }
-+      excalibur_enet_hwaddr=excalibur_enet_hwaddr_array;
-+#ifdef DEBUG
-+      printk("Setup the hardware addr for ethernet\n\t %02x %02x %02x %02x %02x %02x\n",
-+              excalibur_enet_hwaddr[0],excalibur_enet_hwaddr[1],
-+              excalibur_enet_hwaddr[2],excalibur_enet_hwaddr[3],
-+              excalibur_enet_hwaddr[4],excalibur_enet_hwaddr[5]);
-+#endif
-+#endif
-+
-+
-+      /*
-+       * give all the memory to the bootmap allocator,  tell it to put the
-+       * boot mem_map at the start of memory
-+       */
-+      bootmap_size = init_bootmem_node(
-+                      NODE_DATA(0),
-+                      memory_start >> PAGE_SHIFT, /* map goes here */
-+                      PAGE_OFFSET >> PAGE_SHIFT,      /* 0 on coldfire */
-+                      memory_end >> PAGE_SHIFT);
-+      /*
-+       * free the usable memory,  we have to make sure we do not free
-+       * the bootmem bitmap so we then reserve it after freeing it :-)
-+       */
-+      free_bootmem(memory_start, memory_end - memory_start);
-+      reserve_bootmem(memory_start, bootmap_size);
-+#ifdef CONFIG_BLK_DEV_INITRD
-+      if (initrd_start) reserve_bootmem(virt_to_phys((void *)initrd_start), initrd_end - initrd_start);
-+#endif /* CONFIG_BLK_DEV_INITRD */
-+      /*
-+       * get kmalloc into gear
-+       */
-+      paging_init();
-+#ifdef CONFIG_VT
-+#if defined(CONFIG_DUMMY_CONSOLE)
-+      conswitchp = &dummy_con;
-+#endif
-+#endif
-+
-+#ifdef DEBUG
-+      printk("Done setup_arch\n");
-+#endif
-+
-+}
-+
-+int get_cpuinfo(char * buffer)
-+{
-+    char *cpu, *mmu, *fpu;
-+    u_long clockfreq;
-+
-+    cpu = CPU;
-+    mmu = "none";
-+    fpu = "none";
-+
-+    clockfreq = nasys_clock_freq;
-+
-+    return(sprintf(buffer, "CPU:\t\t%s\n"
-+                 "MMU:\t\t%s\n"
-+                 "FPU:\t\t%s\n"
-+                 "Clocking:\t%lu.%1luMHz\n"
-+                 "BogoMips:\t%lu.%02lu\n"
-+                 "Calibration:\t%lu loops\n",
-+                 cpu, mmu, fpu,
-+                 clockfreq/1000000,(clockfreq/100000)%10,
-+                 (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100,
-+                 (loops_per_jiffy*HZ)));
-+
-+}
-+
-+/*
-+ *    Get CPU information for use by the procfs.
-+ */
-+
-+static int show_cpuinfo(struct seq_file *m, void *v)
-+{
-+    char *cpu, *mmu, *fpu;
-+    u_long clockfreq;
-+
-+    cpu = CPU;
-+    mmu = "none";
-+    fpu = "none";
-+
-+    clockfreq = nasys_clock_freq;
-+
-+    seq_printf(m, "CPU:\t\t%s\n"
-+                 "MMU:\t\t%s\n"
-+                 "FPU:\t\t%s\n"
-+                 "Clocking:\t%lu.%1luMHz\n"
-+                 "BogoMips:\t%lu.%02lu\n"
-+                 "Calibration:\t%lu loops\n",
-+                 cpu, mmu, fpu,
-+                 clockfreq/1000000,(clockfreq/100000)%10,
-+                 (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100,
-+                 (loops_per_jiffy*HZ));
-+
-+      return 0;
-+}
-+
-+#ifdef CONFIG_NIOS_SPI
-+
-+static int bcd2char( int x )
-+{
-+        if ( (x & 0xF) > 0x90 || (x & 0x0F) > 0x09 )
-+                return 99;
-+
-+        return (((x & 0xF0) >> 4) * 10) + (x & 0x0F);
-+}
-+
-+#endif // CONFIG_NIOS_SPI
-+
-+
-+void arch_gettod(int *year, int *month, int *date, int *hour, int *min, int *sec)
-+{
-+#ifdef CONFIG_NIOS_SPI
-+        /********************************************************************/
-+      /* Read the CMOS clock on the Microtronix Datacom O/S Support card. */
-+      /* Use the SPI driver code, but circumvent the file system by using */
-+        /* its internal functions.                                          */
-+        /********************************************************************/
-+        int  hr;
-+
-+      struct                               /*********************************/
-+        {                                    /* The SPI payload. Warning: the */
-+            unsigned short register_addr;  /* sizeof() operator will return */
-+            unsigned char  value;          /* a length of 4 instead of 3!   */
-+        } spi_data;                          /*********************************/
-+
-+
-+      if ( spi_open( NULL, NULL ) )
-+      {
-+          printk( "Cannot open SPI driver to read system CMOS clock.\n" );
-+          *year = *month = *date = *hour = *min = *sec = 0;
-+          return;
-+      }
-+
-+      spi_lseek( NULL, clockCS, 0 /* == SEEK_SET */ );
-+
-+      spi_data.register_addr = clock_write_control;
-+      spi_data.value         = 0x40; // Write protect
-+      spi_write( NULL, (const char *)&spi_data, 3, NULL  );
-+
-+      spi_data.register_addr = clock_read_sec;
-+      spi_data.value         = 0;
-+      spi_read( NULL, (char *)&spi_data, 3, NULL );
-+      *sec = (int)bcd2char( spi_data.value );
-+
-+      spi_data.register_addr = clock_read_min;
-+      spi_data.value         = 0;
-+      spi_read( NULL, (char *)&spi_data, 3, NULL  );
-+      *min = (int)bcd2char( spi_data.value );
-+
-+      spi_data.register_addr = clock_read_hour;
-+      spi_data.value         = 0;
-+      spi_read( NULL, (char *)&spi_data, 3, NULL  );
-+      hr = (int)bcd2char( spi_data.value );
-+      if ( hr & 0x40 )  // Check 24-hr bit
-+          hr = (hr & 0x3F) + 12;     // Convert to 24-hr
-+
-+      *hour = hr;
-+
-+
-+
-+      spi_data.register_addr = clock_read_date;
-+      spi_data.value         = 0;
-+      spi_read( NULL, (char *)&spi_data, 3, NULL  );
-+      *date = (int)bcd2char( spi_data.value );
-+
-+      spi_data.register_addr = clock_read_month;
-+      spi_data.value         = 0;
-+      spi_read( NULL, (char *)&spi_data, 3, NULL  );
-+      *month = (int)bcd2char( spi_data.value );
-+
-+      spi_data.register_addr = clock_read_year;
-+      spi_data.value         = 0;
-+      spi_read( NULL, (char *)&spi_data, 3, NULL  );
-+      *year = (int)bcd2char( spi_data.value );
-+
-+
-+      spi_release( NULL, NULL );
-+#else
-+      *year = *month = *date = *hour = *min = *sec = 0;
-+
-+#endif
-+}
-+
-+static void *cpuinfo_start (struct seq_file *m, loff_t *pos)
-+{
-+      return *pos < NR_CPUS ? ((void *) 0x12345678) : NULL;
-+}
-+
-+static void *cpuinfo_next (struct seq_file *m, void *v, loff_t *pos)
-+{
-+      ++*pos;
-+      return cpuinfo_start (m, pos);
-+}
-+
-+static void cpuinfo_stop (struct seq_file *m, void *v)
-+{
-+}
-+
-+struct seq_operations cpuinfo_op = {
-+      start:  cpuinfo_start,
-+      next:   cpuinfo_next,
-+      stop:   cpuinfo_stop,
-+      show:   show_cpuinfo
-+};
-+
-+
-+// adapted from linux/arch/arm/mach-versatile/core.c and mach-bast
-+// note, hardware MAC address is still undefined
-+
-+#if defined(CONFIG_SMC91X) && defined(na_enet)
-+
-+#ifndef LAN91C111_REGISTERS_OFFSET
-+#define LAN91C111_REGISTERS_OFFSET 0x300
-+#endif
-+
-+static struct resource smc91x_resources[] = {
-+      [0] = {
-+              .start          = na_enet + LAN91C111_REGISTERS_OFFSET,
-+              .end            = na_enet + LAN91C111_REGISTERS_OFFSET + 0x100 - 1,    // 32bits,64k, LAN91C111_REGISTERS_OFFSET 0x0300 ?
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start          = na_enet_irq,
-+              .end            = na_enet_irq,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+static struct platform_device smc91x_device = {
-+      .name           = "smc91x",
-+      .id             = 0,
-+      .num_resources  = ARRAY_SIZE(smc91x_resources),
-+      .resource       = smc91x_resources,
-+};
-+static int __init smc91x_device_init(void)
-+{
-+      /* customizes platform devices, or adds new ones */
-+      platform_device_register(&smc91x_device);
-+      return 0;
-+}
-+arch_initcall(smc91x_device_init);
-+#endif // CONFIG_SMC91X
-+
-+
-+#if defined(na_DM9000A) && !defined(na_dm9000)   // defs for DE2
-+#define na_dm9000 na_DM9000A
-+#define na_dm9000_irq na_DM9000A_irq
-+#endif
-+
-+#if defined(CONFIG_DM9000) && defined(na_dm9000)
-+#include <linux/dm9000.h>
-+static struct resource dm9k_resource[] = {
-+      [0] = {
-+              .start = na_dm9000,
-+              .end   = na_dm9000 + 3,
-+              .flags = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start = na_dm9000 + 4,
-+              .end   = na_dm9000 + 4 + 3,
-+              .flags = IORESOURCE_MEM,
-+      },
-+      [2] = {
-+              .start = na_dm9000_irq,
-+              .end   = na_dm9000_irq,
-+              .flags = IORESOURCE_IRQ,
-+      }
-+
-+};
-+static struct dm9000_plat_data dm9k_platdata = {
-+      .flags          = DM9000_PLATF_16BITONLY,
-+};
-+static struct platform_device dm9k_device = {
-+      .name           = "dm9000",
-+      .id             = 0,
-+      .num_resources  = ARRAY_SIZE(dm9k_resource),
-+      .resource       = dm9k_resource,
-+      .dev            = {
-+              .platform_data = &dm9k_platdata,
-+      }
-+};
-+static int __init dm9k_device_init(void)
-+{
-+      /* customizes platform devices, or adds new ones */
-+      platform_device_register(&dm9k_device);
-+      return 0;
-+}
-+arch_initcall(dm9k_device_init);
-+#endif // CONFIG_DM9000
-+
-+
-+#if defined(CONFIG_SERIO_ALTPS2) && defined(na_ps2_0)
-+
-+static struct resource altps2_0_resources[] = {
-+      [0] = {
-+              .start          = na_ps2_0,
-+              .end            = na_ps2_0 + 0x8 - 1,
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start          = na_ps2_0_irq,
-+              .end            = na_ps2_0_irq,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+static struct platform_device altps2_0_device = {
-+      .name           = "altps2",
-+      .id             = 0,
-+      .num_resources  = ARRAY_SIZE(altps2_0_resources),
-+      .resource       = altps2_0_resources,
-+};
-+
-+#if defined(na_ps2_1)
-+static struct resource altps2_1_resources[] = {
-+      [0] = {
-+              .start          = na_ps2_1,
-+              .end            = na_ps2_1 + 0x8 - 1,
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start          = na_ps2_1_irq,
-+              .end            = na_ps2_1_irq,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+static struct platform_device altps2_1_device = {
-+      .name           = "altps2",
-+      .id             = 0,
-+      .num_resources  = ARRAY_SIZE(altps2_1_resources),
-+      .resource       = altps2_1_resources,
-+};
-+#endif // na_ps2_1
-+
-+static int __init altps2_device_init(void)
-+{
-+      /* customizes platform devices, or adds new ones */
-+      platform_device_register(&altps2_0_device);
-+#if defined(na_ps2_1)
-+      platform_device_register(&altps2_1_device);
-+#endif // na_ps2_1
-+      return 0;
-+}
-+arch_initcall(altps2_device_init);
-+#endif // CONFIG_SERIO_ALTPS2
-+
-+#if defined(CONFIG_I2C_NIOS2_GPIO) && defined(na_gpio_0)
-+#include <asm/gpio.h>
-+
-+static struct gpio_i2c_pins i2c_gpio_0_pins = {
-+        .sda_pin      = (na_gpio_0+(0<<2)),
-+      .scl_pin        = (na_gpio_0+(1<<2)),
-+};
-+
-+static struct platform_device i2c_gpio_0_controller = {
-+      .name           = "GPIO-I2C",
-+      .id             = 0,
-+      .dev            = {
-+              .platform_data = &i2c_gpio_0_pins,
-+      },
-+      .num_resources  = 0
-+};
-+
-+static int __init i2c_gpio_device_init(void)
-+{
-+      /* customizes platform devices, or adds new ones */
-+      platform_device_register(&i2c_gpio_0_controller);
-+      return 0;
-+}
-+arch_initcall(i2c_gpio_device_init);
-+
-+#endif // CONFIG_I2C_NIOS2_GPIO
-diff --git a/arch/nios2nommu/kernel/signal.c b/arch/nios2nommu/kernel/signal.c
-new file mode 100644
-index 0000000..d8c30dc
---- /dev/null
-+++ b/arch/nios2nommu/kernel/signal.c
-@@ -0,0 +1,738 @@
-+/*
-+ * linux/arch/nios2nommu/kernel/signal.c
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file COPYING in the main directory of this archive
-+ * for more details.
-+ *
-+ * Linux/m68k support by Hamish Macdonald
-+ *
-+ * 68060 fixes by Jesper Skov
-+ *
-+ * 1997-12-01  Modified for POSIX.1b signals by Andreas Schwab
-+ *
-+ * mathemu support by Roman Zippel
-+ *  (Note: fpstate in the signal context is completely ignored for the emulator
-+ *         and the internal floating point format is put on stack)
-+ *
-+ * ++roman (07/09/96): implemented signal stacks (specially for tosemu on
-+ * Atari :-) Current limitation: Only one sigstack can be active at one time.
-+ * If a second signal with SA_ONSTACK set arrives while working on a sigstack,
-+ * SA_ONSTACK is ignored. This behaviour avoids lots of trouble with nested
-+ * signal handlers!
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/kernel.h>
-+#include <linux/signal.h>
-+#include <linux/errno.h>
-+#include <linux/wait.h>
-+#include <linux/ptrace.h>
-+#include <linux/unistd.h>
-+#include <linux/stddef.h>
-+#include <linux/highuid.h>
-+#include <linux/tty.h>
-+#include <linux/personality.h>
-+#include <linux/binfmts.h>
-+
-+#include <asm/setup.h>
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+#include <asm/traps.h>
-+#include <asm/ucontext.h>
-+
-+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-+
-+asmlinkage long sys_wait4(pid_t pid, unsigned int * stat_addr, int options,
-+                      struct rusage * ru);
-+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
-+
-+/*
-+ * Atomically swap in the new signal mask, and wait for a signal.
-+ */
-+asmlinkage int do_sigsuspend(struct pt_regs *regs)
-+{
-+      old_sigset_t mask = regs->r4;  // Verify correct syscall reg
-+      sigset_t saveset;
-+
-+      mask &= _BLOCKABLE;
-+      spin_lock_irq(&current->sighand->siglock);
-+      saveset = current->blocked;
-+      siginitset(&current->blocked, mask);
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+
-+      regs->r2 = -EINTR;
-+      while (1) {
-+              current->state = TASK_INTERRUPTIBLE;
-+              schedule();
-+              if (do_signal(&saveset, regs))
-+                      return -EINTR;
-+      }
-+}
-+
-+asmlinkage int
-+do_rt_sigsuspend(struct pt_regs *regs)
-+{
-+      sigset_t *unewset = (sigset_t *)regs->r4;
-+      size_t sigsetsize = (size_t)regs->r5;
-+      sigset_t saveset, newset;
-+
-+      /* XXX: Don't preclude handling different sized sigset_t's.  */
-+      if (sigsetsize != sizeof(sigset_t))
-+              return -EINVAL;
-+
-+      if (copy_from_user(&newset, unewset, sizeof(newset)))
-+              return -EFAULT;
-+      sigdelsetmask(&newset, ~_BLOCKABLE);
-+
-+      spin_lock_irq(&current->sighand->siglock);
-+      saveset = current->blocked;
-+      current->blocked = newset;
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+
-+      regs->r2 = -EINTR;
-+      while (1) {
-+              current->state = TASK_INTERRUPTIBLE;
-+              schedule();
-+              if (do_signal(&saveset, regs))
-+                      return -EINTR;
-+      }
-+}
-+
-+asmlinkage int 
-+sys_sigaction(int sig, const struct old_sigaction *act,
-+            struct old_sigaction *oact)
-+{
-+      struct k_sigaction new_ka, old_ka;
-+      int ret;
-+
-+      if (act) {
-+              old_sigset_t mask;
-+              if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
-+                  __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
-+                  __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
-+                      return -EFAULT;
-+              __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-+              __get_user(mask, &act->sa_mask);
-+              siginitset(&new_ka.sa.sa_mask, mask);
-+      }
-+
-+      ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-+
-+      if (!ret && oact) {
-+              if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
-+                  __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
-+                  __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
-+                      return -EFAULT;
-+              __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-+              __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-+      }
-+
-+      return ret;
-+}
-+
-+/*
-+ * Do a signal return; undo the signal stack.
-+ *
-+ * Keep the return code on the stack quadword aligned!
-+ * That makes the cache flush below easier.
-+ */
-+
-+
-+struct sigframe
-+{
-+      char retcode[12];
-+      unsigned long extramask[_NSIG_WORDS-1];
-+      struct sigcontext sc;
-+};
-+
-+struct rt_sigframe
-+{
-+      char retcode[12];
-+      struct siginfo info;
-+      struct ucontext uc;
-+};
-+
-+#ifdef CONFIG_FPU
-+
-+static unsigned char fpu_version = 0; /* version number of fpu, set by setup_frame */
-+
-+static inline int restore_fpu_state(struct sigcontext *sc)
-+{
-+      int err = 1;
-+
-+      if (FPU_IS_EMU) {
-+          /* restore registers */
-+          memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12);
-+          memcpy(current->thread.fp, sc->sc_fpregs, 24);
-+          return 0;
-+      }
-+
-+      if (sc->sc_fpstate[0]) {
-+          /* Verify the frame format.  */
-+          if (sc->sc_fpstate[0] != fpu_version)
-+              goto out;
-+
-+          __asm__ volatile ("Nios II FPU"
-+                            : /* no outputs */
-+                            : );
-+      }
-+      __asm__ volatile ("Nios II FPU"
-+                        : : );
-+      err = 0;
-+
-+out:
-+      return err;
-+}
-+
-+#define FPCONTEXT_SIZE        216
-+#define uc_fpstate    uc_filler[0]
-+#define uc_formatvec  uc_filler[FPCONTEXT_SIZE/4]
-+#define uc_extra      uc_filler[FPCONTEXT_SIZE/4+1]
-+
-+static inline int rt_restore_fpu_state(struct ucontext *uc)
-+{
-+      unsigned char fpstate[FPCONTEXT_SIZE];
-+      int context_size = 0;
-+      fpregset_t fpregs;
-+      int err = 1;
-+
-+      if (FPU_IS_EMU) {
-+              /* restore fpu control register */
-+              if (__copy_from_user(current->thread.fpcntl,
-+                              &uc->uc_mcontext.fpregs.f_pcr, 12))
-+                      goto out;
-+              /* restore all other fpu register */
-+              if (__copy_from_user(current->thread.fp,
-+                              uc->uc_mcontext.fpregs.f_fpregs, 96))
-+                      goto out;
-+              return 0;
-+      }
-+
-+      if (__get_user(*(long *)fpstate, (long *)&uc->uc_fpstate))
-+              goto out;
-+      if (fpstate[0]) {
-+              context_size = fpstate[1];
-+
-+              /* Verify the frame format.  */
-+              if (fpstate[0] != fpu_version)
-+                      goto out;
-+              if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs,
-+                   sizeof(fpregs)))
-+                      goto out;
-+              __asm__ volatile ("Nios II FPU"
-+                                : /* no outputs */
-+                                : );
-+      }
-+      if (context_size &&
-+          __copy_from_user(fpstate + 4, (long *)&uc->uc_fpstate + 1,
-+                           context_size))
-+              goto out;
-+      __asm__ volatile ("Nios II FPU"
-+                         : : );
-+      err = 0;
-+
-+out:
-+      return err;
-+}
-+
-+#endif
-+
-+static inline int
-+restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, void *fp,
-+                 int *pr2)
-+{
-+      int err = 0;
-+      int estatus;
-+
-+      estatus = regs->estatus;
-+
-+      /* get previous pt_regs */
-+      if (copy_from_user(regs, &usc->regs, sizeof(*regs)))
-+              goto badframe;
-+
-+      /* Prevent user from being able to change
-+       * certain processor status bits. Currently nothing.
-+       */
-+      regs->estatus = (estatus & 0xffffffff) | (regs->estatus & 0);
-+
-+      *pr2 = regs->r2;
-+      regs->orig_r2 = -1;             /* disable syscall checks */
-+
-+#ifdef CONFIG_FPU
-+      err |= restore_fpu_state(&context);
-+#endif
-+
-+      return err;
-+
-+badframe:
-+      return 1;
-+}
-+
-+static inline int
-+rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
-+                  struct ucontext *uc, int *pr2)
-+{
-+      int temp;
-+      greg_t *gregs = uc->uc_mcontext.gregs;
-+      unsigned long usp;
-+      int err;
-+
-+      err = __get_user(temp, &uc->uc_mcontext.version);
-+      if (temp != MCONTEXT_VERSION)
-+              goto badframe;
-+      /* restore passed registers */
-+      err |= __get_user(regs->r1, &gregs[0]);
-+      err |= __get_user(regs->r2, &gregs[1]);
-+      err |= __get_user(regs->r3, &gregs[2]);
-+      err |= __get_user(regs->r4, &gregs[3]);
-+      err |= __get_user(regs->r5, &gregs[4]);
-+      err |= __get_user(regs->r6, &gregs[5]);
-+      err |= __get_user(regs->r7, &gregs[6]);
-+      err |= __get_user(regs->r8, &gregs[7]);
-+      err |= __get_user(regs->r9, &gregs[8]);
-+      err |= __get_user(regs->r10, &gregs[9]);
-+      err |= __get_user(regs->r11, &gregs[10]);
-+      err |= __get_user(regs->r12, &gregs[11]);
-+      err |= __get_user(regs->r13, &gregs[12]);
-+      err |= __get_user(regs->r14, &gregs[13]);
-+      err |= __get_user(regs->r15, &gregs[14]);
-+      err |= __get_user(sw->r16, &gregs[15]);
-+      err |= __get_user(sw->r17, &gregs[16]);
-+      err |= __get_user(sw->r18, &gregs[17]);
-+      err |= __get_user(sw->r19, &gregs[18]);
-+      err |= __get_user(sw->r20, &gregs[19]);
-+      err |= __get_user(sw->r21, &gregs[20]);
-+      err |= __get_user(sw->r22, &gregs[21]);
-+      err |= __get_user(sw->r23, &gregs[22]);
-+      err |= __get_user(usp, &gregs[23]);
-+      err |= __get_user(sw->fp, &gregs[24]);  // Verify, should this be settable
-+      err |= __get_user(sw->gp, &gregs[25]);  // Verify, should this be settable
-+
-+      err |= __get_user(temp, &gregs[26]);  // Not really necessary no user settable bits
-+      regs->estatus = (regs->estatus & 0xffffffff) | (temp & 0x0);
-+      err |= __get_user(regs->status_extension, 
-+                        &uc->uc_mcontext.status_extension);
-+      regs->orig_r2 = -1;             /* disable syscall checks */
-+
-+      if (do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT)
-+              goto badframe;
-+
-+      *pr2 = regs->r2;
-+      return err;
-+
-+badframe:
-+      return 1;
-+}
-+
-+asmlinkage int do_sigreturn(struct pt_regs *regs)
-+{
-+      struct sigframe *frame = (struct sigframe *) regs->sp;
-+      sigset_t set;
-+      int rval;
-+
-+      if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-+              goto badframe;
-+      if (__get_user(set.sig[0], &frame->sc.sc_mask) ||
-+          (_NSIG_WORDS > 1 &&
-+           __copy_from_user(&set.sig[1], &frame->extramask,
-+                            sizeof(frame->extramask))))
-+              goto badframe;
-+
-+      sigdelsetmask(&set, ~_BLOCKABLE);
-+      spin_lock_irq(&current->sighand->siglock);
-+      current->blocked = set;
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+      
-+      if (restore_sigcontext(regs, &frame->sc, frame + 1, &rval))
-+              goto badframe;
-+      return rval;
-+
-+badframe:
-+      force_sig(SIGSEGV, current);
-+      return 0;
-+}
-+
-+asmlinkage int do_rt_sigreturn(struct switch_stack *sw)
-+{
-+      struct pt_regs *regs = (struct pt_regs *) sw + 1;
-+      struct rt_sigframe *frame = (struct rt_sigframe *) regs->sp;  // Verify, can we follow the stack back
-+      sigset_t set;
-+      int rval;
-+
-+      if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-+              goto badframe;
-+      if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
-+              goto badframe;
-+
-+      sigdelsetmask(&set, ~_BLOCKABLE);
-+      spin_lock_irq(&current->sighand->siglock);
-+      current->blocked = set;
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+      
-+      if (rt_restore_ucontext(regs, sw, &frame->uc, &rval))
-+              goto badframe;
-+      return rval;
-+
-+badframe:
-+      force_sig(SIGSEGV, current);
-+      return 0;
-+}
-+
-+#ifdef CONFIG_FPU
-+/*
-+ * Set up a signal frame.
-+ *
-+ * Not converted, no FPU support at moment.
-+ */
-+
-+static inline int save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
-+{
-+      int err = 0;
-+
-+      if (FPU_IS_EMU) {
-+              /* save registers */
-+              err |= copy_to_user(&sc->sc_fpcntl, current->thread.fpcntl, 12);
-+              err |= copy_to_user(&sc->sc_fpregs, current->thread.fp, 24);
-+              return err;
-+      }
-+
-+      __asm__ volatile ("Nios II FPUt"
-+                        : : );
-+
-+      if (sc->sc_fpstate[0]) {
-+              fpu_version = sc->sc_fpstate[0];
-+              __asm__ volatile ("Nios II FPU"
-+                                : /* no outputs */
-+                                : 
-+                                : );
-+      }
-+      return err;
-+}
-+
-+static inline int rt_save_fpu_state(struct ucontext *uc, struct pt_regs *regs)
-+{
-+      unsigned char fpstate[FPCONTEXT_SIZE];
-+      int context_size = 0;
-+      int err = 0;
-+
-+      if (FPU_IS_EMU) {
-+              /* save fpu control register */
-+              err |= copy_to_user(&uc->uc_mcontext.fpregs.f_pcr,
-+                              current->thread.fpcntl, 12);
-+              /* save all other fpu register */
-+              err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs,
-+                              current->thread.fp, 96);
-+              return err;
-+      }
-+
-+      __asm__ volatile ("Nios II FPU"
-+                        : : : );
-+
-+      err |= __put_user(*(long *)fpstate, (long *)&uc->uc_fpstate);
-+      if (fpstate[0]) {
-+              fpregset_t fpregs;
-+              context_size = fpstate[1];
-+              fpu_version = fpstate[0];
-+              __asm__ volatile ("Nios II FPU"
-+                                : /* no outputs */
-+                                : 
-+                                : );
-+              err |= copy_to_user(&uc->uc_mcontext.fpregs, &fpregs,
-+                                  sizeof(fpregs));
-+      }
-+      if (context_size)
-+              err |= copy_to_user((long *)&uc->uc_fpstate + 1, fpstate + 4,
-+                                  context_size);
-+      return err;
-+}
-+
-+#endif
-+
-+static int setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
-+                           unsigned long mask)
-+{
-+      int err = 0;
-+
-+      err |= __put_user(mask, &sc->sc_mask);
-+      err |= copy_to_user(&sc->regs, regs, sizeof(*regs));
-+#ifdef CONFIG_FPU
-+      err |= save_fpu_state(sc, regs);
-+#endif
-+      return err;
-+}
-+
-+static inline int rt_setup_ucontext(struct ucontext *uc, struct pt_regs *regs)
-+{
-+      struct switch_stack *sw = (struct switch_stack *)regs - 1;
-+      greg_t *gregs = uc->uc_mcontext.gregs;
-+      int err = 0;
-+
-+      err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
-+      err |= __put_user(regs->status_extension, 
-+                        &uc->uc_mcontext.status_extension);
-+      err |= __put_user(regs->r1, &gregs[0]);
-+      err |= __put_user(regs->r2, &gregs[1]);
-+      err |= __put_user(regs->r3, &gregs[2]);
-+      err |= __put_user(regs->r4, &gregs[3]);
-+      err |= __put_user(regs->r5, &gregs[4]);
-+      err |= __put_user(regs->r6, &gregs[5]);
-+      err |= __put_user(regs->r7, &gregs[6]);
-+      err |= __put_user(regs->r8, &gregs[7]);
-+      err |= __put_user(regs->r9, &gregs[8]);
-+      err |= __put_user(regs->r10, &gregs[9]);
-+      err |= __put_user(regs->r11, &gregs[10]);
-+      err |= __put_user(regs->r12, &gregs[11]);
-+      err |= __put_user(regs->r13, &gregs[12]);
-+      err |= __put_user(regs->r14, &gregs[13]);
-+      err |= __put_user(regs->r15, &gregs[14]);
-+      err |= __put_user(sw->r16, &gregs[15]);
-+      err |= __put_user(sw->r17, &gregs[16]);
-+      err |= __put_user(sw->r18, &gregs[17]);
-+      err |= __put_user(sw->r19, &gregs[18]);
-+      err |= __put_user(sw->r20, &gregs[19]);
-+      err |= __put_user(sw->r21, &gregs[20]);
-+      err |= __put_user(sw->r22, &gregs[21]);
-+      err |= __put_user(sw->r23, &gregs[22]);
-+      err |= __put_user(regs->sp, &gregs[23]);
-+      err |= __put_user(sw->fp, &gregs[24]);
-+      err |= __put_user(sw->gp, &gregs[25]);
-+#ifdef CONFIG_FPU
-+      err |= rt_save_fpu_state(uc, regs);
-+#endif
-+      return err;
-+}
-+
-+extern void cache_push_v (unsigned long vaddr, int len);
-+
-+static inline void push_cache (unsigned long vaddr)
-+{
-+      cache_push_v(vaddr,12);
-+}
-+
-+static inline void *
-+get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
-+{
-+      unsigned long usp;
-+
-+      /* Default to using normal stack.  */
-+      usp = regs->sp;
-+
-+      /* This is the X/Open sanctioned signal stack switching.  */
-+      if (ka->sa.sa_flags & SA_ONSTACK) {
-+              if (!on_sig_stack(usp))
-+                      usp = current->sas_ss_sp + current->sas_ss_size;
-+      }
-+      return (void *)((usp - frame_size) & -8UL);  // Verify, is it 32 or 64 bit aligned
-+}
-+
-+static void setup_frame (int sig, struct k_sigaction *ka,
-+                       sigset_t *set, struct pt_regs *regs)
-+{
-+      struct sigframe *frame;
-+      int err = 0;
-+
-+      frame = get_sigframe(ka, regs, sizeof(*frame));
-+
-+      if (_NSIG_WORDS > 1)
-+              err |= copy_to_user(frame->extramask, &set->sig[1],
-+                                  sizeof(frame->extramask));
-+
-+      err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
-+
-+      /* Set up to return from userspace.  */
-+      regs->ra = (unsigned long) &frame->retcode[0];
-+      /* movi r3,__NR_sigreturn */
-+      err |= __put_user(0x00c00004 + (__NR_sigreturn << 6), (long *)(frame->retcode));
-+      /* mov r2,r0 */
-+      err |= __put_user(0x0005883a, (long *)(frame->retcode + 4));
-+      /* trap */
-+      err |= __put_user(0x003b683a, (long *)(frame->retcode + 8));
-+
-+      if (err)
-+              goto give_sigsegv;
-+
-+      push_cache ((unsigned long) &frame->retcode);
-+
-+      /* Set up registers for signal handler */
-+      regs->sp = (unsigned long) frame;
-+      regs->r4 = (unsigned long) (current_thread_info()->exec_domain
-+                                  && current_thread_info()->exec_domain->signal_invmap
-+                                  && sig < 32
-+                                  ? current_thread_info()->exec_domain->signal_invmap[sig]
-+                                  : sig);
-+      regs->ea = (unsigned long) ka->sa.sa_handler;
-+      return;
-+
-+give_sigsegv:
-+      if (sig == SIGSEGV)
-+              ka->sa.sa_handler = SIG_DFL;
-+      force_sig(SIGSEGV, current);
-+}
-+
-+static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
-+                          sigset_t *set, struct pt_regs *regs)
-+{
-+      struct rt_sigframe *frame;
-+      int err = 0;
-+
-+      frame = get_sigframe(ka, regs, sizeof(*frame));
-+
-+      err |= copy_siginfo_to_user(&frame->info, info);
-+
-+      /* Create the ucontext.  */
-+      err |= __put_user(0, &frame->uc.uc_flags);
-+      err |= __put_user(0, &frame->uc.uc_link);
-+      err |= __put_user((void *)current->sas_ss_sp,
-+                        &frame->uc.uc_stack.ss_sp);
-+      err |= __put_user(sas_ss_flags(regs->sp),
-+                        &frame->uc.uc_stack.ss_flags);
-+      err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-+      err |= rt_setup_ucontext(&frame->uc, regs);
-+      err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
-+
-+      /* Set up to return from userspace.  */
-+      regs->ra = (unsigned long) &frame->retcode[0];
-+      /* movi r3,__NR_rt_sigreturn */
-+      err |= __put_user(0x00c00004 + (__NR_rt_sigreturn << 6), (long *)(frame->retcode));
-+      /* mov r2,r0 */
-+      err |= __put_user(0x0005883a, (long *)(frame->retcode + 4));
-+      /* trap */
-+      err |= __put_user(0x003b683a, (long *)(frame->retcode + 8));
-+
-+      if (err)
-+              goto give_sigsegv;
-+
-+      push_cache ((unsigned long) &frame->retcode);
-+
-+      /* Set up registers for signal handler */
-+      regs->sp = (unsigned long) frame;
-+      regs->r4 = (unsigned long) (current_thread_info()->exec_domain
-+                                  && current_thread_info()->exec_domain->signal_invmap
-+                                  && sig < 32
-+                                  ? current_thread_info()->exec_domain->signal_invmap[sig]
-+                                  : sig);
-+      regs->r5 = (unsigned long) &frame->info;
-+      regs->r6 = (unsigned long) &frame->uc;
-+      regs->ea = (unsigned long) ka->sa.sa_handler;
-+      return;
-+
-+give_sigsegv:
-+      if (sig == SIGSEGV)
-+              ka->sa.sa_handler = SIG_DFL;
-+      force_sig(SIGSEGV, current);
-+}
-+
-+static inline void
-+handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
-+{
-+      switch (regs->r2) {
-+      case -ERESTARTNOHAND:
-+              if (!has_handler)
-+                      goto do_restart;
-+              regs->r2 = -EINTR;
-+              break;
-+
-+      case -ERESTARTSYS:
-+              if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
-+                      regs->r2 = -EINTR;
-+                      break;
-+              }
-+      /* fallthrough */
-+      case -ERESTARTNOINTR:
-+      do_restart:
-+              regs->r2 = regs->orig_r2;
-+              regs->ea -= 4;
-+              break;
-+      }
-+}
-+
-+/*
-+ * OK, we're invoking a handler
-+ */
-+static void
-+handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
-+            sigset_t *oldset, struct pt_regs *regs)
-+{
-+      /* are we from a system call? */
-+      if (regs->orig_r2 >= 0)
-+              /* If so, check system call restarting.. */
-+              handle_restart(regs, ka, 1);
-+
-+      /* set up the stack frame */
-+      if (ka->sa.sa_flags & SA_SIGINFO)
-+              setup_rt_frame(sig, ka, info, oldset, regs);
-+      else
-+              setup_frame(sig, ka, oldset, regs);
-+
-+      if (ka->sa.sa_flags & SA_ONESHOT)
-+              ka->sa.sa_handler = SIG_DFL;
-+
-+      if (!(ka->sa.sa_flags & SA_NODEFER)) {
-+              spin_lock_irq(&current->sighand->siglock);
-+              sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-+              sigaddset(&current->blocked,sig);
-+              recalc_sigpending();
-+              spin_unlock_irq(&current->sighand->siglock);
-+      }
-+}
-+
-+/*
-+ * Note that 'init' is a special process: it doesn't get signals it doesn't
-+ * want to handle. Thus you cannot kill init even with a SIGKILL even by
-+ * mistake.
-+ */
-+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
-+{
-+      struct k_sigaction ka;
-+      siginfo_t info;
-+      int signr;
-+
-+      /*
-+       * We want the common case to go fast, which
-+       * is why we may in certain cases get here from
-+       * kernel mode. Just return without doing anything
-+       * if so.
-+       */
-+      if (!user_mode(regs))
-+              return 1;
-+
-+      /* FIXME - Do we still need to do this ? */
-+      current->thread.kregs = regs;
-+
-+      if (!oldset)
-+              oldset = &current->blocked;
-+
-+      signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-+      if (signr > 0) {
-+              /* Whee!  Actually deliver the signal.  */
-+              handle_signal(signr, &ka, &info, oldset, regs);
-+              return 1;
-+      }
-+
-+      /* Did we come from a system call? */
-+      if (regs->orig_r2 >= 0){
-+              /* Restart the system call - no handlers present */
-+              if (regs->r2 == -ERESTARTNOHAND
-+                  || regs->r2 == -ERESTARTSYS
-+                  || regs->r2 == -ERESTARTNOINTR) {
-+                      regs->r2 = regs->orig_r2;
-+                      regs->ea -= 4;
-+              } else if (regs->r2 == -ERESTART_RESTARTBLOCK) {
-+                      regs->r2 = __NR_restart_syscall;
-+                      regs->ea -= 4;
-+              }
-+      }
-+      return 0;
-+}
-diff --git a/arch/nios2nommu/kernel/start.c b/arch/nios2nommu/kernel/start.c
-new file mode 100644
-index 0000000..bca81fc
---- /dev/null
-+++ b/arch/nios2nommu/kernel/start.c
-@@ -0,0 +1,502 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/kernel/start.c
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ * May/20/2005                dgt         Altera NiosII Custom shift instr(s)
-+ *                           possibly assumed by memcpy, etc; ensure
-+ *                           "correct" core loaded therefore if so.
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/system.h>
-+#include <asm/nios.h>
-+#include <linux/kernel.h>
-+#include <linux/ctype.h>
-+#include <linux/string.h>
-+#include <linux/time.h>
-+#include <linux/start_kernel.h>
-+
-+  #ifdef CONFIG_SERIAL_AJUART                       //;dgt;20may05;
-+    #ifdef CONFIG_SERIAL_AJUART_CONSOLE             //;dgt;20may05;
-+
-+      #include <linux/console.h>                    //;dgt;20may05;
-+      #include <asm/altera_juart.h>                 //;dgt;20may05;
-+
-+      extern struct console juart_console;          //;dgt;20may05;
-+
-+    #endif    // CONFIG_SERIAL_AJUART               //;dgt;20may05;
-+  #endif    // CONFIG_SERIAL_AJUART_CONSOLE         //;dgt;20may05;
-+
-+//;dgt;20may05; #ifdef CONFIG_CRC_CHECK
-+
-+//  #if defined(CONFIG_NIOS_SERIAL)                 //;dgt;20may05;
-+//    #if defined(CONFIG_NIOS_SERIAL_CONSOLE)       //;dgt;20may05;
-+        #if defined(nasys_printf_uart)              //;dgt;20may05;
-+          static void putsNoNewLine( unsigned char *s )
-+          {
-+            while(*s) {
-+                while (!(nasys_printf_uart->np_uartstatus &
-+                         np_uartstatus_trdy_mask));
-+                nasys_printf_uart->np_uarttxdata = *s++;
-+            }
-+          }
-+
-+          #define NL "\r\n"
-+          static void puts(unsigned char *s)
-+          {
-+            putsNoNewLine( s );
-+            putsNoNewLine( NL );
-+          }
-+        #endif  // nasys_printf_uart                //;dgt;20may05;
-+//    #endif  // CONFIG_NIOS_SERIAL_CONSOLE)        //;dgt;20may05;
-+//  #endif  // CONFIG_NIOS_SERIAL)                  //;dgt;20may05;
-+
-+#ifdef CONFIG_CRC_CHECK                             //;dgt;20may05;
-+
-+#if 1
-+#define outchar(X) { \
-+              while (!(nasys_printf_uart->np_uartstatus & np_uartstatus_trdy_mask)); \
-+              nasys_printf_uart->np_uarttxdata = (X); }
-+#else
-+#define outchar(X) putchar(X)
-+#endif
-+#define outhex(X,Y) { \
-+              unsigned long __w; \
-+              __w = ((X) >> (Y)) & 0xf; \
-+              __w = __w > 0x9 ? 'A' + __w - 0xa : '0' + __w; \
-+              outchar(__w); }
-+#define outhex8(X) { \
-+              outhex(X,4); \
-+              outhex(X,0); }
-+#define outhex16(X) { \
-+              outhex(X,12); \
-+              outhex(X,8); \
-+              outhex(X,4); \
-+              outhex(X,0); }
-+#define outhex32(X) { \
-+              outhex(X,28); \
-+              outhex(X,24); \
-+              outhex(X,20); \
-+              outhex(X,16); \
-+              outhex(X,12); \
-+              outhex(X,8); \
-+              outhex(X,4); \
-+              outhex(X,0); }
-+#endif
-+
-+#if 0
-+static unsigned long testvar = 0xdeadbeef;
-+#endif
-+      
-+#ifdef CONFIG_CRC_CHECK
-+
-+
-+/******************************************************/
-+
-+
-+extern unsigned long __CRC_Table_Begin;
-+
-+typedef unsigned char  U8;
-+typedef unsigned long  U32;
-+
-+/* Table of CRC-32's of all single byte values */
-+const U32 crc_32_tab[] = {
-+   0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
-+   0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
-+   0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
-+   0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
-+   0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
-+   0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
-+   0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
-+   0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
-+   0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
-+   0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
-+   0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
-+   0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
-+   0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
-+   0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
-+   0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
-+   0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
-+   0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
-+   0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
-+   0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
-+   0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
-+   0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
-+   0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
-+   0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
-+   0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
-+   0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
-+   0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
-+   0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
-+   0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
-+   0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
-+   0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
-+   0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
-+   0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
-+   0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
-+   0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
-+   0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
-+   0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
-+   0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
-+   0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
-+   0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
-+   0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
-+   0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
-+   0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
-+   0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
-+   0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
-+   0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
-+   0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
-+   0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
-+   0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
-+   0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
-+   0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
-+   0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
-+   0x2d02ef8dL
-+};
-+
-+U32 Calc_CRC( const U8 *p, U32 len )
-+{
-+    U32 crc = (U32)~0L;
-+    while (len--)
-+       crc = crc_32_tab[0xFF & (crc ^ *p++)] ^ (crc >> 8);
-+   
-+    return crc ^ (U32)~0L;
-+}
-+
-+
-+
-+/******************************************************/
-+
-+
-+/* hjz: Following time stuff is hacked and modified from uC-libc (various files), which in turn was... */
-+/* This is adapted from glibc */
-+/* Copyright (C) 1991, 1993 Free Software Foundation, Inc */
-+
-+#define SECS_PER_HOUR 3600L
-+#define SECS_PER_DAY  86400L
-+typedef unsigned long time_t;
-+
-+
-+static const unsigned short int __mon_lengths[2][12] = {
-+      /* Normal years.  */
-+      {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
-+      /* Leap years.  */
-+      {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
-+};
-+/* This global is exported to the wide world in keeping
-+ * with the interface in time.h */
-+long int timezone = 0;
-+
-+static const char *dayOfWeek[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
-+static const char *month[]     = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-+                                   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-+
-+/* Nonzero if YEAR is a leap year (every 4 years,
-+   except every 100th isn't, and every 400th is).  */
-+# define __isleap(year)       ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
-+
-+struct tm
-+{
-+  int tm_sec;                 /* Seconds.     [0-60] (1 leap second) */
-+  int tm_min;                 /* Minutes.     [0-59] */
-+  int tm_hour;                        /* Hours.       [0-23] */
-+  int tm_mday;                        /* Day.         [1-31] */
-+  int tm_mon;                 /* Month.       [0-11] */
-+  int tm_year;                        /* Year - 1900.  */
-+  int tm_wday;                        /* Day of week. [0-6] */
-+  int tm_yday;                        /* Days in year.[0-365] */
-+  int tm_isdst;                       /* DST.         [-1/0/1]*/
-+
-+# ifdef       __USE_BSD
-+  long int tm_gmtoff;         /* Seconds east of UTC.  */
-+  __const char *tm_zone;      /* Timezone abbreviation.  */
-+# else
-+  long int __tm_gmtoff;               /* Seconds east of UTC.  */
-+  __const char *__tm_zone;    /* Timezone abbreviation.  */
-+# endif
-+};
-+
-+void  __tm_conv(struct tm *tmbuf, time_t *t, time_t offset)
-+{
-+      long days, rem;
-+      register int y;
-+      register const unsigned short int *ip;
-+
-+      timezone = -offset;
-+
-+      days = *t / SECS_PER_DAY;
-+      rem = *t % SECS_PER_DAY;
-+      rem += offset;
-+      while (rem < 0)
-+        {
-+          rem += SECS_PER_DAY;
-+          days--;
-+      }
-+      while (rem >= SECS_PER_DAY)
-+        {
-+          rem -= SECS_PER_DAY;
-+          days++;
-+      }
-+
-+      tmbuf->tm_hour = rem / SECS_PER_HOUR;
-+      rem           %= SECS_PER_HOUR;
-+      tmbuf->tm_min  = rem / 60;
-+      tmbuf->tm_sec  = rem % 60;
-+
-+      /* January 1, 1970 was a Thursday.  */
-+      tmbuf->tm_wday = (4 + days) % 7;
-+      if (tmbuf->tm_wday < 0)
-+          tmbuf->tm_wday += 7;
-+
-+      y = 1970;
-+      while (days >= (rem = __isleap(y) ? 366 : 365))
-+        {
-+          y++;
-+          days -= rem;
-+      }
-+
-+      while (days < 0)
-+        {
-+          y--;
-+          days += __isleap(y) ? 366 : 365;
-+      }
-+
-+      tmbuf->tm_year = y - 1900;
-+      tmbuf->tm_yday = days;
-+
-+      ip = __mon_lengths[__isleap(y)];
-+      for (y = 0; days >= ip[y]; ++y)
-+          days -= ip[y];
-+
-+      tmbuf->tm_mon   = y;
-+      tmbuf->tm_mday  = days + 1;
-+      tmbuf->tm_isdst = -1;
-+}
-+
-+
-+
-+/* hjz: NOT your traditional ctime: This one includes timezone */
-+/* (UTC) and excludes the traditional trailing newline.        */
-+char *CTime( time_t *t )
-+{
-+    static char theTime[29];
-+    struct tm tm;
-+
-+    __tm_conv( &tm, t, 0 );
-+    sprintf( theTime, "%s %s %02d %02d:%02d:%02d UTC %04d",
-+             dayOfWeek[tm.tm_wday], month[tm.tm_mon], tm.tm_mday,
-+           tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year + 1900 );
-+
-+    return theTime;
-+}
-+
-+/******************************************************/
-+
-+
-+/* hjz: polled-I/O: Get a char if one is ready, or return -1 */
-+int getc( void )
-+{
-+    if ( nasys_printf_uart->np_uartstatus & np_uartstatus_rrdy_mask )
-+        return nasys_printf_uart->np_uartrxdata;
-+    else
-+      return -1;
-+}
-+
-+
-+typedef unsigned long off_t;
-+typedef struct
-+{
-+    U8    *startAddr;
-+    U8    *endAddr;
-+    U32    CRC;
-+    time_t mtime;
-+    off_t  size;    // File size
-+    char id[44];    // Filename. If path exceeds available size, name is "..." + last 40 chars of given filename
-+    char host[32];  // hostname. If name exceeds available size name is first 28 chars of hostname + "..."
-+} FLASH_REGION_DESC;
-+
-+
-+int  Test_Flash_Regions(void)
-+{
-+    FLASH_REGION_DESC *pRegion = (FLASH_REGION_DESC *)&__CRC_Table_Begin;
-+    U32  crc;
-+    char cBuff[256];
-+    int  nrFailedRegions = 0;
-+    int  regionStatus;
-+    int  i;
-+    unsigned int startAddr = (int) pRegion->startAddr;
-+    unsigned int endAddr = (int) pRegion->endAddr;
-+
-+    puts( "***Checking flash CRC's" );
-+    if ( (startAddr == -1) || (startAddr >= endAddr) 
-+     || !( ((startAddr >= (int) NIOS_FLASH_START) && (endAddr < (int) NIOS_FLASH_END))
-+           || ((startAddr >= (int) na_flash)     && (endAddr < (int) na_flash_end)) ) )
-+    {
-+      puts( "   No Flash regions defined." );
-+        return -1;
-+    }
-+
-+
-+    for ( i = 0; pRegion->startAddr && pRegion->startAddr != (U8 *)~0L; pRegion++, i++ )
-+    {
-+        crc = Calc_CRC( pRegion->startAddr, pRegion->endAddr - pRegion->startAddr );
-+      if ( crc != pRegion->CRC )
-+      {
-+          regionStatus = 1;
-+          nrFailedRegions++;
-+      }
-+      else
-+          regionStatus = 0;
-+
-+        sprintf( cBuff, "   Region %d: 0x%08lX - 0x%08lX, CRC = 0x%08lX --> %s" NL
-+                        "        From file `%s' on host `%s'" NL
-+                      "        Dated %s, size = %lu bytes",
-+                 i, (U32)pRegion->startAddr, (U32)pRegion->endAddr, pRegion->CRC,
-+               regionStatus ? "***Failed" : "Passed",
-+                 pRegion->id, pRegion->host, CTime( &pRegion->mtime ), pRegion->size
-+               );
-+      puts( cBuff );
-+    }
-+
-+    return nrFailedRegions;
-+}
-+#endif /* CONFIG_CRC_CHECK */
-+
-+
-+int main(void) {
-+
-+#ifdef DEBUG
-+      puts("MAIN: starting c\n");
-+#endif
-+
-+#ifdef CONFIG_KGDB                            /* builtin GDB stub */
-+
-+/* Set up GDB stub, and make the first trap into it */
-+      nios_gdb_install(1); 
-+#ifdef CONFIG_BREAK_ON_START
-+      puts( "MAIN: trapping to debugger - make sure nios-elf-gdb is running on host." );
-+      nios_gdb_breakpoint(); 
-+      nop();
-+#endif
-+
-+#endif        /* CONFIG_KGDB */
-+
-+#ifdef CONFIG_CRC_CHECK
-+    #ifdef CONFIG_PROMPT_ON_MISSING_CRC_TABLES
-+      if ( Test_Flash_Regions() )
-+    #else
-+      if ( Test_Flash_Regions() > 0 )
-+    #endif
-+      {
-+          int  c;
-+            char tmp[3];
-+          while ( getc() != -1 ) // flush input
-+              ;
-+
-+          putsNoNewLine( "   Do you wish to continue (Y/N) ?  " );
-+          while ( 1 )
-+          {
-+              c = getc();
-+              if ( c == -1 )
-+                  continue;
-+
-+              if ( !isprint( c ) )
-+                  c = '?';
-+
-+              sprintf( tmp, "\b%c", c );
-+              putsNoNewLine( tmp );
-+              c = toupper( c );
-+                if ( c == 'Y' )
-+              {
-+                  puts( "" );
-+                  break;
-+                }
-+
-+              if ( c == 'N' )
-+              {
-+                  puts( NL "***Trapping to monitor..." );
-+                  return -1;
-+              }
-+          }
-+        }
-+      puts( "***Starting kernel..." );
-+
-+#endif
-+
-+  // Altera NiosII Custom shift instr(s) possibly           //;dgt;
-+  //  assumed by memcpy, etc; ensure "correct" core         //;dgt;
-+  //  loaded therefore if so.                               //;dgt;
-+
-+  #if defined(ALT_CI_ALIGN_32_N)                            //;dgt;
-+    if(ALT_CI_ALIGN_32(1, 0xA9876543,                       //;dgt;
-+                          0xB210FEDC)   != 0x10FEDCA9)      //;dgt;
-+      {                                                     //;dgt;
-+        goto badshiftci_label;                              //;dgt;
-+      }                                                     //;dgt;
-+    if(ALT_CI_ALIGN_32(2, 0xA9876543,                       //;dgt;
-+                          0xB210FEDC)   != 0xFEDCA987)      //;dgt;
-+      {                                                     //;dgt;
-+        goto badshiftci_label;                              //;dgt;
-+      }                                                     //;dgt;
-+    if(ALT_CI_ALIGN_32(3, 0xA9876543,                       //;dgt;
-+                          0xB210FEDC)   != 0xDCA98765)      //;dgt;
-+      {                                                     //;dgt;
-+        goto badshiftci_label;                              //;dgt;
-+      }                                                     //;dgt;
-+  #endif                                                    //;dgt;
-+    goto gudshiftci_label;                                  //;dgt;
-+badshiftci_label:                                           //;dgt;
-+    {                                                       //;dgt;
-+      unsigned char BadCImsg[]      =                       //;dgt;
-+            "?...ALT_CI_ALIGNn_321() NOT expected"          //;dgt;
-+            " NiosII custom instruction\n";                 //;dgt;
-+      unsigned char CIabortMsg[]    =                       //;dgt;
-+            " ...aborting uClinux startup...";              //;dgt;
-+
-+      #ifdef CONFIG_SERIAL_AJUART                           //;dgt;
-+        #ifdef CONFIG_SERIAL_AJUART_CONSOLE                 //;dgt;
-+          juart_console.index = 0;                          //;dgt;
-+          jtaguart_console_write(&(juart_console),          //;dgt;
-+                                 BadCImsg,                  //;dgt;
-+                                 strlen(BadCImsg));         //;dgt;
-+          jtaguart_console_write(&(juart_console),          //;dgt;
-+                                 CIabortMsg,                //;dgt;
-+                                 strlen(CIabortMsg));       //;dgt;
-+        #endif    // CONFIG_SERIAL_AJUART                   //;dgt;
-+      #endif    // CONFIG_SERIAL_AJUART_CONSOLE             //;dgt;
-+
-+//    #if defined(CONFIG_NIOS_SERIAL)                       //;dgt;
-+//      #if defined(CONFIG_NIOS_SERIAL_CONSOLE)             //;dgt;
-+          #if defined(nasys_printf_uart)                    //;dgt;
-+            puts(BadCImsg);                                 //;dgt;
-+            puts(CIabortMsg);                               //;dgt;
-+          #endif  // nasys_printf_uart                      //;dgt;
-+//      #endif  // CONFIG_NIOS_SERIAL_CONSOLE)              //;dgt;
-+//    #endif  // CONFIG_NIOS_SERIAL)                        //;dgt;
-+
-+        panic(" ...wrong fpga core?...");                     //;dgt;
-+    }                                                       //;dgt;
-+
-+gudshiftci_label:                                           //;dgt;
-+
-+      start_kernel();
-+      return 0;
-+}
-diff --git a/arch/nios2nommu/kernel/sys_nios2.c b/arch/nios2nommu/kernel/sys_nios2.c
-new file mode 100644
-index 0000000..8018fb0
---- /dev/null
-+++ b/arch/nios2nommu/kernel/sys_nios2.c
-@@ -0,0 +1,248 @@
-+/*
-+ * linux/arch/nios2nommu/kernel/sys_nios2.c
-+ *
-+ * Copyright (C) 2004 Microtronix Datacom Ltd.
-+ *
-+ * This file contains various random system calls that
-+ * have a non-standard calling sequence on the Linux/nios2nommu
-+ * platform.
-+ *
-+  * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+*/
-+
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/sem.h>
-+#include <linux/msg.h>
-+#include <linux/shm.h>
-+#include <linux/stat.h>
-+#include <linux/syscalls.h>
-+#include <linux/mman.h>
-+#include <linux/file.h>
-+#include <linux/utsname.h>
-+#include <linux/fs.h>
-+#include <linux/uaccess.h>
-+#include <linux/ipc.h>
-+#include <linux/unistd.h>
-+
-+#include <asm/setup.h>
-+#include <asm/cachectl.h>
-+#include <asm/traps.h>
-+#include <asm/ipc.h>
-+#include <asm/cacheflush.h>
-+
-+/*
-+ * sys_pipe() is the normal C calling standard for creating
-+ * a pipe. It's not the way unix traditionally does this, though.
-+ */
-+asmlinkage int sys_pipe(unsigned long * fildes)
-+{
-+      int fd[2];
-+      int error;
-+
-+      error = do_pipe(fd);
-+      if (!error) {
-+              if (copy_to_user(fildes, fd, 2*sizeof(int)))
-+                      error = -EFAULT;
-+      }
-+      return error;
-+}
-+
-+/* common code for old and new mmaps */
-+static inline long do_mmap2(
-+      unsigned long addr, unsigned long len,
-+      unsigned long prot, unsigned long flags,
-+      unsigned long fd, unsigned long pgoff)
-+{
-+      int error = -EBADF;
-+      struct file * file = NULL;
-+
-+      flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-+      if (!(flags & MAP_ANONYMOUS)) {
-+              file = fget(fd);
-+              if (!file)
-+                      goto out;
-+      }
-+
-+      down_write(&current->mm->mmap_sem);
-+      error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
-+      up_write(&current->mm->mmap_sem);
-+
-+      if (file)
-+              fput(file);
-+out:
-+      return error;
-+}
-+
-+asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
-+      unsigned long prot, unsigned long flags,
-+      unsigned long fd, unsigned long pgoff)
-+{
-+      return do_mmap2(addr, len, prot, flags, fd, pgoff);
-+}
-+
-+/*
-+ * Perform the select(nd, in, out, ex, tv) and mmap() system
-+ * calls. Linux/m68k cloned Linux/i386, which didn't use to be able to
-+ * handle more than 4 system call parameters, so these system calls
-+ * used a memory block for parameter passing..
-+ */
-+
-+struct mmap_arg_struct {
-+      unsigned long addr;
-+      unsigned long len;
-+      unsigned long prot;
-+      unsigned long flags;
-+      unsigned long fd;
-+      unsigned long offset;
-+};
-+
-+asmlinkage int old_mmap(struct mmap_arg_struct *arg)
-+{
-+      struct mmap_arg_struct a;
-+      int error = -EFAULT;
-+
-+      if (copy_from_user(&a, arg, sizeof(a)))
-+              goto out;
-+
-+      error = -EINVAL;
-+      if (a.offset & ~PAGE_MASK)
-+              goto out;
-+
-+      a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-+
-+      error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
-+out:
-+      return error;
-+}
-+
-+struct sel_arg_struct {
-+      unsigned long n;
-+      fd_set *inp, *outp, *exp;
-+      struct timeval *tvp;
-+};
-+
-+asmlinkage int old_select(struct sel_arg_struct *arg)
-+{
-+      struct sel_arg_struct a;
-+
-+      if (copy_from_user(&a, arg, sizeof(a)))
-+              return -EFAULT;
-+      /* sys_select() does the appropriate kernel locking */
-+      return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp);
-+}
-+
-+/*
-+ * sys_ipc() is the de-multiplexer for the SysV IPC calls..
-+ *
-+ * This is really horribly ugly.
-+ */
-+asmlinkage int sys_ipc (uint call, int first, int second,
-+                      int third, void *ptr, long fifth)
-+{
-+      int version;
-+
-+      version = call >> 16; /* hack for backward compatibility */
-+      call &= 0xffff;
-+
-+      if (call <= SEMCTL)
-+              switch (call) {
-+              case SEMOP:
-+                      return sys_semop (first, (struct sembuf *)ptr, second);
-+              case SEMGET:
-+                      return sys_semget (first, second, third);
-+              case SEMCTL: {
-+                      union semun fourth;
-+                      if (!ptr)
-+                              return -EINVAL;
-+                      if (get_user(fourth.__pad, (void **) ptr))
-+                              return -EFAULT;
-+                      return sys_semctl (first, second, third, fourth);
-+                      }
-+              default:
-+                      return -EINVAL;
-+              }
-+      if (call <= MSGCTL) 
-+              switch (call) {
-+              case MSGSND:
-+                      return sys_msgsnd (first, (struct msgbuf *) ptr, 
-+                                        second, third);
-+              case MSGRCV:
-+                      switch (version) {
-+                      case 0: {
-+                              struct ipc_kludge tmp;
-+                              if (!ptr)
-+                                      return -EINVAL;
-+                              if (copy_from_user (&tmp,
-+                                                  (struct ipc_kludge *)ptr,
-+                                                  sizeof (tmp)))
-+                                      return -EFAULT;
-+                              return sys_msgrcv (first, tmp.msgp, second,
-+                                                 tmp.msgtyp, third);
-+                              }
-+                      default:
-+                              return sys_msgrcv (first,
-+                                                 (struct msgbuf *) ptr,
-+                                                 second, fifth, third);
-+                      }
-+              case MSGGET:
-+                      return sys_msgget ((key_t) first, second);
-+              case MSGCTL:
-+                      return sys_msgctl (first, second,
-+                                         (struct msqid_ds *) ptr);
-+              default:
-+                      return -EINVAL;
-+              }
-+
-+      return -EINVAL;
-+}
-+
-+/* sys_cacheflush -- flush the processor cache.  */
-+asmlinkage int
-+sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
-+{
-+      flush_cache_all();
-+      return(0);
-+}
-+
-+asmlinkage int sys_getpagesize(void)
-+{
-+      return PAGE_SIZE;
-+}
-+
-+/*
-+ * Do a system call from kernel instead of calling sys_execve so we
-+ * end up with proper pt_regs.
-+ */
-+int kernel_execve(const char *filename, char *const argv[], char *const envp[])
-+{
-+      register long __res __asm__ ("r2") = TRAP_ID_SYSCALL;
-+      register long __sc  __asm__ ("r3") = __NR_execve;
-+      register long __a   __asm__ ("r4") = (long) filename;
-+      register long __b   __asm__ ("r5") = (long) argv;
-+      register long __c   __asm__ ("r6") = (long) envp;
-+      __asm__ __volatile__ ("trap" : "=r" (__res)
-+                      : "0" (__res), "r" (__sc), "r" (__a), "r" (__b), "r" (__c)
-+                      : "memory");
-+
-+      return __res;
-+}
-diff --git a/arch/nios2nommu/kernel/syscalltable.S b/arch/nios2nommu/kernel/syscalltable.S
-new file mode 100644
-index 0000000..3507e24
---- /dev/null
-+++ b/arch/nios2nommu/kernel/syscalltable.S
-@@ -0,0 +1,362 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/kernel/syscalltable.S
-+ *
-+ * Derived from M68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *  Copyright (C) 2002, Greg Ungerer (gerg@snapgear.com)
-+ *  Copyright (C) 2000  Lineo Inc. (www.lineo.com) 
-+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
-+ *                      Kenneth Albanowski <kjahds@kjahds.com>,
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <linux/sys.h>
-+#include <linux/linkage.h>
-+#include <asm/unistd.h>
-+#include <asm/asm-macros.h>
-+
-+.text
-+ALIGN
-+ENTRY(sys_call_table)
-+      .long sys_ni_syscall    /* 0  -  old "setup()" system call*/
-+      .long sys_exit
-+      .long sys_fork
-+      .long sys_read
-+      .long sys_write
-+      .long sys_open          /* 5 */
-+      .long sys_close
-+      .long sys_waitpid
-+      .long sys_creat
-+      .long sys_link
-+      .long sys_unlink        /* 10 */
-+      .long sys_execve
-+      .long sys_chdir
-+      .long sys_time
-+      .long sys_mknod
-+      .long sys_chmod         /* 15 */
-+      .long sys_chown16
-+      .long sys_ni_syscall    /* old break syscall holder */
-+      .long sys_stat
-+      .long sys_lseek
-+      .long sys_getpid        /* 20 */
-+      .long sys_mount
-+      .long sys_oldumount
-+      .long sys_setuid16
-+      .long sys_getuid16
-+      .long sys_stime         /* 25 */
-+      .long sys_ptrace
-+      .long sys_alarm
-+      .long sys_fstat
-+      .long sys_pause
-+      .long sys_utime         /* 30 */
-+      .long sys_ni_syscall    /* old stty syscall holder */
-+      .long sys_ni_syscall    /* old gtty syscall holder */
-+      .long sys_access
-+      .long sys_nice
-+      .long sys_ni_syscall    /* 35 */ /* old ftime syscall holder */
-+      .long sys_sync
-+      .long sys_kill
-+      .long sys_rename
-+      .long sys_mkdir
-+      .long sys_rmdir         /* 40 */
-+      .long sys_dup
-+      .long sys_pipe
-+      .long sys_times
-+      .long sys_ni_syscall    /* old prof syscall holder */
-+      .long sys_brk           /* 45 */
-+      .long sys_setgid16
-+      .long sys_getgid16
-+      .long sys_signal
-+      .long sys_geteuid16
-+      .long sys_getegid16     /* 50 */
-+      .long sys_acct
-+      .long sys_umount        /* recycled never used phys() */
-+      .long sys_ni_syscall    /* old lock syscall holder */
-+      .long sys_ioctl
-+      .long sys_fcntl         /* 55 */
-+      .long sys_ni_syscall    /* old mpx syscall holder */
-+      .long sys_setpgid
-+      .long sys_ni_syscall    /* old ulimit syscall holder */
-+      .long sys_ni_syscall
-+      .long sys_umask         /* 60 */
-+      .long sys_chroot
-+      .long sys_ustat
-+      .long sys_dup2
-+      .long sys_getppid
-+      .long sys_getpgrp       /* 65 */
-+      .long sys_setsid
-+      .long sys_sigaction
-+      .long sys_sgetmask
-+      .long sys_ssetmask
-+      .long sys_setreuid16    /* 70 */
-+      .long sys_setregid16
-+      .long sys_sigsuspend
-+      .long sys_sigpending
-+      .long sys_sethostname
-+      .long sys_setrlimit     /* 75 */
-+      .long sys_old_getrlimit
-+      .long sys_getrusage
-+      .long sys_gettimeofday
-+      .long sys_settimeofday
-+      .long sys_getgroups16   /* 80 */
-+      .long sys_setgroups16
-+      .long old_select
-+      .long sys_symlink
-+      .long sys_lstat
-+      .long sys_readlink      /* 85 */
-+      .long sys_uselib
-+      .long sys_ni_syscall    /* sys_swapon */
-+      .long sys_reboot
-+      .long old_readdir
-+      .long old_mmap          /* 90 */
-+      .long sys_munmap
-+      .long sys_truncate
-+      .long sys_ftruncate
-+      .long sys_fchmod
-+      .long sys_fchown16      /* 95 */
-+      .long sys_getpriority
-+      .long sys_setpriority
-+      .long sys_ni_syscall    /* old profil syscall holder */
-+      .long sys_statfs
-+      .long sys_fstatfs       /* 100 */
-+      .long sys_ni_syscall    /* was ioperm */
-+      .long sys_socketcall
-+      .long sys_syslog
-+      .long sys_setitimer
-+      .long sys_getitimer     /* 105 */
-+      .long sys_newstat
-+      .long sys_newlstat
-+      .long sys_newfstat
-+      .long sys_ni_syscall
-+      .long sys_ni_syscall    /* iopl for i386 */ /* 110 */
-+      .long sys_vhangup
-+      .long sys_ni_syscall    /* obsolete idle() syscall */
-+      .long sys_ni_syscall    /* vm86old for i386 */
-+      .long sys_wait4
-+      .long sys_ni_syscall    /* 115 */ /* sys_swapoff */
-+      .long sys_sysinfo
-+      .long sys_ipc
-+      .long sys_fsync
-+      .long sys_sigreturn
-+      .long sys_clone         /* 120 */
-+      .long sys_setdomainname
-+      .long sys_newuname
-+      .long sys_cacheflush    /* modify_ldt for i386 */
-+      .long sys_adjtimex
-+      .long sys_ni_syscall    /* 125 */ /* sys_mprotect */
-+      .long sys_sigprocmask
-+      .long sys_ni_syscall    /* old "creat_module" */
-+      .long sys_init_module
-+      .long sys_delete_module
-+      .long sys_ni_syscall    /* 130: old "get_kernel_syms" */
-+      .long sys_quotactl
-+      .long sys_getpgid
-+      .long sys_fchdir
-+      .long sys_bdflush
-+      .long sys_sysfs         /* 135 */
-+      .long sys_personality
-+      .long sys_ni_syscall    /* for afs_syscall */
-+      .long sys_setfsuid16
-+      .long sys_setfsgid16
-+      .long sys_llseek        /* 140 */
-+      .long sys_getdents
-+      .long sys_select
-+      .long sys_flock
-+      .long sys_ni_syscall    /* sys_msync */
-+      .long sys_readv         /* 145 */
-+      .long sys_writev
-+      .long sys_getsid
-+      .long sys_fdatasync
-+      .long sys_sysctl
-+      .long sys_ni_syscall    /* 150 */ /* sys_mlock */
-+      .long sys_ni_syscall    /* sys_munlock */
-+      .long sys_ni_syscall    /* sys_mlockall */
-+      .long sys_ni_syscall    /* sys_munlockall */
-+      .long sys_sched_setparam
-+      .long sys_sched_getparam /* 155 */
-+      .long sys_sched_setscheduler
-+      .long sys_sched_getscheduler
-+      .long sys_sched_yield
-+      .long sys_sched_get_priority_max
-+      .long sys_sched_get_priority_min  /* 160 */
-+      .long sys_sched_rr_get_interval
-+      .long sys_nanosleep
-+      .long sys_ni_syscall    /* sys_mremap */
-+      .long sys_setresuid16
-+      .long sys_getresuid16   /* 165 */
-+      .long sys_getpagesize   /* sys_getpagesize */
-+      .long sys_ni_syscall    /* old "query_module" */
-+      .long sys_poll
-+      .long sys_ni_syscall    /* sys_nfsservctl */
-+      .long sys_setresgid16   /* 170 */
-+      .long sys_getresgid16
-+      .long sys_prctl
-+      .long sys_rt_sigreturn
-+      .long sys_rt_sigaction
-+      .long sys_rt_sigprocmask /* 175 */
-+      .long sys_rt_sigpending
-+      .long sys_rt_sigtimedwait
-+      .long sys_rt_sigqueueinfo
-+      .long sys_rt_sigsuspend
-+      .long sys_pread64       /* 180 */
-+      .long sys_pwrite64
-+      .long sys_lchown16
-+      .long sys_getcwd
-+      .long sys_capget
-+      .long sys_capset        /* 185 */
-+      .long sys_sigaltstack
-+      .long sys_sendfile
-+      .long sys_ni_syscall    /* streams1 */
-+      .long sys_ni_syscall    /* streams2 */
-+      .long sys_vfork         /* 190 */
-+      .long sys_getrlimit
-+      .long sys_mmap2
-+      .long sys_truncate64
-+      .long sys_ftruncate64
-+      .long sys_stat64        /* 195 */
-+      .long sys_lstat64
-+      .long sys_fstat64
-+      .long sys_chown
-+      .long sys_getuid
-+      .long sys_getgid        /* 200 */
-+      .long sys_geteuid
-+      .long sys_getegid
-+      .long sys_setreuid
-+      .long sys_setregid
-+      .long sys_getgroups     /* 205 */
-+      .long sys_setgroups
-+      .long sys_fchown
-+      .long sys_setresuid
-+      .long sys_getresuid
-+      .long sys_setresgid     /* 210 */
-+      .long sys_getresgid
-+      .long sys_lchown
-+      .long sys_setuid
-+      .long sys_setgid
-+      .long sys_setfsuid      /* 215 */
-+      .long sys_setfsgid
-+      .long sys_pivot_root
-+      .long sys_ni_syscall
-+      .long sys_ni_syscall
-+      .long sys_getdents64    /* 220 */
-+      .long sys_gettid
-+      .long sys_tkill
-+      .long sys_setxattr
-+      .long sys_lsetxattr
-+      .long sys_fsetxattr     /* 225 */
-+      .long sys_getxattr
-+      .long sys_lgetxattr
-+      .long sys_fgetxattr
-+      .long sys_listxattr
-+      .long sys_llistxattr    /* 230 */
-+      .long sys_flistxattr
-+      .long sys_removexattr
-+      .long sys_lremovexattr
-+      .long sys_fremovexattr
-+      .long sys_futex         /* 235 */
-+      .long sys_sendfile64
-+      .long sys_ni_syscall    /* sys_mincore */
-+      .long sys_ni_syscall    /* sys_madvise */
-+      .long sys_fcntl64
-+      .long sys_readahead     /* 240 */
-+      .long sys_io_setup
-+      .long sys_io_destroy
-+      .long sys_io_getevents
-+      .long sys_io_submit
-+      .long sys_io_cancel     /* 245 */
-+      .long sys_fadvise64
-+      .long sys_exit_group
-+      .long sys_lookup_dcookie
-+      .long sys_epoll_create
-+      .long sys_epoll_ctl     /* 250 */
-+      .long sys_epoll_wait
-+      .long sys_ni_syscall    /* sys_remap_file_pages */
-+      .long sys_set_tid_address
-+      .long sys_timer_create
-+      .long sys_timer_settime /* 255 */
-+      .long sys_timer_gettime
-+      .long sys_timer_getoverrun
-+      .long sys_timer_delete
-+      .long sys_clock_settime
-+      .long sys_clock_gettime /* 260 */
-+      .long sys_clock_getres
-+      .long sys_clock_nanosleep
-+      .long sys_statfs64
-+      .long sys_fstatfs64
-+      .long sys_tgkill        /* 265 */
-+      .long sys_utimes
-+      .long sys_fadvise64_64
-+      .long sys_mbind 
-+      .long sys_get_mempolicy
-+      .long sys_set_mempolicy /* 270 */
-+      .long sys_mq_open
-+      .long sys_mq_unlink
-+      .long sys_mq_timedsend
-+      .long sys_mq_timedreceive
-+      .long sys_mq_notify     /* 275 */
-+      .long sys_mq_getsetattr
-+      .long sys_waitid
-+      .long sys_ni_syscall    /* sys_setaltroot */
-+      .long sys_ni_syscall    /* sys_add_key */
-+      .long sys_ni_syscall    /* 280 */ /* sys_request_key */
-+      .long sys_ni_syscall    /* sys_keyctl */
-+      .long sys_ioprio_set
-+      .long sys_ioprio_get
-+      .long sys_inotify_init
-+      .long sys_inotify_add_watch     /* 285 */
-+      .long sys_inotify_rm_watch
-+      .long sys_migrate_pages
-+      .long sys_openat
-+      .long sys_mkdirat
-+      .long sys_mknodat               /* 290 */
-+      .long sys_fchownat
-+      .long sys_futimesat
-+      .long sys_fstatat64
-+      .long sys_unlinkat
-+      .long sys_renameat              /* 295 */
-+      .long sys_linkat
-+      .long sys_symlinkat
-+      .long sys_readlinkat
-+      .long sys_fchmodat
-+      .long sys_faccessat             /* 300 */
-+      .long sys_ni_syscall            /* Reserved for pselect6 */
-+      .long sys_ni_syscall            /* Reserved for ppoll */
-+      .long sys_unshare
-+      .long sys_set_robust_list
-+      .long sys_get_robust_list       /* 305 */
-+      .long sys_splice
-+      .long sys_sync_file_range
-+      .long sys_tee
-+      .long sys_vmsplice
-+      .long sys_move_pages            /* 310 */
-+      .long sys_sched_setaffinity
-+      .long sys_sched_getaffinity
-+      .long sys_kexec_load
-+      .long sys_getcpu
-+      .long sys_epoll_pwait           /* 315 */
-+      .long sys_utimensat
-+      .long sys_signalfd
-+      .long sys_timerfd
-+      .long sys_eventfd
-+      .long sys_pread64
-+      .long sys_pwrite64              /* 321 */
-+
-+      .rept NR_syscalls - 322
-+              .long sys_ni_syscall
-+      .endr
-+
-diff --git a/arch/nios2nommu/kernel/time.c b/arch/nios2nommu/kernel/time.c
-new file mode 100644
-index 0000000..3b536fe
---- /dev/null
-+++ b/arch/nios2nommu/kernel/time.c
-@@ -0,0 +1,219 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/kernel/time.c
-+ *
-+ * Architecture specific time handling details.
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Most of the stuff is located in the machine specific files.
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *  Copyright (C) 1998-2000  D. Jeff Dionne <jeff@lineo.ca>,
-+ *                           Kenneth Albanowski <kjahds@kjahds.com>,
-+ *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/param.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/interrupt.h>
-+#include <linux/time.h>
-+#include <linux/timex.h>
-+#include <linux/profile.h>
-+#include <linux/module.h>
-+#include <linux/irq.h>
-+
-+#include <asm/segment.h>
-+#include <asm/io.h>
-+#include <asm/nios.h>
-+
-+#define       TICK_SIZE (tick_nsec / 1000)
-+
-+unsigned long cpu_khz;
-+static inline int set_rtc_mmss(unsigned long nowtime)
-+{
-+  return 0;
-+}
-+
-+/* Timer timeout status */
-+#define nios2_timer_TO        (inw(&na_timer0->np_timerstatus) & np_timerstatus_to_mask)
-+
-+/* Timer snapshot */
-+static inline unsigned long nios2_read_timercount(void)
-+{
-+      unsigned long count;
-+
-+      outw(0, &na_timer0->np_timersnapl);
-+      count = inw(&na_timer0->np_timersnaph) << 16 | inw(&na_timer0->np_timersnapl);
-+
-+      return count;
-+}
-+
-+/*
-+ * Should return useconds since last timer tick
-+ */
-+static unsigned long gettimeoffset(void)
-+{
-+      unsigned long offset;
-+      unsigned long count;
-+
-+      count = nios2_read_timercount();
-+      offset = ((nasys_clock_freq/HZ)-1 - nios2_read_timercount()) \
-+               / (nasys_clock_freq / USEC_PER_SEC);
-+
-+      /* Check if we just wrapped the counters and maybe missed a tick */
-+      if (nios2_timer_TO  && (offset < (100000 / HZ / 2)))
-+              offset += (USEC_PER_SEC / HZ);
-+
-+      return offset;
-+}
-+
-+/*
-+ * timer_interrupt() needs to keep up the real-time clock,
-+ * as well as call the "do_timer()" routine every clocktick
-+ */
-+irqreturn_t timer_interrupt(int irq, void *dummy)
-+{
-+      /* last time the cmos clock got updated */
-+      static long last_rtc_update=0;
-+      
-+      write_seqlock(&xtime_lock);
-+      na_timer0->np_timerstatus = 0; /* Clear the interrupt condition */
-+
-+      do_timer(1);
-+#ifndef CONFIG_SMP
-+      update_process_times(user_mode(get_irq_regs()));
-+#endif
-+      profile_tick(CPU_PROFILING);
-+      /*
-+       * If we have an externally synchronized Linux clock, then update
-+       * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-+       * called as close as possible to 500 ms before the new second starts.
-+       */
-+      if (ntp_synced() &&
-+          xtime.tv_sec > last_rtc_update + 660 &&
-+          (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
-+          (xtime.tv_nsec  / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) {
-+        if (set_rtc_mmss(xtime.tv_sec) == 0)
-+          last_rtc_update = xtime.tv_sec;
-+        else
-+          last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
-+      }
-+
-+      write_sequnlock(&xtime_lock);
-+      return(IRQ_HANDLED);
-+}
-+
-+void __init time_init(void)
-+{
-+      unsigned int year, mon, day, hour, min, sec;
-+      int err;
-+
-+      extern void arch_gettod(int *year, int *mon, int *day, int *hour,
-+                              int *min, int *sec);
-+      
-+      cpu_khz=nasys_clock_freq_1000;
-+      arch_gettod(&year, &mon, &day, &hour, &min, &sec);
-+
-+      if ((year += 1900) < 1970)
-+              year += 100;
-+      xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-+      xtime.tv_nsec = 0;
-+      wall_to_monotonic.tv_sec = -xtime.tv_sec;
-+
-+      err = request_irq(na_timer0_irq, timer_interrupt, IRQ_FLG_LOCK, "timer", NULL);
-+      if(err)
-+              printk(KERN_ERR "%s() failed - errno = %d\n", __FUNCTION__, -err);
-+      na_timer0->np_timerperiodl = (nasys_clock_freq/HZ)-1;
-+      na_timer0->np_timerperiodh = ((nasys_clock_freq/HZ)-1) >> 16;
-+
-+      /* interrupt enable + continuous + start */
-+      na_timer0->np_timercontrol = np_timercontrol_start_mask
-+                                 + np_timercontrol_cont_mask
-+                                 + np_timercontrol_ito_mask;
-+}
-+
-+/*
-+ * This version of gettimeofday has near microsecond resolution.
-+ */
-+void do_gettimeofday(struct timeval *tv)
-+{
-+      unsigned long flags;
-+      unsigned long seq;
-+      unsigned long usec, sec;
-+
-+      do {
-+              seq = read_seqbegin_irqsave(&xtime_lock, flags);
-+              usec = gettimeoffset();
-+              sec = xtime.tv_sec;
-+              usec += (xtime.tv_nsec / 1000);
-+      } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
-+
-+      while (usec >= 1000000) {
-+              usec -= 1000000;
-+              sec++;
-+      }
-+
-+      tv->tv_sec = sec;
-+      tv->tv_usec = usec;
-+}
-+EXPORT_SYMBOL(do_gettimeofday);
-+
-+int do_settimeofday(struct timespec *tv)
-+{
-+      time_t wtm_sec, sec = tv->tv_sec;
-+      long wtm_nsec, nsec = tv->tv_nsec;
-+
-+      if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-+              return -EINVAL;
-+
-+      write_seqlock_irq(&xtime_lock);
-+      /*
-+       * This is revolting. We need to set "xtime" correctly. However, the
-+       * value in this location is the value at the last tick.
-+       * Discover what correction gettimeofday() would have
-+       * made, and then undo it!
-+       */
-+      nsec -= gettimeoffset() * NSEC_PER_USEC;
-+
-+      wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
-+      wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
-+
-+      set_normalized_timespec(&xtime, sec, nsec);
-+      set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-+
-+      ntp_clear();
-+
-+      write_sequnlock_irq(&xtime_lock);
-+      clock_was_set();
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL(do_settimeofday);
-+
-+/*
-+ * Scheduler clock - returns current time in nanosec units.
-+ */
-+unsigned long long sched_clock(void)
-+{
-+      return (unsigned long long)jiffies * (1000000000 / HZ);
-+}
-diff --git a/arch/nios2nommu/kernel/traps.c b/arch/nios2nommu/kernel/traps.c
-new file mode 100644
-index 0000000..14b7e4c
---- /dev/null
-+++ b/arch/nios2nommu/kernel/traps.c
-@@ -0,0 +1,178 @@
-+/*
-+ * arch/niosnommu/kernel/traps.c
-+ *
-+ * Copyright 2004 Microtronix Datacom Ltd.
-+ * Copyright 2001 Vic Phillips
-+ * Copyright 1995 David S. Miller (davem@caip.rutgers.edu)
-+ *
-+ * hacked from:
-+ *
-+ * arch/sparcnommu/kernel/traps.c
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/sched.h>  /* for jiffies */
-+#include <linux/kernel.h>
-+#include <linux/signal.h>
-+#include <linux/module.h>
-+
-+#include <asm/delay.h>
-+#include <asm/system.h>
-+#include <asm/ptrace.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/unistd.h>
-+
-+#include <asm/nios.h>
-+
-+/* #define TRAP_DEBUG */
-+
-+#if 0
-+void dumpit(unsigned long l1, unsigned long l2)
-+{
-+      printk("0x%08x l1 0x%08x l2\n");
-+      while(1);
-+}
-+
-+struct trap_trace_entry {
-+      unsigned long pc;
-+      unsigned long type;
-+};
-+
-+int trap_curbuf = 0;
-+struct trap_trace_entry trapbuf[1024];
-+
-+void syscall_trace_entry(struct pt_regs *regs)
-+{
-+      printk("%s[%d]: ", current->comm, current->pid);
-+      printk("scall<%d> (could be %d)\n", (int) regs->r3,
-+             (int) regs->r4);
-+}
-+
-+void syscall_trace_exit(struct pt_regs *regs)
-+{
-+}
-+#endif
-+
-+/*
-+ * The architecture-independent backtrace generator
-+ */
-+void dump_stack(void)
-+{
-+      unsigned long stack;
-+
-+      show_stack(current, &stack);
-+}
-+
-+EXPORT_SYMBOL(dump_stack);
-+
-+/*
-+ * The show_stack is an external API which we do not use ourselves.
-+ * The oops is printed in die_if_kernel.
-+ */
-+
-+int kstack_depth_to_print = 48;
-+
-+void show_stack(struct task_struct *task, unsigned long *stack)
-+{
-+      unsigned long *endstack, addr;
-+      extern char _start, _etext;
-+      int i;
-+
-+      if (!stack) {
-+              if (task)
-+                      stack = (unsigned long *)task->thread.ksp;
-+              else
-+                      stack = (unsigned long *)&stack;
-+      }
-+
-+      addr = (unsigned long) stack;
-+      endstack = (unsigned long *) PAGE_ALIGN(addr);
-+
-+      printk(KERN_EMERG "Stack from %08lx:", (unsigned long)stack);
-+      for (i = 0; i < kstack_depth_to_print; i++) {
-+              if (stack + 1 > endstack)
-+                      break;
-+              if (i % 8 == 0)
-+                      printk(KERN_EMERG "\n       ");
-+              printk(KERN_EMERG " %08lx", *stack++);
-+      }
-+
-+      printk(KERN_EMERG "\nCall Trace:");
-+      i = 0;
-+      while (stack + 1 <= endstack) {
-+              addr = *stack++;
-+              /*
-+               * If the address is either in the text segment of the
-+               * kernel, or in the region which contains vmalloc'ed
-+               * memory, it *may* be the address of a calling
-+               * routine; if so, print it so that someone tracing
-+               * down the cause of the crash will be able to figure
-+               * out the call path that was taken.
-+               */
-+              if (((addr >= (unsigned long) &_start) &&
-+                   (addr <= (unsigned long) &_etext))) {
-+                      if (i % 4 == 0)
-+                              printk(KERN_EMERG "\n       ");
-+                      printk(KERN_EMERG " [<%08lx>]", addr);
-+                      i++;
-+              }
-+      }
-+      printk(KERN_EMERG "\n");
-+}
-+
-+void die_if_kernel(char *str, struct pt_regs *pregs)
-+{
-+      unsigned long pc;
-+
-+      pc = pregs->ra;
-+      printk("0x%08lx\n trapped to die_if_kernel\n",pregs->ra);
-+      show_regs(pregs);
-+      if(pregs->status_extension & PS_S)
-+              do_exit(SIGKILL);
-+      do_exit(SIGSEGV);
-+}
-+
-+void do_hw_interrupt(unsigned long type, unsigned long psr, unsigned long pc)
-+{
-+      if(type < 0x10) {
-+              printk("Unimplemented Nios2 TRAP, type = %02lx\n", type);
-+              die_if_kernel("Whee... Hello Mr. Penguin", current->thread.kregs);
-+      }       
-+}
-+
-+#if 0
-+void handle_watchpoint(struct pt_regs *regs, unsigned long pc, unsigned long psr)
-+{
-+#ifdef TRAP_DEBUG
-+      printk("Watchpoint detected at PC %08lx PSR %08lx\n", pc, psr);
-+#endif
-+      if(psr & PSR_SUPERVISOR)
-+              panic("Tell me what a watchpoint trap is, and I'll then deal "
-+                    "with such a beast...");
-+}
-+#endif
-+
-+void trap_init(void)
-+{
-+#ifdef DEBUG
-+      printk("trap_init reached\n");
-+#endif
-+}
-diff --git a/arch/nios2nommu/kernel/usb.c b/arch/nios2nommu/kernel/usb.c
-new file mode 100644
-index 0000000..65655b6
---- /dev/null
-+++ b/arch/nios2nommu/kernel/usb.c
-@@ -0,0 +1,341 @@
-+/*
-+ * arch/nios2nommu/kernel/usb.c -- platform level USB initialization
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ */
-+
-+#undef        DEBUG
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/system.h>
-+#include <asm/nios.h>
-+
-+#if defined(CONFIG_USB_SL811_HCD) || defined (CONFIG_USB_SL811_HCD_MODULE)
-+#if defined(CONFIG_MICROTRONIX_STRATIX) || defined (CONFIG_MICROTRONIX_CYCLONE)
-+
-+#include <linux/usb/sl811.h>
-+#define SL811_ADDR ((unsigned int)na_usb)
-+#define SL811_IRQ na_usb_irq
-+
-+static void sl811_port_power(struct device *dev, int is_on)
-+{
-+}
-+
-+static        void sl811_port_reset(struct device *dev)
-+{
-+      writeb(0xA, (SL811_ADDR+8));
-+      mdelay(10);
-+      writeb(4, (SL811_ADDR+8));
-+}
-+
-+static struct resource sl811hs_resources[] = {
-+      {
-+              .start  = (SL811_ADDR),
-+              .end    = (SL811_ADDR + 3),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = (SL811_ADDR + 4),
-+              .end    = (SL811_ADDR + 7),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = SL811_IRQ,
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct sl811_platform_data sl811_data = {
-+      .can_wakeup =   0,
-+      .potpg          =       0,
-+      .power          =       250,
-+      .port_power     =       sl811_port_power,
-+      .reset          =       sl811_port_reset,
-+};
-+
-+static struct platform_device sl811hs_device = {
-+      .name                   = "sl811-hcd",
-+      .id                     = -1,
-+      .dev = {
-+              //.release              = usb_release,
-+              //.dma_mask             = &ohci_dmamask,
-+              .coherent_dma_mask      = 0x0fffffff,
-+              .platform_data = &sl811_data,
-+      },
-+      .num_resources  = ARRAY_SIZE(sl811hs_resources),
-+      .resource               = sl811hs_resources,
-+};
-+
-+
-+static int __init mtx_kit_usb_init(void)
-+{
-+      int status;
-+
-+      status = platform_device_register(&sl811hs_device);
-+      if (status) {
-+              pr_debug("can't register sl811hs device, %d\n", status);
-+              return -1;
-+      }
-+      
-+      writeb(4, (SL811_ADDR+8));
-+      return 0;
-+}
-+
-+subsys_initcall(mtx_kit_usb_init);
-+#endif /* (CONFIG_MICROTRONIX_STRATIX) || (CONFIG_MICROTRONIX_CYCLONE)*/
-+#endif  /*(CONFIG_USB_SL811_HCD) ||(CONFIG_USB_SL811_HCD_MODULE) */
-+
-+#if defined(CONFIG_USB_ISP116X_HCD) || defined (CONFIG_USB_ISP116X_HCD_MODULE)
-+
-+#include <linux/usb/isp116x.h>
-+
-+#define ISP116X_HCD_ADDR ((unsigned int)na_usb)
-+#define ISP116X_HCD_IRQ na_usb_irq
-+
-+static void isp116x_delay(struct device *dev, int delay)
-+{
-+      ndelay(delay);
-+}
-+
-+static struct resource isp116x_hcd_resources[] = {
-+      {
-+              .start  = (ISP116X_HCD_ADDR),
-+              .end    = (ISP116X_HCD_ADDR + 3),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = (ISP116X_HCD_ADDR + 4),
-+              .end    = (ISP116X_HCD_ADDR + 7),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = ISP116X_HCD_IRQ,
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct isp116x_platform_data isp116x_data = {
-+              // Enable internal resistors on downstream ports
-+        .sel15Kres              = 1,
-+        // On-chip overcurrent protection
-+        .oc_enable              = 1,
-+        // INT output polarity
-+        .int_act_high           = 0,
-+        // INT edge or level triggered
-+        .int_edge_triggered     = 0,
-+        // Wakeup by devices on usb bus enabled
-+        .remote_wakeup_enable   = 0,
-+        .delay                  = isp116x_delay,
-+};
-+
-+static struct platform_device isp116x_hcd = {
-+      .name                   = "isp116x-hcd",
-+      .id                     = -1,
-+      .dev = {
-+              //.release              = usb_release,
-+              //.dma_mask             = &ohci_dmamask,
-+              .coherent_dma_mask      = 0x0fffffff,
-+              .platform_data = &isp116x_data,
-+      },
-+      .num_resources  = ARRAY_SIZE(isp116x_hcd_resources),
-+      .resource               = isp116x_hcd_resources,
-+};
-+
-+static int __init usb_hcd_init(void)
-+{
-+      int status;
-+
-+      status = platform_device_register(&isp116x_hcd);
-+      if (status) {
-+              pr_debug("can't register isp116x host controller, %d\n", status);
-+              return -1;
-+      }
-+      
-+      return 0;
-+}
-+subsys_initcall(usb_hcd_init);
-+#endif  /*(CONFIG_USB_ISP116X_HCD) ||(CONFIG_USB_ISP116X_HCD_MODULE) */
-+
-+#if defined(CONFIG_USB_ISP1161X) || defined(CONFIG_USB_ISP1161X_MODULE)
-+#include <linux/usb_isp116x_dc.h>
-+
-+#define ISP116X_UDC_ADDR ((unsigned int)na_usb+8)
-+#define ISP116X_UDC_IRQ        na_int2_usb_irq
-+
-+static struct resource isp116x_udc_resources[] = {
-+      {
-+              .start  = (ISP116X_UDC_ADDR),
-+              .end    = (ISP116X_UDC_ADDR + 3),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = (ISP116X_UDC_ADDR + 4),
-+              .end    = (ISP116X_UDC_ADDR + 7),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = ISP116X_UDC_IRQ,
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+static void isp116x_udc_delay()
-+{
-+      __asm__ __volatile__(
-+        "1:  \n\t"
-+        "    beq    %0,zero,2f\n\t"
-+        "    addi   %0, %0, -1\n\t" 
-+        "    br     1b\n\t" 
-+        "2:  \n\t" 
-+        :
-+        :  "r" (nasys_clock_freq_1000 * 180 / 2000000)
-+        );
-+      
-+}
-+struct isp116x_dc_platform_data isp116x_udc_data = {
-+      .ext_pullup_enable      =0,
-+      .no_lazy                        =1,
-+      .eot_act_high           =0,
-+      .remote_wakeup_enable=1,
-+      .power_off_enable       =1,
-+      .int_edge_triggered     =0,
-+      .int_act_high           =0,
-+      .clkout_freq            =12,
-+      .delay                          = isp116x_udc_delay
-+};
-+
-+static struct platform_device isp116x_udc = {
-+      .name                   = "isp1161a_udc",
-+      .id                     = -1,
-+      .dev = {
-+              //.release              = usb_release,
-+              //.dma_mask             = &ohci_dmamask,
-+              .coherent_dma_mask      = 0x0fffffff,
-+              .platform_data = &isp116x_udc_data,
-+      },
-+      .num_resources  = ARRAY_SIZE(isp116x_udc_resources),
-+      .resource               = isp116x_udc_resources,
-+};
-+
-+static int __init usb_udc_init(void)
-+{
-+      int status;
-+      np_pio* pio;
-+
-+      status = platform_device_register(&isp116x_udc);
-+      if (status) {
-+              pr_debug("can't register isp116x device controller, %d\n", status);
-+              return -1;
-+      }
-+      
-+      /* enable interrupts */
-+      pio = (np_pio*)na_int2_usb;
-+      //outw(0, &pio->np_piodata);
-+      //outw(0, &pio->np_pioedgecapture);
-+      outw(1, &pio->np_piointerruptmask);
-+      
-+      return 0;
-+}
-+subsys_initcall(usb_udc_init);
-+#endif
-+
-+#if defined(na_ISP1362_avalonS)  // for DE2 dev board, FIX ME otehrwise
-+#define na_usb na_ISP1362_avalonS
-+#define na_usb_irq na_ISP1362_avalonS_irq
-+#endif
-+
-+#if defined(na_ISP1362_avalon_slave_0)  // for DE2 dev board, FIX ME otehrwise
-+#define na_usb na_ISP1362_avalon_slave_0
-+#define na_usb_irq na_ISP1362_avalon_slave_0_irq
-+#endif
-+
-+#if defined(CONFIG_USB_ISP1362_HCD) && defined(na_usb)
-+
-+#include <linux/usb_isp1362.h>
-+#define ISP1362_HCD_ADDR ((unsigned int)na_usb)
-+#define ISP1362_HCD_IRQ na_usb_irq
-+
-+static struct resource isp1362_hcd_resources[] = {
-+      {
-+              .start  = (ISP1362_HCD_ADDR),
-+              .end    = (ISP1362_HCD_ADDR + 3),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = (ISP1362_HCD_ADDR + 4),
-+              .end    = (ISP1362_HCD_ADDR + 7),
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      {
-+              .start  = ISP1362_HCD_IRQ,
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct isp1362_platform_data isp1362_data = {
-+              // Enable internal resistors on downstream ports
-+      .sel15Kres      = 1,
-+        // Clock cannot be stopped
-+      .clknotstop     = 0,
-+        // On-chip overcurrent protection
-+      .oc_enable      = 0,
-+        // INT output polarity
-+      .int_act_high   = 0,
-+        // INT edge or level triggered
-+      .int_edge_triggered     = 0,
-+        // WAKEUP pin connected
-+      .remote_wakeup_connected        = 0,
-+        // Switch or not to switch (keep always powered)
-+      .no_power_switching     = 1,
-+        // Ganged port power switching (0) or individual port power switching (1)
-+      .power_switching_mode   = 0,
-+};
-+
-+static struct platform_device isp1362_hcd = {
-+      .name                   = "isp1362-hcd",
-+      .id                     = -1,
-+      .dev = {
-+              //.release              = usb_release,
-+              //.dma_mask             = &ohci_dmamask,
-+              .coherent_dma_mask      = 0x0fffffff,
-+              .platform_data = &isp1362_data,
-+      },
-+      .num_resources  = ARRAY_SIZE(isp1362_hcd_resources),
-+      .resource               = isp1362_hcd_resources,
-+};
-+
-+static int __init usb_hcd_init(void)
-+{
-+      int status;
-+
-+      status = platform_device_register(&isp1362_hcd);
-+      if (status) {
-+              pr_debug("can't register isp1362 host controller, %d\n", status);
-+              return -1;
-+      }
-+      
-+      return 0;
-+}
-+subsys_initcall(usb_hcd_init);
-+#endif
-+
-diff --git a/arch/nios2nommu/kernel/vmlinux.lds.S b/arch/nios2nommu/kernel/vmlinux.lds.S
-new file mode 100644
-index 0000000..491901c
---- /dev/null
-+++ b/arch/nios2nommu/kernel/vmlinux.lds.S
-@@ -0,0 +1,141 @@
-+#include <asm-generic/vmlinux.lds.h>
-+#include <asm/nios.h>
-+              
-+OUTPUT_FORMAT("elf32-littlenios2", "elf32-littlenios2", "elf32-littlenios2")
-+
-+OUTPUT_ARCH(nios)
-+ENTRY(_start) /* Defined in head.S */
-+
-+jiffies = jiffies_64;
-+
-+SECTIONS
-+{
-+  . = nasys_program_mem;
-+  /* read-only */
-+  _stext = . ;
-+  _text = .;                  /* Text and read-only data */
-+  .text : {
-+    TEXT_TEXT
-+    SCHED_TEXT
-+    LOCK_TEXT
-+    *(.fixup)
-+    *(.gnu.warning)
-+  } =0
-+
-+  . = ALIGN(4) ;
-+  _etext = .;                 /* End of text section */
-+
-+  . = ALIGN(32);              /* Exception table */
-+  __start___ex_table = .;
-+  __ex_table : { *(__ex_table) }
-+  __stop___ex_table = .;
-+
-+  RODATA
-+
-+  /* writeable */
-+  .data : {                   /* Data */
-+    /*
-+     * This ALIGN is needed as a workaround for a bug a gcc bug upto 4.1 which
-+     * limits the maximum alignment to at most 32kB and results in the following
-+     * warning:
-+     *
-+     *  CC      arch/mips/kernel/init_task.o
-+     * arch/mips/kernel/init_task.c:30: warning: alignment of â€˜init_thread_union’
-+     * is greater than maximum object file alignment.  Using 32768
-+     */
-+    . = ALIGN(4096);
-+    *(.data.init_task)
-+
-+    *(.data)
-+
-+    CONSTRUCTORS
-+  }
-+
-+  .lit8 : { *(.lit8) }
-+  .lit4 : { *(.lit4) }
-+  /* We want the small data sections together, so single-instruction offsets
-+     can access them all, and initialized data all before uninitialized, so
-+     we can shorten the on-disk segment size.  */
-+  .sdata     : { *(.sdata) }
-+
-+  . = ALIGN(4096);
-+  __nosave_begin = .;
-+  .data_nosave : { *(.data.nosave) }
-+  . = ALIGN(4096);
-+  __nosave_end = .;
-+
-+  . = ALIGN(32);
-+  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-+
-+  _edata =  .;                        /* End of data section */
-+
-+  /* will be freed after init */
-+  . = ALIGN(4096);            /* Init code and data */
-+  __init_begin = .;
-+  .init.text : {
-+      _sinittext = .;
-+      *(.init.text)
-+      _einittext = .;
-+  }
-+  .init.data : { *(.init.data) }
-+  . = ALIGN(16);
-+  __setup_start = .;
-+  .init.setup : { *(.init.setup) }
-+  __setup_end = .;
-+
-+  __initcall_start = .;
-+  .initcall.init : {
-+      INITCALLS
-+  }
-+  __initcall_end = .;
-+
-+  __con_initcall_start = .;
-+  .con_initcall.init : { *(.con_initcall.init) }
-+  __con_initcall_end = .;
-+  SECURITY_INIT
-+    /* .exit.text is discarded at runtime, not link time, to deal with
-+     references from .rodata */
-+  .exit.text : { *(.exit.text) }
-+  .exit.data : { *(.exit.data) }
-+  . = ALIGN(4096);
-+  __initramfs_start = .;
-+  .init.ramfs : { *(.init.ramfs) }
-+  __initramfs_end = .;
-+  . = ALIGN(32);
-+  __per_cpu_start = .;
-+  .data.percpu  : { *(.data.percpu) }
-+  __per_cpu_end = .;
-+  . = ALIGN(4096);
-+  __init_end = .;
-+  /* freed after init ends here */
-+
-+  __bss_start = .;            /* BSS */
-+  .sbss      : {
-+    *(.sbss)
-+    *(.scommon)
-+  }
-+  .bss : {
-+    *(.bss)
-+    *(COMMON)
-+  }
-+  __bss_stop = .;
-+
-+  _end = . ;
-+
-+  /* Sections to be discarded */
-+  /DISCARD/ : {
-+      *(.exit.text)
-+      *(.exit.data)
-+        *(.exitcall.exit)
-+  }
-+
-+
-+  STABS_DEBUG
-+
-+  DWARF_DEBUG
-+
-+  /* These must appear regardless of  .  */
-+  .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
-+  .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
-+  .note : { *(.note) }
-+}
-diff --git a/arch/nios2nommu/lib/Makefile b/arch/nios2nommu/lib/Makefile
-new file mode 100644
-index 0000000..1315c57
---- /dev/null
-+++ b/arch/nios2nommu/lib/Makefile
-@@ -0,0 +1,17 @@
-+#
-+# Copyright (C) 2005 Microtronix Datacom Ltd
-+#
-+# This program is free software; you can redistribute it and/or modify it under
-+# the terms of the GNU Library General Public License as published by the Free
-+# Software Foundation; either version 2 of the License, or (at your option) any
-+# later version.
-+#
-+# This program is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-+# FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
-+# details.
-+
-+####CSRC := $(wildcard *.c)
-+####lib-y  =$(patsubst %.c,%.o, $(CSRC))
-+####wapos!
-+lib-y  =checksum.o string.o memcpy.o
-diff --git a/arch/nios2nommu/lib/checksum.c b/arch/nios2nommu/lib/checksum.c
-new file mode 100644
-index 0000000..475f1a3
---- /dev/null
-+++ b/arch/nios2nommu/lib/checksum.c
-@@ -0,0 +1,73 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <net/checksum.h>
-+#include <asm/checksum.h>
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+/*
-+ * computes the checksum of a memory block at buff, length len,
-+ * and adds in "sum" (32-bit)
-+ *
-+ * returns a 32-bit number suitable for feeding into itself
-+ * or csum_tcpudp_magic
-+ *
-+ * this function must be called with even lengths, except
-+ * for the last fragment, which may be odd
-+ *
-+ * it's best to have buff aligned on a 32-bit boundary
-+ */
-+
-+unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum)
-+{
-+#if 0
-+      __asm__ __volatile__ ...//;dgt2;tmp;not (yet) available...
-+                         ...//;dgt2;tmp;NiosI didn't offer either...
-+#else
-+      unsigned int result = do_csum(buff, len);
-+
-+      /* add in old sum, and carry.. */
-+      result += sum;
-+      if (sum > result)
-+              result += 1;
-+      return result;
-+#endif
-+}
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+
-+/*
-+ * the same as csum_partial, but copies from fs:src while it
-+ * checksums
-+ *
-+ * here even more important to align src and dst on a 32-bit (or even
-+ * better 64-bit) boundary
-+ */
-+
-+unsigned int csum_partial_copy(const char *src, char *dst, int len, int sum)
-+{
-+      memcpy(dst, src, len);
-+      return csum_partial(dst, len, sum);
-+
-+}
-diff --git a/arch/nios2nommu/lib/memcpy.c b/arch/nios2nommu/lib/memcpy.c
-new file mode 100644
-index 0000000..6586b99
---- /dev/null
-+++ b/arch/nios2nommu/lib/memcpy.c
-@@ -0,0 +1,62 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/lib/memcpy.c
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jun/09/2004                dgt         Split out separate source file from string.c
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <linux/types.h>
-+#include <linux/autoconf.h>
-+#include <asm/nios.h>
-+#include <asm/string.h>
-+
-+#ifdef __HAVE_ARCH_MEMCPY
-+  void * memcpy(void * d, const void * s, size_t count)
-+   {
-+    unsigned long dst, src;
-+      dst = (unsigned long) d;
-+      src = (unsigned long) s;
-+
-+      if ((count < 8) || ((dst ^ src) & 3))
-+          goto restup;
-+
-+      if (dst & 1) {
-+              *(char*)dst++=*(char*)src++;
-+          count--;
-+      }
-+      if (dst & 2) {
-+              *(short*)dst=*(short*)src;
-+          src += 2;
-+          dst += 2;
-+          count -= 2;
-+      }
-+      while (count > 3) {
-+              *(long*)dst=*(long*)src;
-+          src += 4;
-+          dst += 4;
-+          count -= 4;
-+      }
-+
-+    restup:
-+      while (count--)
-+              *(char*)dst++=*(char*)src++;
-+
-+      return d;
-+   }
-+#endif
-diff --git a/arch/nios2nommu/lib/string.c b/arch/nios2nommu/lib/string.c
-new file mode 100644
-index 0000000..b87c195
---- /dev/null
-+++ b/arch/nios2nommu/lib/string.c
-@@ -0,0 +1,180 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * arch/nios2nommu/lib/string.c
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ * Jun/09/2004                dgt         Split out memcpy into separate source file
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <linux/types.h>
-+#include <linux/autoconf.h>
-+#include <asm/nios.h>
-+#include <asm/string.h>
-+
-+#ifdef __HAVE_ARCH_MEMSET
-+void * memset(void * s,int c,size_t count)
-+{
-+
-+    if (count > 8) {
-+        int destptr, charcnt, dwordcnt, fill8reg, wrkrega;
-+        __asm__ __volatile__ (
-+                 // fill8 %3, %5 (c & 0xff)\n\t"
-+               //
-+            "    slli    %4,    %5,   8\n\t"
-+            "    or      %4,    %4,   %5\n\t"
-+            "    slli    %3,    %4,   16\n\t"
-+            "    or      %3,    %3,   %4\n\t"
-+                 //
-+                 // Word-align %0 (s) if necessary
-+                 //
-+            "    andi    %4,    %0,   0x01\n\t"
-+            "    beq     %4,    zero, 1f\n\t"
-+            "    addi    %1,    %1,   -1\n\t"
-+            "    stb     %3,  0(%0)\n\t"
-+            "    addi    %0,    %0,   1\n\t"
-+            "1:  \n\t"
-+            "    mov     %2,    %1\n\t"
-+                 //
-+                 // Dword-align %0 (s) if necessary
-+                 //
-+            "    andi    %4,    %0,   0x02\n\t"
-+            "    beq     %4,    zero, 2f\n\t"
-+            "    addi    %1,    %1,   -2\n\t"
-+            "    sth     %3,  0(%0)\n\t"
-+            "    addi    %0,    %0,   2\n\t"
-+            "    mov     %2,    %1\n\t"
-+            "2:  \n\t"
-+                 // %1 and %2 are how many more bytes to set
-+                 //
-+            "    srli    %2,    %2,   2\n\t"
-+               //
-+                 // %2 is how many dwords to set
-+               //
-+            "3:  ;\n\t"
-+            "    stw     %3,  0(%0)\n\t"
-+            "    addi    %0,    %0,   4\n\t"
-+            "    addi    %2,    %2,   -1\n\t"
-+            "    bne     %2,    zero, 3b\n\t"
-+               //
-+                 // store residual word and/or byte if necessary
-+                 //
-+            "    andi    %4,    %1,   0x02\n\t"
-+            "    beq     %4,    zero, 4f\n\t"
-+            "    sth     %3,  0(%0)\n\t"
-+            "    addi    %0,    %0,   2\n\t"
-+            "4:  \n\t"
-+                 // store residual byte if necessary
-+                 //
-+            "    andi    %4,    %1,   0x01\n\t"
-+            "    beq     %4,    zero, 5f\n\t"
-+            "    stb     %3,  0(%0)\n\t"
-+            "5:  \n\t"
-+
-+            : "=r" (destptr),               /* %0  Output               */
-+              "=r" (charcnt),               /* %1  Output               */
-+              "=r" (dwordcnt),              /* %2  Output               */
-+              "=r" (fill8reg),              /* %3  Output               */
-+              "=r" (wrkrega)                /* %4  Output               */
-+
-+            : "r" (c & 0xff),               /* %5  Input                */
-+              "0" (s),                      /* %0  Input/Output         */
-+              "1" (count)                   /* %1  Input/Output         */
-+
-+            : "memory"                      /* clobbered                */
-+            );
-+      }
-+      else {
-+      char* xs=(char*)s;
-+      while (count--)
-+              *xs++ = c;
-+      }
-+      return s;
-+}
-+#endif
-+
-+#ifdef __HAVE_ARCH_MEMMOVE
-+void * memmove(void * d, const void * s, size_t count)
-+{
-+    unsigned long dst, src;
-+
-+    if (d < s) {
-+      dst = (unsigned long) d;
-+      src = (unsigned long) s;
-+
-+      if ((count < 8) || ((dst ^ src) & 3))
-+          goto restup;
-+
-+      if (dst & 1) {
-+              *(char*)dst++=*(char*)src++;
-+          count--;
-+      }
-+      if (dst & 2) {
-+              *(short*)dst=*(short*)src;
-+          src += 2;
-+          dst += 2;
-+          count -= 2;
-+      }
-+      while (count > 3) {
-+              *(long*)dst=*(long*)src;
-+          src += 4;
-+          dst += 4;
-+          count -= 4;
-+      }
-+
-+    restup:
-+      while (count--)
-+              *(char*)dst++=*(char*)src++;
-+    } else {
-+      dst = (unsigned long) d + count;
-+      src = (unsigned long) s + count;
-+
-+      if ((count < 8) || ((dst ^ src) & 3))
-+          goto restdown;
-+
-+      if (dst & 1) {
-+          src--;
-+          dst--;
-+          count--;
-+              *(char*)dst=*(char*)src;
-+      }
-+      if (dst & 2) {
-+          src -= 2;
-+          dst -= 2;
-+          count -= 2;
-+              *(short*)dst=*(short*)src;
-+      }
-+      while (count > 3) {
-+          src -= 4;
-+          dst -= 4;
-+          count -= 4;
-+              *(long*)dst=*(long*)src;
-+      }
-+
-+    restdown:
-+      while (count--) {
-+          src--;
-+          dst--;
-+              *(char*)dst=*(char*)src;
-+      }
-+    }
-+
-+    return d; 
-+
-+}
-+#endif
-diff --git a/arch/nios2nommu/mm/Makefile b/arch/nios2nommu/mm/Makefile
-new file mode 100644
-index 0000000..b007a11
---- /dev/null
-+++ b/arch/nios2nommu/mm/Makefile
-@@ -0,0 +1,12 @@
-+# $Id: Makefile,v 1.1 2006/07/05 06:23:18 gerg Exp $
-+# Makefile for the linux Sparc-specific parts of the memory manager.
-+#
-+# Note! Dependencies are done automagically by 'make dep', which also
-+# removes any old dependencies. DON'T put your own dependencies here
-+# unless it's something special (ie not a .c file).
-+#
-+# Note 2! The CFLAGS definition is now in the main makefile...
-+
-+obj-y := init.o ioremap.o extable.o memory.o
-+obj-y += dma-noncoherent.o
-+
-diff --git a/arch/nios2nommu/mm/dma-noncoherent.c b/arch/nios2nommu/mm/dma-noncoherent.c
-new file mode 100644
-index 0000000..5649940
---- /dev/null
-+++ b/arch/nios2nommu/mm/dma-noncoherent.c
-@@ -0,0 +1,373 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2000  Ani Joshi <ajoshi@unixbox.com>
-+ * Copyright (C) 2000, 2001  Ralf Baechle <ralf@gnu.org>
-+ * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
-+ */
-+#include <linux/types.h>
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/string.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <asm/cache.h>
-+#include <asm/cacheflush.h>
-+#include <asm/io.h>
-+
-+#define UNCAC_ADDR(addr) ((void *)((unsigned long)(addr) | 0x80000000))
-+#define   CAC_ADDR(addr) ((void *)((unsigned long)(addr) & ~0x80000000))
-+
-+/*
-+ * Warning on the terminology - Linux calls an uncached area coherent;
-+ * MIPS terminology calls memory areas with hardware maintained coherency
-+ * coherent.
-+ */
-+
-+void *dma_alloc_noncoherent(struct device *dev, size_t size,
-+      dma_addr_t * dma_handle, gfp_t gfp)
-+{
-+      void *ret;
-+      /* ignore region specifiers */
-+      gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
-+
-+      if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
-+              gfp |= GFP_DMA;
-+      ret = (void *) __get_free_pages(gfp, get_order(size));
-+
-+      if (ret != NULL) {
-+              memset(ret, 0, size);
-+              *dma_handle = virt_to_phys(ret);
-+      }
-+
-+      return ret;
-+}
-+
-+EXPORT_SYMBOL(dma_alloc_noncoherent);
-+
-+void *dma_alloc_coherent(struct device *dev, size_t size,
-+      dma_addr_t * dma_handle, gfp_t gfp)
-+{
-+      void *ret;
-+
-+      ret = dma_alloc_noncoherent(dev, size, dma_handle, gfp);
-+      if (ret) {
-+              dma_cache_wback_inv((unsigned long) ret, size);
-+              ret = UNCAC_ADDR(ret);
-+      }
-+
-+      return ret;
-+}
-+
-+EXPORT_SYMBOL(dma_alloc_coherent);
-+
-+void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
-+      dma_addr_t dma_handle)
-+{
-+      free_pages((unsigned long) vaddr, get_order(size));
-+}
-+
-+EXPORT_SYMBOL(dma_free_noncoherent);
-+
-+void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
-+      dma_addr_t dma_handle)
-+{
-+      unsigned long addr = (unsigned long) vaddr;
-+
-+      addr = (unsigned long) CAC_ADDR(addr);
-+      free_pages(addr, get_order(size));
-+}
-+
-+EXPORT_SYMBOL(dma_free_coherent);
-+
-+static inline void __dma_sync(unsigned long addr, size_t size,
-+      enum dma_data_direction direction)
-+{
-+      switch (direction) {
-+      case DMA_TO_DEVICE:
-+              dma_cache_wback(addr, size);
-+              break;
-+
-+      case DMA_FROM_DEVICE:
-+              dma_cache_inv(addr, size);
-+              break;
-+
-+      case DMA_BIDIRECTIONAL:
-+              dma_cache_wback_inv(addr, size);
-+              break;
-+
-+      default:
-+              BUG();
-+      }
-+}
-+
-+dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
-+      enum dma_data_direction direction)
-+{
-+      unsigned long addr = (unsigned long) ptr;
-+
-+      __dma_sync(addr, size, direction);
-+
-+      return virt_to_phys(ptr);
-+}
-+
-+EXPORT_SYMBOL(dma_map_single);
-+
-+void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-+      enum dma_data_direction direction)
-+{
-+      unsigned long addr;
-+      addr = dma_addr + PAGE_OFFSET;
-+
-+      //__dma_sync(addr, size, direction);
-+}
-+
-+EXPORT_SYMBOL(dma_unmap_single);
-+
-+int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-+      enum dma_data_direction direction)
-+{
-+      int i;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      for (i = 0; i < nents; i++, sg++) {
-+              unsigned long addr;
-+
-+              addr = (unsigned long) page_address(sg->page);
-+              if (addr) {
-+                      __dma_sync(addr + sg->offset, sg->length, direction);
-+                      sg->dma_address = (dma_addr_t)page_to_phys(sg->page)
-+                                        + sg->offset;
-+              }
-+      }
-+
-+      return nents;
-+}
-+
-+EXPORT_SYMBOL(dma_map_sg);
-+
-+dma_addr_t dma_map_page(struct device *dev, struct page *page,
-+      unsigned long offset, size_t size, enum dma_data_direction direction)
-+{
-+      unsigned long addr;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      addr = (unsigned long) page_address(page) + offset;
-+      dma_cache_wback_inv(addr, size);
-+
-+      return page_to_phys(page) + offset;
-+}
-+
-+EXPORT_SYMBOL(dma_map_page);
-+
-+void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-+      enum dma_data_direction direction)
-+{
-+      BUG_ON(direction == DMA_NONE);
-+
-+      if (direction != DMA_TO_DEVICE) {
-+              unsigned long addr;
-+
-+              addr = dma_address + PAGE_OFFSET;
-+              dma_cache_wback_inv(addr, size);
-+      }
-+}
-+
-+EXPORT_SYMBOL(dma_unmap_page);
-+
-+void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
-+      enum dma_data_direction direction)
-+{
-+      unsigned long addr;
-+      int i;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      if (direction == DMA_TO_DEVICE)
-+              return;
-+
-+      for (i = 0; i < nhwentries; i++, sg++) {
-+              addr = (unsigned long) page_address(sg->page);
-+              if (addr)
-+                      __dma_sync(addr + sg->offset, sg->length, direction);
-+      }
-+}
-+
-+EXPORT_SYMBOL(dma_unmap_sg);
-+
-+void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
-+      size_t size, enum dma_data_direction direction)
-+{
-+      unsigned long addr;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      addr = dma_handle + PAGE_OFFSET;
-+      __dma_sync(addr, size, direction);
-+}
-+
-+EXPORT_SYMBOL(dma_sync_single_for_cpu);
-+
-+void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
-+      size_t size, enum dma_data_direction direction)
-+{
-+      unsigned long addr;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      addr = dma_handle + PAGE_OFFSET;
-+      __dma_sync(addr, size, direction);
-+}
-+
-+EXPORT_SYMBOL(dma_sync_single_for_device);
-+
-+void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-+      unsigned long offset, size_t size, enum dma_data_direction direction)
-+{
-+      unsigned long addr;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      addr = dma_handle + offset + PAGE_OFFSET;
-+      __dma_sync(addr, size, direction);
-+}
-+
-+EXPORT_SYMBOL(dma_sync_single_range_for_cpu);
-+
-+void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-+      unsigned long offset, size_t size, enum dma_data_direction direction)
-+{
-+      unsigned long addr;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      addr = dma_handle + offset + PAGE_OFFSET;
-+      __dma_sync(addr, size, direction);
-+}
-+
-+EXPORT_SYMBOL(dma_sync_single_range_for_device);
-+
-+void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-+      enum dma_data_direction direction)
-+{
-+      int i;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      /* Make sure that gcc doesn't leave the empty loop body.  */
-+      for (i = 0; i < nelems; i++, sg++)
-+              __dma_sync((unsigned long)page_address(sg->page),
-+                         sg->length, direction);
-+}
-+
-+EXPORT_SYMBOL(dma_sync_sg_for_cpu);
-+
-+void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-+      enum dma_data_direction direction)
-+{
-+      int i;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      /* Make sure that gcc doesn't leave the empty loop body.  */
-+      for (i = 0; i < nelems; i++, sg++)
-+              __dma_sync((unsigned long)page_address(sg->page),
-+                         sg->length, direction);
-+}
-+
-+EXPORT_SYMBOL(dma_sync_sg_for_device);
-+
-+int dma_mapping_error(dma_addr_t dma_addr)
-+{
-+      return 0;
-+}
-+
-+EXPORT_SYMBOL(dma_mapping_error);
-+
-+int dma_supported(struct device *dev, u64 mask)
-+{
-+      /*
-+       * we fall back to GFP_DMA when the mask isn't all 1s,
-+       * so we can't guarantee allocations that must be
-+       * within a tighter range than GFP_DMA..
-+       */
-+      if (mask < 0x00ffffff)
-+              return 0;
-+
-+      return 1;
-+}
-+
-+EXPORT_SYMBOL(dma_supported);
-+
-+int dma_is_consistent(dma_addr_t dma_addr)
-+{
-+      return 1;
-+}
-+
-+EXPORT_SYMBOL(dma_is_consistent);
-+
-+void dma_cache_sync(void *vaddr, size_t size, enum dma_data_direction direction)
-+{
-+      if (direction == DMA_NONE)
-+              return;
-+
-+      dma_cache_wback_inv((unsigned long)vaddr, size);
-+}
-+
-+EXPORT_SYMBOL(dma_cache_sync);
-+
-+/* The DAC routines are a PCIism.. */
-+
-+#ifdef CONFIG_PCI
-+
-+#include <linux/pci.h>
-+
-+dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,
-+      struct page *page, unsigned long offset, int direction)
-+{
-+      return (dma64_addr_t)page_to_phys(page) + offset;
-+}
-+
-+EXPORT_SYMBOL(pci_dac_page_to_dma);
-+
-+struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
-+      dma64_addr_t dma_addr)
-+{
-+      return mem_map + (dma_addr >> PAGE_SHIFT);
-+}
-+
-+EXPORT_SYMBOL(pci_dac_dma_to_page);
-+
-+unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,
-+      dma64_addr_t dma_addr)
-+{
-+      return dma_addr & ~PAGE_MASK;
-+}
-+
-+EXPORT_SYMBOL(pci_dac_dma_to_offset);
-+
-+void pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev,
-+      dma64_addr_t dma_addr, size_t len, int direction)
-+{
-+      BUG_ON(direction == PCI_DMA_NONE);
-+
-+      dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);
-+}
-+
-+EXPORT_SYMBOL(pci_dac_dma_sync_single_for_cpu);
-+
-+void pci_dac_dma_sync_single_for_device(struct pci_dev *pdev,
-+      dma64_addr_t dma_addr, size_t len, int direction)
-+{
-+      BUG_ON(direction == PCI_DMA_NONE);
-+
-+      dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);
-+}
-+
-+EXPORT_SYMBOL(pci_dac_dma_sync_single_for_device);
-+
-+#endif /* CONFIG_PCI */
-diff --git a/arch/nios2nommu/mm/extable.c b/arch/nios2nommu/mm/extable.c
-new file mode 100644
-index 0000000..e23778f
---- /dev/null
-+++ b/arch/nios2nommu/mm/extable.c
-@@ -0,0 +1,29 @@
-+/*
-+ * linux/arch/niosnommu/mm/extable.c
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/spinlock.h>
-+#include <asm/uaccess.h>
-+
-+/* Simple binary search */
-+const struct exception_table_entry *
-+search_extable(const struct exception_table_entry *first,
-+             const struct exception_table_entry *last,
-+             unsigned long value)
-+{
-+        while (first <= last) {
-+              const struct exception_table_entry *mid;
-+              long diff;
-+
-+              mid = (last - first) / 2 + first;
-+              diff = mid->insn - value;
-+                if (diff == 0)
-+                        return mid;
-+                else if (diff < 0)
-+                        first = mid+1;
-+                else
-+                        last = mid-1;
-+        }
-+        return NULL;
-+}
-diff --git a/arch/nios2nommu/mm/init.c b/arch/nios2nommu/mm/init.c
-new file mode 100644
-index 0000000..21fe61b
---- /dev/null
-+++ b/arch/nios2nommu/mm/init.c
-@@ -0,0 +1,231 @@
-+/*
-+ *  linux/arch/nios2nommu/mm/init.c
-+ *
-+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
-+ *                      Kenneth Albanowski <kjahds@kjahds.com>,
-+ *  Copyright (C) 2000  Lineo, Inc.  (www.lineo.com) 
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ *  Based on:
-+ *
-+ *  linux/arch/m68k/mm/init.c
-+ *
-+ *  Copyright (C) 1995  Hamish Macdonald
-+ *
-+ *  JAN/1999 -- hacked to support ColdFire (gerg@snapgear.com)
-+ *  DEC/2000 -- linux 2.4 support <davidm@snapgear.com>
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ */
-+
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/ptrace.h>
-+#include <linux/mman.h>
-+#include <linux/mm.h>
-+#include <linux/swap.h>
-+#include <linux/init.h>
-+#include <linux/highmem.h>
-+#include <linux/pagemap.h>
-+#include <linux/bootmem.h>
-+#include <linux/slab.h>
-+
-+#include <asm/setup.h>
-+#include <asm/segment.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+//;dgt2;#include <asm/machdep.h>
-+//;dgt2;#include <asm/shglcore.h>
-+
-+#undef DEBUG
-+
-+extern void die_if_kernel(char *,struct pt_regs *,long);
-+extern void free_initmem(void);
-+
-+/*
-+ * BAD_PAGE is the page that is used for page faults when linux
-+ * is out-of-memory. Older versions of linux just did a
-+ * do_exit(), but using this instead means there is less risk
-+ * for a process dying in kernel mode, possibly leaving a inode
-+ * unused etc..
-+ *
-+ * BAD_PAGETABLE is the accompanying page-table: it is initialized
-+ * to point to BAD_PAGE entries.
-+ *
-+ * ZERO_PAGE is a special page that is used for zero-initialized
-+ * data and COW.
-+ */
-+static unsigned long empty_bad_page_table;
-+
-+static unsigned long empty_bad_page;
-+
-+unsigned long empty_zero_page;
-+
-+extern unsigned long rom_length;
-+
-+void show_mem(void)
-+{
-+    unsigned long i;
-+    int free = 0, total = 0, reserved = 0, shared = 0;
-+    int cached = 0;
-+
-+    printk(KERN_INFO "\nMem-info:\n");
-+    show_free_areas();
-+    i = max_mapnr;
-+    while (i-- > 0) {
-+      total++;
-+      if (PageReserved(mem_map+i))
-+          reserved++;
-+      else if (PageSwapCache(mem_map+i))
-+          cached++;
-+      else if (!page_count(mem_map+i))
-+          free++;
-+      else
-+          shared += page_count(mem_map+i) - 1;
-+    }
-+    printk(KERN_INFO "%d pages of RAM\n",total);
-+    printk(KERN_INFO "%d free pages\n",free);
-+    printk(KERN_INFO "%d reserved pages\n",reserved);
-+    printk(KERN_INFO "%d pages shared\n",shared);
-+    printk(KERN_INFO "%d pages swap cached\n",cached);
-+}
-+
-+extern unsigned long memory_start;
-+extern unsigned long memory_end;
-+
-+/*
-+ * paging_init() continues the virtual memory environment setup which
-+ * was begun by the code in arch/head.S.
-+ * The parameters are pointers to where to stick the starting and ending
-+ * addresses of available kernel virtual memory.
-+ */
-+void __init paging_init(void)
-+{
-+      /*
-+       * Make sure start_mem is page aligned, otherwise bootmem and
-+       * page_alloc get different views of the world.
-+       */
-+#ifdef DEBUG
-+      unsigned long start_mem = PAGE_ALIGN(memory_start);
-+#endif
-+      unsigned long end_mem   = memory_end & PAGE_MASK;
-+
-+#ifdef DEBUG
-+      printk (KERN_DEBUG "start_mem is %#lx\nvirtual_end is %#lx\n",
-+              start_mem, end_mem);
-+#endif
-+
-+      /*
-+       * Initialize the bad page table and bad page to point
-+       * to a couple of allocated pages.
-+       */
-+      empty_bad_page_table = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
-+      empty_bad_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
-+      empty_zero_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
-+      memset((void *)empty_zero_page, 0, PAGE_SIZE);
-+
-+      /*
-+       * Set up SFC/DFC registers (user data space).
-+       */
-+      set_fs (USER_DS);
-+
-+#ifdef DEBUG
-+      printk (KERN_DEBUG "before free_area_init\n");
-+
-+      printk (KERN_DEBUG "free_area_init -> start_mem is %#lx\nvirtual_end is %#lx\n",
-+              start_mem, end_mem);
-+#endif
-+
-+      {
-+              unsigned long zones_size[MAX_NR_ZONES] = {0, };
-+
-+              zones_size[ZONE_DMA] = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
-+              zones_size[ZONE_NORMAL] = 0;
-+#ifdef CONFIG_HIGHMEM
-+              zones_size[ZONE_HIGHMEM] = 0;
-+#endif
-+              free_area_init(zones_size);
-+      }
-+}
-+
-+void __init mem_init(void)
-+{
-+      int codek = 0, datak = 0, initk = 0;
-+      unsigned long tmp;
-+      extern char _etext, _stext, __init_begin, __init_end, _end;
-+      unsigned long start_mem = memory_start; /* DAVIDM - these must start at end of kernel */
-+      unsigned long end_mem   = memory_end; /* DAVIDM - this must not include kernel stack at top */
-+
-+#ifdef DEBUG
-+      printk(KERN_DEBUG "Mem_init: start=%lx, end=%lx\n", start_mem, end_mem);
-+#endif
-+
-+      end_mem &= PAGE_MASK;
-+      high_memory = (void *) end_mem;
-+
-+      start_mem = PAGE_ALIGN(start_mem);
-+      max_mapnr = num_physpages = MAP_NR(high_memory);
-+
-+      /* this will put all memory onto the freelists */
-+      totalram_pages = free_all_bootmem();
-+
-+      codek = (&_etext - &_stext) >> 10;
-+      datak = (&_end - &_etext) >> 10;
-+      initk = (&__init_begin - &__init_end) >> 10;
-+
-+      tmp = nr_free_pages() << PAGE_SHIFT;
-+      printk(KERN_INFO "Memory available: %luk/%luk RAM, %luk/%luk ROM (%dk kernel code, %dk data)\n",
-+             tmp >> 10,
-+             (&_end - &_stext) >> 10,
-+             (rom_length > 0) ? ((rom_length >> 10) - codek) : 0,
-+             rom_length >> 10,
-+             codek,
-+             datak
-+             );
-+}
-+
-+
-+#ifdef CONFIG_BLK_DEV_INITRD
-+void __init free_initrd_mem(unsigned long start, unsigned long end)
-+{
-+      int pages = 0;
-+      for (; start < end; start += PAGE_SIZE) {
-+              ClearPageReserved(virt_to_page(start));
-+              init_page_count(virt_to_page(start));
-+              free_page(start);
-+              totalram_pages++;
-+              pages++;
-+      }
-+      printk (KERN_NOTICE "Freeing initrd memory: %dk freed\n", pages);
-+}
-+#endif
-+
-+void free_initmem(void)
-+{
-+#ifdef CONFIG_RAMKERNEL
-+      unsigned long addr;
-+      extern char __init_begin, __init_end;
-+      /*
-+       * The following code should be cool even if these sections
-+       * are not page aligned.
-+       */
-+      addr = PAGE_ALIGN((unsigned long)(&__init_begin));
-+      /* next to check that the page we free is not a partial page */
-+      for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) {
-+              ClearPageReserved(virt_to_page(addr));
-+              init_page_count(virt_to_page(addr));
-+              free_page(addr);
-+              totalram_pages++;
-+      }
-+      printk(KERN_NOTICE "Freeing unused kernel memory: %ldk freed (0x%x - 0x%x)\n",
-+                      (addr - PAGE_ALIGN((long) &__init_begin)) >> 10,
-+                      (int)(PAGE_ALIGN((unsigned long)(&__init_begin))),
-+                      (int)(addr - PAGE_SIZE));
-+#endif
-+}
-+
-diff --git a/arch/nios2nommu/mm/ioremap.c b/arch/nios2nommu/mm/ioremap.c
-new file mode 100644
-index 0000000..1c8b172
---- /dev/null
-+++ b/arch/nios2nommu/mm/ioremap.c
-@@ -0,0 +1,65 @@
-+/*  linux/arch/nios2nommu/mm/ioremap.c, based on:
-+ *
-+ *  linux/arch/m68knommu/mm/kmap.c
-+ *
-+ *  Copyright (C) 2004 Microtronix Datacom Ltd.
-+ *  Copyright (C) 2000 Lineo, <davidm@lineo.com>
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+
-+#include <asm/setup.h>
-+#include <asm/segment.h>
-+#include <asm/page.h>
-+#include <asm/pgalloc.h>
-+#include <asm/io.h>
-+#include <asm/system.h>
-+
-+/*
-+ * Map some physical address range into the kernel address space.
-+ */
-+
-+void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag)
-+{
-+      return (void *)physaddr;
-+}
-+
-+/*
-+ * Unmap a ioremap()ed region again
-+ */
-+void iounmap(void *addr)
-+{
-+}
-+
-+/*
-+ * __iounmap unmaps nearly everything, so be careful
-+ * it doesn't free currently pointer/page tables anymore but it
-+ * wans't used anyway and might be added later.
-+ */
-+void __iounmap(void *addr, unsigned long size)
-+{
-+}
-+
-diff --git a/arch/nios2nommu/mm/memory.c b/arch/nios2nommu/mm/memory.c
-new file mode 100644
-index 0000000..76d60d9
---- /dev/null
-+++ b/arch/nios2nommu/mm/memory.c
-@@ -0,0 +1,212 @@
-+/*
-+ *  linux/arch/nio2nommu/mm/memory.c
-+ *
-+ *  Copyright (C) 1995  Hamish Macdonald
-+ *  Copyright (C) 1998  Kenneth Albanowski <kjahds@kjahds.com>,
-+ *  Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
-+ *  Copyright (C) 2004  Microtronix Datacom Ltd.
-+ *
-+ *  Based on:
-+ *
-+ *  linux/arch/m68k/mm/memory.c
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/slab.h>
-+
-+#include <asm/setup.h>
-+#include <asm/segment.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/traps.h>
-+#include <asm/io.h>
-+
-+/*
-+ * cache_clear() semantics: Clear any cache entries for the area in question,
-+ * without writing back dirty entries first. This is useful if the data will
-+ * be overwritten anyway, e.g. by DMA to memory. The range is defined by a
-+ * _physical_ address.
-+ */
-+
-+void cache_clear (unsigned long paddr, int len)
-+{
-+}
-+
-+
-+/*
-+ *    Define cache invalidate functions. The instruction and data cache 
-+ *    will need to be flushed. Write back the dirty data cache and invalidate
-+ *    the instruction cache for the range.
-+ *
-+ */
-+
-+static __inline__ void cache_invalidate_inst(unsigned long paddr, int len)
-+{
-+      unsigned long   sset, eset;
-+
-+      sset = (paddr & (nasys_icache_size - 1)) & (~(nasys_icache_line_size - 1));
-+      eset = (((paddr & (nasys_icache_size - 1)) + len) & (~(nasys_icache_line_size - 1))) + nasys_icache_line_size;
-+
-+      __asm__ __volatile__ (
-+      "1:\n\t"
-+      "flushi %0\n\t"
-+      "add    %0,%0,%2\n\t"
-+      "blt    %0,%1,1b\n\t"
-+      "flushp\n\t"
-+      : : "r" (sset), "r" (eset), "r" (nasys_icache_line_size));
-+
-+}
-+
-+static __inline__ void cache_invalidate_data(unsigned long paddr, int len)
-+{
-+      unsigned long   sset, eset;
-+
-+      sset = (paddr & (nasys_dcache_size - 1)) & (~(nasys_dcache_line_size - 1));
-+      eset = (((paddr & (nasys_dcache_size - 1)) + len) & (~(nasys_dcache_line_size - 1))) + nasys_dcache_line_size;
-+
-+      __asm__ __volatile__ (
-+      "1:\n\t"
-+      "flushd 0(%0)\n\t"
-+      "add    %0,%0,%2\n\t"
-+      "blt    %0,%1,1b\n\t"
-+      : : "r" (sset),"r" (eset), "r" (nasys_dcache_line_size));
-+
-+}
-+
-+static __inline__ void cache_invalidate_lines(unsigned long paddr, int len)
-+{
-+      unsigned long   sset, eset;
-+
-+      sset = (paddr & (nasys_dcache_size - 1)) & (~(nasys_dcache_line_size - 1));
-+      eset = (((paddr & (nasys_dcache_size - 1)) + len) & (~(nasys_dcache_line_size - 1))) + nasys_dcache_line_size;
-+
-+      __asm__ __volatile__ (
-+      "1:\n\t"
-+      "flushd 0(%0)\n\t"
-+      "add    %0,%0,%2\n\t"
-+      "blt    %0,%1,1b\n\t"
-+      : : "r" (sset),"r" (eset), "r" (nasys_dcache_line_size));
-+
-+      sset = (paddr & (nasys_icache_size - 1)) & (~(nasys_icache_line_size - 1));
-+      eset = (((paddr & (nasys_icache_size - 1)) + len) & (~(nasys_icache_line_size - 1))) + nasys_icache_line_size;
-+
-+      __asm__ __volatile__ (
-+      "1:\n\t"
-+      "flushi %0\n\t"
-+      "add    %0,%0,%2\n\t"
-+      "blt    %0,%1,1b\n\t"
-+      "flushp\n\t"
-+      : : "r" (sset), "r" (eset), "r" (nasys_icache_line_size));
-+
-+}
-+
-+/*
-+ * cache_push() semantics: Write back any dirty cache data in the given area,
-+ * and invalidate the range in the instruction cache. It needs not (but may)
-+ * invalidate those entries also in the data cache. The range is defined by a
-+ * _physical_ address.
-+ */
-+
-+void cache_push (unsigned long paddr, int len)
-+{
-+      cache_invalidate_lines(paddr, len);
-+}
-+
-+
-+/*
-+ * cache_push_v() semantics: Write back any dirty cache data in the given
-+ * area, and invalidate those entries at least in the instruction cache. This
-+ * is intended to be used after data has been written that can be executed as
-+ * code later. The range is defined by a _user_mode_ _virtual_ address.
-+ */
-+
-+void cache_push_v (unsigned long vaddr, int len)
-+{
-+      cache_invalidate_lines(vaddr, len);
-+}
-+
-+/*
-+ * cache_push_all() semantics: Invalidate instruction cache and write back
-+ * dirty data cache & invalidate.
-+ */
-+void cache_push_all (void)
-+{
-+      __asm__ __volatile__ (
-+      "1:\n\t"
-+      "flushd 0(%0)\n\t"
-+      "sub    %0,%0,%1\n\t"
-+      "bgt    %0,r0,1b\n\t"
-+      : : "r" (nasys_dcache_size), "r" (nasys_dcache_line_size));
-+
-+      __asm__ __volatile__ (
-+      "1:\n\t"
-+      "flushi %0\n\t"
-+      "sub    %0,%0,%1\n\t"
-+      "bgt    %0,r0,1b\n\t"
-+      "flushp\n\t"
-+      : : "r" (nasys_icache_size), "r" (nasys_icache_line_size));
-+
-+}
-+
-+/*
-+ * dcache_push() semantics: Write back and dirty data cache and invalidate
-+ * the range.
-+ */
-+void dcache_push (unsigned long vaddr, int len)
-+{
-+      cache_invalidate_data(vaddr, len);
-+}
-+
-+/*
-+ * icache_push() semantics: Invalidate instruction cache in the range.
-+ */
-+void icache_push (unsigned long vaddr, int len)
-+{
-+      cache_invalidate_inst(vaddr, len);
-+}
-+
-+/* Map some physical address range into the kernel address space. The
-+ * code is copied and adapted from map_chunk().
-+ */
-+
-+unsigned long kernel_map(unsigned long paddr, unsigned long size,
-+                       int nocacheflag, unsigned long *memavailp )
-+{
-+      return paddr;
-+}
-+
-+
-+int is_in_rom(unsigned long addr)
-+{
-+      /* Default case, not in ROM */
-+      return(0);
-+}
-+
-+int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
-+              unsigned long address, int write_access)
-+{
-+  BUG();
-+              return VM_FAULT_OOM;
-+}
-diff --git a/arch/nios2nommu/scripts/PTF/PTFParser.pm b/arch/nios2nommu/scripts/PTF/PTFParser.pm
-new file mode 100644
-index 0000000..c243c7b
---- /dev/null
-+++ b/arch/nios2nommu/scripts/PTF/PTFParser.pm
-@@ -0,0 +1,873 @@
-+####################################################################
-+#
-+#    This file was generated using Parse::Yapp version 1.05.
-+#
-+#        Don't edit this file, use source file instead.
-+#
-+#             ANY CHANGE MADE HERE WILL BE LOST !
-+#
-+####################################################################
-+package PTFParser;
-+use vars qw ( @ISA );
-+use strict;
-+
-+@ISA= qw ( Parse::Yapp::Driver );
-+#Included Parse/Yapp/Driver.pm file----------------------------------------
-+{
-+#
-+# Module Parse::Yapp::Driver
-+#
-+# This module is part of the Parse::Yapp package available on your
-+# nearest CPAN
-+#
-+# Any use of this module in a standalone parser make the included
-+# text under the same copyright as the Parse::Yapp module itself.
-+#
-+# This notice should remain unchanged.
-+#
-+# (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
-+# (see the pod text in Parse::Yapp module for use and distribution rights)
-+#
-+
-+package Parse::Yapp::Driver;
-+
-+require 5.004;
-+
-+use strict;
-+
-+use vars qw ( $VERSION $COMPATIBLE $FILENAME );
-+
-+$VERSION = '1.05';
-+$COMPATIBLE = '0.07';
-+$FILENAME=__FILE__;
-+
-+use Carp;
-+
-+#Known parameters, all starting with YY (leading YY will be discarded)
-+my(%params)=(YYLEX => 'CODE', 'YYERROR' => 'CODE', YYVERSION => '',
-+                       YYRULES => 'ARRAY', YYSTATES => 'ARRAY', YYDEBUG => '');
-+#Mandatory parameters
-+my(@params)=('LEX','RULES','STATES');
-+
-+sub new {
-+    my($class)=shift;
-+      my($errst,$nberr,$token,$value,$check,$dotpos);
-+    my($self)={ ERROR => \&_Error,
-+                              ERRST => \$errst,
-+                NBERR => \$nberr,
-+                              TOKEN => \$token,
-+                              VALUE => \$value,
-+                              DOTPOS => \$dotpos,
-+                              STACK => [],
-+                              DEBUG => 0,
-+                              CHECK => \$check };
-+
-+      _CheckParams( [], \%params, \@_, $self );
-+
-+              exists($$self{VERSION})
-+      and     $$self{VERSION} < $COMPATIBLE
-+      and     croak "Yapp driver version $VERSION ".
-+                        "incompatible with version $$self{VERSION}:\n".
-+                        "Please recompile parser module.";
-+
-+        ref($class)
-+    and $class=ref($class);
-+
-+    bless($self,$class);
-+}
-+
-+sub YYParse {
-+    my($self)=shift;
-+    my($retval);
-+
-+      _CheckParams( \@params, \%params, \@_, $self );
-+
-+      if($$self{DEBUG}) {
-+              _DBLoad();
-+              $retval = eval '$self->_DBParse()';#Do not create stab entry on compile
-+        $@ and die $@;
-+      }
-+      else {
-+              $retval = $self->_Parse();
-+      }
-+    $retval
-+}
-+
-+sub YYData {
-+      my($self)=shift;
-+
-+              exists($$self{USER})
-+      or      $$self{USER}={};
-+
-+      $$self{USER};
-+      
-+}
-+
-+sub YYErrok {
-+      my($self)=shift;
-+
-+      ${$$self{ERRST}}=0;
-+    undef;
-+}
-+
-+sub YYNberr {
-+      my($self)=shift;
-+
-+      ${$$self{NBERR}};
-+}
-+
-+sub YYRecovering {
-+      my($self)=shift;
-+
-+      ${$$self{ERRST}} != 0;
-+}
-+
-+sub YYAbort {
-+      my($self)=shift;
-+
-+      ${$$self{CHECK}}='ABORT';
-+    undef;
-+}
-+
-+sub YYAccept {
-+      my($self)=shift;
-+
-+      ${$$self{CHECK}}='ACCEPT';
-+    undef;
-+}
-+
-+sub YYError {
-+      my($self)=shift;
-+
-+      ${$$self{CHECK}}='ERROR';
-+    undef;
-+}
-+
-+sub YYSemval {
-+      my($self)=shift;
-+      my($index)= $_[0] - ${$$self{DOTPOS}} - 1;
-+
-+              $index < 0
-+      and     -$index <= @{$$self{STACK}}
-+      and     return $$self{STACK}[$index][1];
-+
-+      undef;  #Invalid index
-+}
-+
-+sub YYCurtok {
-+      my($self)=shift;
-+
-+        @_
-+    and ${$$self{TOKEN}}=$_[0];
-+    ${$$self{TOKEN}};
-+}
-+
-+sub YYCurval {
-+      my($self)=shift;
-+
-+        @_
-+    and ${$$self{VALUE}}=$_[0];
-+    ${$$self{VALUE}};
-+}
-+
-+sub YYExpect {
-+    my($self)=shift;
-+
-+    keys %{$self->{STATES}[$self->{STACK}[-1][0]]{ACTIONS}}
-+}
-+
-+sub YYLexer {
-+    my($self)=shift;
-+
-+      $$self{LEX};
-+}
-+
-+
-+#################
-+# Private stuff #
-+#################
-+
-+
-+sub _CheckParams {
-+      my($mandatory,$checklist,$inarray,$outhash)=@_;
-+      my($prm,$value);
-+      my($prmlst)={};
-+
-+      while(($prm,$value)=splice(@$inarray,0,2)) {
-+        $prm=uc($prm);
-+                      exists($$checklist{$prm})
-+              or      croak("Unknow parameter '$prm'");
-+                      ref($value) eq $$checklist{$prm}
-+              or      croak("Invalid value for parameter '$prm'");
-+        $prm=unpack('@2A*',$prm);
-+              $$outhash{$prm}=$value;
-+      }
-+      for (@$mandatory) {
-+                      exists($$outhash{$_})
-+              or      croak("Missing mandatory parameter '".lc($_)."'");
-+      }
-+}
-+
-+sub _Error {
-+      print "Parse error.\n";
-+}
-+
-+sub _DBLoad {
-+      {
-+              no strict 'refs';
-+
-+                      exists(${__PACKAGE__.'::'}{_DBParse})#Already loaded ?
-+              and     return;
-+      }
-+      my($fname)=__FILE__;
-+      my(@drv);
-+      open(DRV,"<$fname") or die "Report this as a BUG: Cannot open $fname";
-+      while(<DRV>) {
-+                      /^\s*sub\s+_Parse\s*{\s*$/ .. /^\s*}\s*#\s*_Parse\s*$/
-+              and     do {
-+                      s/^#DBG>//;
-+                      push(@drv,$_);
-+              }
-+      }
-+      close(DRV);
-+
-+      $drv[0]=~s/_P/_DBP/;
-+      eval join('',@drv);
-+}
-+
-+#Note that for loading debugging version of the driver,
-+#this file will be parsed from 'sub _Parse' up to '}#_Parse' inclusive.
-+#So, DO NOT remove comment at end of sub !!!
-+sub _Parse {
-+    my($self)=shift;
-+
-+      my($rules,$states,$lex,$error)
-+     = @$self{ 'RULES', 'STATES', 'LEX', 'ERROR' };
-+      my($errstatus,$nberror,$token,$value,$stack,$check,$dotpos)
-+     = @$self{ 'ERRST', 'NBERR', 'TOKEN', 'VALUE', 'STACK', 'CHECK', 'DOTPOS' };
-+
-+#DBG> my($debug)=$$self{DEBUG};
-+#DBG> my($dbgerror)=0;
-+
-+#DBG> my($ShowCurToken) = sub {
-+#DBG>         my($tok)='>';
-+#DBG>         for (split('',$$token)) {
-+#DBG>                 $tok.=          (ord($_) < 32 or ord($_) > 126)
-+#DBG>                                 ?       sprintf('<%02X>',ord($_))
-+#DBG>                                 :       $_;
-+#DBG>         }
-+#DBG>         $tok.='<';
-+#DBG> };
-+
-+      $$errstatus=0;
-+      $$nberror=0;
-+      ($$token,$$value)=(undef,undef);
-+      @$stack=( [ 0, undef ] );
-+      $$check='';
-+
-+    while(1) {
-+        my($actions,$act,$stateno);
-+
-+        $stateno=$$stack[-1][0];
-+        $actions=$$states[$stateno];
-+
-+#DBG> print STDERR ('-' x 40),"\n";
-+#DBG>         $debug & 0x2
-+#DBG> and     print STDERR "In state $stateno:\n";
-+#DBG>         $debug & 0x08
-+#DBG> and     print STDERR "Stack:[".
-+#DBG>                                  join(',',map { $$_[0] } @$stack).
-+#DBG>                                  "]\n";
-+
-+
-+        if  (exists($$actions{ACTIONS})) {
-+
-+                              defined($$token)
-+            or        do {
-+                              ($$token,$$value)=&$lex($self);
-+#DBG>                         $debug & 0x01
-+#DBG>                 and     print STDERR "Need token. Got ".&$ShowCurToken."\n";
-+                      };
-+
-+            $act=   exists($$actions{ACTIONS}{$$token})
-+                    ?   $$actions{ACTIONS}{$$token}
-+                    :   exists($$actions{DEFAULT})
-+                        ?   $$actions{DEFAULT}
-+                        :   undef;
-+        }
-+        else {
-+            $act=$$actions{DEFAULT};
-+#DBG>                 $debug & 0x01
-+#DBG>         and     print STDERR "Don't need token.\n";
-+        }
-+
-+            defined($act)
-+        and do {
-+
-+                $act > 0
-+            and do {        #shift
-+
-+#DBG>                         $debug & 0x04
-+#DBG>                 and     print STDERR "Shift and go to state $act.\n";
-+
-+                                      $$errstatus
-+                              and     do {
-+                                      --$$errstatus;
-+
-+#DBG>                                 $debug & 0x10
-+#DBG>                         and     $dbgerror
-+#DBG>                         and     $$errstatus == 0
-+#DBG>                         and     do {
-+#DBG>                                 print STDERR "**End of Error recovery.\n";
-+#DBG>                                 $dbgerror=0;
-+#DBG>                         };
-+                              };
-+
-+
-+                push(@$stack,[ $act, $$value ]);
-+
-+                                      $$token ne ''   #Don't eat the eof
-+                              and     $$token=$$value=undef;
-+                next;
-+            };
-+
-+            #reduce
-+            my($lhs,$len,$code,@sempar,$semval);
-+            ($lhs,$len,$code)=@{$$rules[-$act]};
-+
-+#DBG>                 $debug & 0x04
-+#DBG>         and     $act
-+#DBG>         and     print STDERR "Reduce using rule ".-$act." ($lhs,$len): ";
-+
-+                $act
-+            or  $self->YYAccept();
-+
-+            $$dotpos=$len;
-+
-+                unpack('A1',$lhs) eq '@'    #In line rule
-+            and do {
-+                    $lhs =~ /^\@[0-9]+\-([0-9]+)$/
-+                or  die "In line rule name '$lhs' ill formed: ".
-+                        "report it as a BUG.\n";
-+                $$dotpos = $1;
-+            };
-+
-+            @sempar =       $$dotpos
-+                        ?   map { $$_[1] } @$stack[ -$$dotpos .. -1 ]
-+                        :   ();
-+
-+            $semval = $code ? &$code( $self, @sempar )
-+                            : @sempar ? $sempar[0] : undef;
-+
-+            splice(@$stack,-$len,$len);
-+
-+                $$check eq 'ACCEPT'
-+            and do {
-+
-+#DBG>                 $debug & 0x04
-+#DBG>         and     print STDERR "Accept.\n";
-+
-+                              return($semval);
-+                      };
-+
-+                $$check eq 'ABORT'
-+            and       do {
-+
-+#DBG>                 $debug & 0x04
-+#DBG>         and     print STDERR "Abort.\n";
-+
-+                              return(undef);
-+
-+                      };
-+
-+#DBG>                 $debug & 0x04
-+#DBG>         and     print STDERR "Back to state $$stack[-1][0], then ";
-+
-+                $$check eq 'ERROR'
-+            or  do {
-+#DBG>                         $debug & 0x04
-+#DBG>                 and     print STDERR 
-+#DBG>                             "go to state $$states[$$stack[-1][0]]{GOTOS}{$lhs}.\n";
-+
-+#DBG>                         $debug & 0x10
-+#DBG>                 and     $dbgerror
-+#DBG>                 and     $$errstatus == 0
-+#DBG>                 and     do {
-+#DBG>                         print STDERR "**End of Error recovery.\n";
-+#DBG>                         $dbgerror=0;
-+#DBG>                 };
-+
-+                          push(@$stack,
-+                     [ $$states[$$stack[-1][0]]{GOTOS}{$lhs}, $semval ]);
-+                $$check='';
-+                next;
-+            };
-+
-+#DBG>                 $debug & 0x04
-+#DBG>         and     print STDERR "Forced Error recovery.\n";
-+
-+            $$check='';
-+
-+        };
-+
-+        #Error
-+            $$errstatus
-+        or   do {
-+
-+            $$errstatus = 1;
-+            &$error($self);
-+                $$errstatus # if 0, then YYErrok has been called
-+            or  next;       # so continue parsing
-+
-+#DBG>                 $debug & 0x10
-+#DBG>         and     do {
-+#DBG>                 print STDERR "**Entering Error recovery.\n";
-+#DBG>                 ++$dbgerror;
-+#DBG>         };
-+
-+            ++$$nberror;
-+
-+        };
-+
-+                      $$errstatus == 3        #The next token is not valid: discard it
-+              and     do {
-+                              $$token eq ''   # End of input: no hope
-+                      and     do {
-+#DBG>                         $debug & 0x10
-+#DBG>                 and     print STDERR "**At eof: aborting.\n";
-+                              return(undef);
-+                      };
-+
-+#DBG>                 $debug & 0x10
-+#DBG>         and     print STDERR "**Dicard invalid token ".&$ShowCurToken.".\n";
-+
-+                      $$token=$$value=undef;
-+              };
-+
-+        $$errstatus=3;
-+
-+              while(    @$stack
-+                        and (         not exists($$states[$$stack[-1][0]]{ACTIONS})
-+                              or  not exists($$states[$$stack[-1][0]]{ACTIONS}{error})
-+                                      or      $$states[$$stack[-1][0]]{ACTIONS}{error} <= 0)) {
-+
-+#DBG>                 $debug & 0x10
-+#DBG>         and     print STDERR "**Pop state $$stack[-1][0].\n";
-+
-+                      pop(@$stack);
-+              }
-+
-+                      @$stack
-+              or      do {
-+
-+#DBG>                 $debug & 0x10
-+#DBG>         and     print STDERR "**No state left on stack: aborting.\n";
-+
-+                      return(undef);
-+              };
-+
-+              #shift the error token
-+
-+#DBG>                 $debug & 0x10
-+#DBG>         and     print STDERR "**Shift \$error token and go to state ".
-+#DBG>                                          $$states[$$stack[-1][0]]{ACTIONS}{error}.
-+#DBG>                                          ".\n";
-+
-+              push(@$stack, [ $$states[$$stack[-1][0]]{ACTIONS}{error}, undef ]);
-+
-+    }
-+
-+    #never reached
-+      croak("Error in driver logic. Please, report it as a BUG");
-+
-+}#_Parse
-+#DO NOT remove comment
-+
-+1;
-+
-+}
-+#End of include--------------------------------------------------
-+
-+
-+#line 1 "PTFParser.yp"
-+#
-+# Altera PTF file parser
-+#
-+# Copyright (c) 2004 Microtronix Datacom Ltd.
-+#
-+
-+package PTFParser;
-+
-+use PTF::PTFSection;
-+
-+#global variables should go here.
-+
-+#my $line = 0;                # for error messages
-+#my @sectionStack = ();       # used to keep track of ptf sections
-+#my $root;
-+
-+my $fh;
-+
-+sub new {
-+        my($class)=shift;
-+        ref($class)
-+    and $class=ref($class);
-+
-+    my($self)=$class->SUPER::new( yyversion => '1.05',
-+                                  yystates =>
-+[
-+      {#State 0
-+              ACTIONS => {
-+                      'IDENTIFIER' => 1
-+              },
-+              GOTOS => {
-+                      'section' => 2,
-+                      'section_title' => 3
-+              }
-+      },
-+      {#State 1
-+              ACTIONS => {
-+                      'IDENTIFIER' => 4,
-+                      'STRING_LITERAL' => 6,
-+                      'NUMBER' => 7
-+              },
-+              DEFAULT => -3,
-+              GOTOS => {
-+                      'section_name' => 5
-+              }
-+      },
-+      {#State 2
-+              ACTIONS => {
-+                      '' => 8
-+              }
-+      },
-+      {#State 3
-+              ACTIONS => {
-+                      "{" => 9
-+              }
-+      },
-+      {#State 4
-+              DEFAULT => -4
-+      },
-+      {#State 5
-+              DEFAULT => -2
-+      },
-+      {#State 6
-+              DEFAULT => -6
-+      },
-+      {#State 7
-+              DEFAULT => -5
-+      },
-+      {#State 8
-+              DEFAULT => 0
-+      },
-+      {#State 9
-+              ACTIONS => {
-+                      'IDENTIFIER' => 11,
-+                      'HIERARCHICAL_NAME' => 13
-+              },
-+              DEFAULT => -7,
-+              GOTOS => {
-+                      'assignment_name' => 10,
-+                      'assignment' => 12,
-+                      'section_element' => 14,
-+                      'section' => 15,
-+                      'section_title' => 3
-+              }
-+      },
-+      {#State 10
-+              ACTIONS => {
-+                      "=" => 16
-+              }
-+      },
-+      {#State 11
-+              ACTIONS => {
-+                      'IDENTIFIER' => 4,
-+                      'STRING_LITERAL' => 6,
-+                      'NUMBER' => 7,
-+                      "=" => -11
-+              },
-+              DEFAULT => -3,
-+              GOTOS => {
-+                      'section_name' => 5
-+              }
-+      },
-+      {#State 12
-+              ACTIONS => {
-+                      'IDENTIFIER' => 11,
-+                      'HIERARCHICAL_NAME' => 13
-+              },
-+              DEFAULT => -7,
-+              GOTOS => {
-+                      'assignment_name' => 10,
-+                      'assignment' => 12,
-+                      'section_element' => 17,
-+                      'section' => 15,
-+                      'section_title' => 3
-+              }
-+      },
-+      {#State 13
-+              DEFAULT => -12
-+      },
-+      {#State 14
-+              ACTIONS => {
-+                      "}" => 18
-+              }
-+      },
-+      {#State 15
-+              ACTIONS => {
-+                      'IDENTIFIER' => 11,
-+                      'HIERARCHICAL_NAME' => 13
-+              },
-+              DEFAULT => -7,
-+              GOTOS => {
-+                      'assignment_name' => 10,
-+                      'assignment' => 12,
-+                      'section_element' => 19,
-+                      'section' => 15,
-+                      'section_title' => 3
-+              }
-+      },
-+      {#State 16
-+              ACTIONS => {
-+                      'STRING_LITERAL' => 20,
-+                      'NUMBER' => 22
-+              },
-+              GOTOS => {
-+                      'assignment_value' => 21
-+              }
-+      },
-+      {#State 17
-+              DEFAULT => -8
-+      },
-+      {#State 18
-+              DEFAULT => -1
-+      },
-+      {#State 19
-+              DEFAULT => -9
-+      },
-+      {#State 20
-+              DEFAULT => -13
-+      },
-+      {#State 21
-+              ACTIONS => {
-+                      ";" => 23
-+              }
-+      },
-+      {#State 22
-+              DEFAULT => -14
-+      },
-+      {#State 23
-+              DEFAULT => -10
-+      }
-+],
-+                                  yyrules  =>
-+[
-+      [#Rule 0
-+               '$start', 2, undef
-+      ],
-+      [#Rule 1
-+               'section', 4,
-+sub
-+#line 20 "PTFParser.yp"
-+{ 
-+                      my $sectionStack = $_[0]->YYData->{sectionStack};
-+                      pop @{$sectionStack}; 
-+              }
-+      ],
-+      [#Rule 2
-+               'section_title', 2,
-+sub
-+#line 26 "PTFParser.yp"
-+{ 
-+                      my $section = PTFSection->new (type => $_[1], name => $_[2]); 
-+                      my $sectionStack = $_[0]->YYData->{sectionStack};
-+                      
-+                      if (scalar(@{$sectionStack}) == 0) {
-+                              $_[0]->YYData->{root} = $section;
-+                      } else {
-+                              my $parent = $sectionStack->[$#{$sectionStack}];
-+                              $parent->addSection ($section);
-+                      }
-+
-+                      push @{$sectionStack}, $section;
-+              }
-+      ],
-+      [#Rule 3
-+               'section_name', 0, undef
-+      ],
-+      [#Rule 4
-+               'section_name', 1, undef
-+      ],
-+      [#Rule 5
-+               'section_name', 1, undef
-+      ],
-+      [#Rule 6
-+               'section_name', 1, undef
-+      ],
-+      [#Rule 7
-+               'section_element', 0, undef
-+      ],
-+      [#Rule 8
-+               'section_element', 2, undef
-+      ],
-+      [#Rule 9
-+               'section_element', 2, undef
-+      ],
-+      [#Rule 10
-+               'assignment', 4,
-+sub
-+#line 52 "PTFParser.yp"
-+{ 
-+                      my $sectionStack = $_[0]->YYData->{sectionStack};
-+                      my $parent= $sectionStack->[$#{$sectionStack}]; 
-+                      $parent->addAssignment ($_[1], $_[3]); 
-+              }
-+      ],
-+      [#Rule 11
-+               'assignment_name', 1, undef
-+      ],
-+      [#Rule 12
-+               'assignment_name', 1, undef
-+      ],
-+      [#Rule 13
-+               'assignment_value', 1, undef
-+      ],
-+      [#Rule 14
-+               'assignment_value', 1, undef
-+      ]
-+],
-+                                  @_);
-+    bless($self,$class);
-+}
-+
-+#line 67 "PTFParser.yp"
-+
-+
-+sub _Error {
-+# TODO: update this error function to be more useful
-+        exists $_[0]->YYData->{ERRMSG}
-+    and do {
-+        print $_[0]->YYData->{ERRMSG};
-+        delete $_[0]->YYData->{ERRMSG};
-+        return;
-+    };
-+    print "Syntax error on line $_[0]->YYData->{line}.\n";
-+}
-+
-+sub _Lexer {
-+      my($parser)=shift;
-+
-+      if (! $parser->YYData->{INPUT}) {
-+              if ($parser->YYData->{INPUT} = <$fh>) {
-+                      $parser->YYData->{line} += 1;
-+              } else {
-+                      return ('', undef);
-+              }
-+      }
-+
-+      $parser->YYData->{INPUT} and
-+              $parser->YYData->{INPUT} =~ s/^\s*//;
-+
-+      while (1) {
-+              
-+              # skip blank lines
-+              if ($parser->YYData->{INPUT} =~ s/^[ \t\r\n]*$//) {
-+                      if ($parser->YYData->{INPUT} = <$fh>) {
-+                              $parser->YYData->{line} += 1;
-+                      } else {
-+                              return ('', undef);
-+                      }
-+                      $parser->YYData->{INPUT} and
-+                              $parser->YYData->{INPUT} =~ s/^\s*//;
-+                      next;
-+              }       
-+              
-+              # Skip comments
-+              if ($parser->YYData->{INPUT} =~ s/^#.*//) {
-+                      if ($parser->YYData->{INPUT} = <$fh>) {
-+                              $parser->YYData->{line} += 1;
-+                      } else {
-+                              return ('', undef);
-+                      }
-+                      $parser->YYData->{INPUT} and
-+                              $parser->YYData->{INPUT} =~ s/^\s*//;
-+                      next;
-+              }       
-+
-+              # Don't continue if the line length is 0;
-+              if (length $parser->YYData->{INPUT} == 0) {
-+                      if ($parser->YYData->{INPUT} = <$fh>) {
-+                              $parser->YYData->{line} += 1;
-+                      } else {
-+                              return ('', undef);
-+                      }
-+                      $parser->YYData->{INPUT} and
-+                              $parser->YYData->{INPUT} =~ s/^\s*//;
-+                      next;
-+              }
-+
-+              # tokenize input
-+              $parser->YYData->{INPUT} =~ s/^([a-zA-Z_][a-zA-Z_0-9\/]*)//
-+                      and return('IDENTIFIER',$1);
-+              $parser->YYData->{INPUT} =~ s/^"([^"\\]*(\\.[^"\\]*)*)"//
-+                      and return('STRING_LITERAL',$1);
-+              $parser->YYData->{INPUT} =~ s/^"([^"\\]*(\\.[^"\\]*)*)//
-+                      and do {
-+                              my $literal = $1;
-+
-+                              do {
-+                                      if ($parser->YYData->{INPUT} = <$fh>) {
-+                                              $parser->YYData->{line} += 1;
-+                                      } else {
-+                                              return ('', undef);
-+                                      }
-+
-+                                      $parser->YYData->{INPUT} =~ s/([^"\\]*(\\.[^"\\]*)*)"//
-+                                              and do {
-+                                                      $literal .= $1;
-+                                                      return ('STRING_LITERAL', $literal);
-+                                              };
-+
-+                                      $parser->YYData->{INPUT} =~ s/([^"\\]*(\\.[^"\\]*)*)// 
-+                                              and $literal .= $1;
-+                              } while (1);
-+                      };
-+              $parser->YYData->{INPUT} =~ s/^([0-9]+)//
-+                      and return('NUMBER',$1);
-+              $parser->YYData->{INPUT} =~ s/^([\$]{1,2}[a-zA-Z0-9 \/_]+)//
-+                      and return('HIERARCHICAL_NAME',$1);
-+              $parser->YYData->{INPUT} =~ s/^(.)//
-+                      and return($1,$1);
-+      }
-+}
-+
-+sub readPTF {
-+      my $self = shift;
-+      my $filename = shift;
-+
-+      # store information for later use
-+      $self->YYData->{line} = 0;
-+      $self->YYData->{sectionStack} = [];
-+      undef $self->YYData->{root};
-+      
-+      if (-e $filename) {
-+              open (PTFFILE, $filename);
-+              $fh = \*PTFFILE;
-+      } else {
-+              $fh = \*STDIN;
-+      }
-+      
-+      $self->YYParse (
-+              yylex => \&_Lexer,
-+              yyerror => \&_Error,
-+              );
-+              
-+      if (-e $filename) {
-+              close PTFFILE;
-+      }
-+
-+      return $self->YYData->{root};
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/PTF/PTFParser.yp b/arch/nios2nommu/scripts/PTF/PTFParser.yp
-new file mode 100644
-index 0000000..e105e6a
---- /dev/null
-+++ b/arch/nios2nommu/scripts/PTF/PTFParser.yp
-@@ -0,0 +1,178 @@
-+%{#
-+# Altera PTF file parser
-+#
-+# Copyright (c) 2004 Microtronix Datacom Ltd.
-+#
-+
-+package PTFParser;
-+
-+use PTF::PTFSection;
-+
-+%}
-+
-+%%
-+section: section_title '{' section_element '}' { 
-+                      my $sectionStack = $_[0]->YYData->{sectionStack};
-+                      pop @{$sectionStack}; 
-+              }
-+;
-+
-+section_title: IDENTIFIER section_name { 
-+                      my $section = PTFSection->new (type => $_[1], name => $_[2]); 
-+                      my $sectionStack = $_[0]->YYData->{sectionStack};
-+                      
-+                      if (scalar(@{$sectionStack}) == 0) {
-+                              $_[0]->YYData->{root} = $section;
-+                      } else {
-+                              my $parent = $sectionStack->[$#{$sectionStack}];
-+                              $parent->addSection ($section);
-+                      }
-+
-+                      push @{$sectionStack}, $section;
-+              }
-+;
-+
-+section_name: # empty string
-+      | IDENTIFIER 
-+      | NUMBER 
-+      | STRING_LITERAL 
-+;
-+
-+section_element: # empty element
-+      | assignment section_element
-+      | section section_element
-+;
-+
-+assignment: assignment_name '=' assignment_value ';' { 
-+                      my $sectionStack = $_[0]->YYData->{sectionStack};
-+                      my $parent= $sectionStack->[$#{$sectionStack}]; 
-+                      $parent->addAssignment ($_[1], $_[3]); 
-+              }
-+;
-+
-+assignment_name: IDENTIFIER
-+      | HIERARCHICAL_NAME 
-+;
-+
-+assignment_value: STRING_LITERAL
-+      | NUMBER 
-+;
-+
-+%%
-+
-+sub _Error {
-+# TODO: update this error function to be more useful
-+        exists $_[0]->YYData->{ERRMSG}
-+    and do {
-+        print $_[0]->YYData->{ERRMSG};
-+        delete $_[0]->YYData->{ERRMSG};
-+        return;
-+    };
-+    print "Syntax error on line $_[0]->YYData->{line}.\n";
-+}
-+
-+sub _Lexer {
-+      my($parser)=shift;
-+
-+      if (! $parser->YYData->{INPUT}) {
-+              if ($parser->YYData->{INPUT} = <PTFFILE>) {
-+                      $parser->YYData->{line} += 1;
-+              } else {
-+                      return ('', undef);
-+              }
-+      }
-+
-+      $parser->YYData->{INPUT} and
-+              $parser->YYData->{INPUT} =~ s/^\s*//;
-+
-+      while (1) {
-+              
-+              # skip blank lines
-+              if ($parser->YYData->{INPUT} =~ s/^[ \t\r\n]*$//) {
-+                      if ($parser->YYData->{INPUT} = <PTFFILE>) {
-+                              $parser->YYData->{line} += 1;
-+                      } else {
-+                              return ('', undef);
-+                      }
-+                      $parser->YYData->{INPUT} and
-+                              $parser->YYData->{INPUT} =~ s/^\s*//;
-+                      next;
-+              }       
-+              
-+              # Skip comments
-+              if ($parser->YYData->{INPUT} =~ s/^#.*//) {
-+                      if ($parser->YYData->{INPUT} = <PTFFILE>) {
-+                              $parser->YYData->{line} += 1;
-+                      } else {
-+                              return ('', undef);
-+                      }
-+                      $parser->YYData->{INPUT} and
-+                              $parser->YYData->{INPUT} =~ s/^\s*//;
-+                      next;
-+              }       
-+
-+              # Don't continue if the line length is 0;
-+              if (length $parser->YYData->{INPUT} == 0) {
-+                      if ($parser->YYData->{INPUT} = <PTFFILE>) {
-+                              $parser->YYData->{line} += 1;
-+                      } else {
-+                              return ('', undef);
-+                      }
-+                      $parser->YYData->{INPUT} and
-+                              $parser->YYData->{INPUT} =~ s/^\s*//;
-+                      next;
-+              }
-+
-+              # tokenize input
-+              $parser->YYData->{INPUT} =~ s/^([a-zA-Z_][a-zA-Z_0-9\/]*)//
-+                      and return('IDENTIFIER',$1);
-+              $parser->YYData->{INPUT} =~ s/^"([^"\\]*(\\.[^"\\]*)*)"//
-+                      and return('STRING_LITERAL',$1);
-+              $parser->YYData->{INPUT} =~ s/^"([^"\\]*(\\.[^"\\]*)*)//
-+                      and do {
-+                              my $literal = $1;
-+
-+                              do {
-+                                      if ($parser->YYData->{INPUT} = <PTFFILE>) {
-+                                              $parser->YYData->{line} += 1;
-+                                      } else {
-+                                              return ('', undef);
-+                                      }
-+
-+                                      $parser->YYData->{INPUT} =~ s/([^"\\]*(\\.[^"\\]*)*)"//
-+                                              and do {
-+                                                      $literal .= $1;
-+                                                      return ('STRING_LITERAL', $literal);
-+                                              };
-+
-+                                      $parser->YYData->{INPUT} =~ s/([^"\\]*(\\.[^"\\]*)*)// 
-+                                              and $literal .= $1;
-+                              } while (1);
-+                      };
-+              $parser->YYData->{INPUT} =~ s/^([0-9]+)//
-+                      and return('NUMBER',$1);
-+              $parser->YYData->{INPUT} =~ s/^([\$]{1,2}[a-zA-Z0-9 \/_]+)//
-+                      and return('HIERARCHICAL_NAME',$1);
-+              $parser->YYData->{INPUT} =~ s/^(.)//
-+                      and return($1,$1);
-+      }
-+}
-+
-+sub readPTF {
-+      my $self = shift;
-+      my $filename = shift;
-+
-+      # store information for later use
-+      $self->YYData->{line} = 0;
-+      $self->YYData->{sectionStack} = [];
-+      undef $self->YYData->{root};
-+      
-+      open (PTFFILE, $filename) or return undef;
-+      $self->YYParse (
-+              yylex => \&_Lexer,
-+              yyerror => \&_Error,
-+              );
-+      close PTFFILE;
-+
-+      return $self->YYData->{root};
-+}
-diff --git a/arch/nios2nommu/scripts/PTF/PTFSection.pm b/arch/nios2nommu/scripts/PTF/PTFSection.pm
-new file mode 100644
-index 0000000..a88d340
---- /dev/null
-+++ b/arch/nios2nommu/scripts/PTF/PTFSection.pm
-@@ -0,0 +1,81 @@
-+package PTFSection;
-+
-+use strict;
-+
-+# Fields:
-+#  type = type of PTF Section
-+#  name = name of PTF Section (can be blank)
-+#  sections = array of section references
-+#  assignments = hash of assignments
-+
-+sub new {
-+      my $invocant = shift;
-+      my $class = ref($invocant) || $invocant;
-+      my $self = {
-+              @_,
-+              sections => [],
-+              assignments => {},
-+      };
-+      bless ($self, $class);
-+      return $self;
-+}
-+
-+sub addSection {
-+      my ($self, $section) = @_;
-+      push @{$self->{sections}}, $section;
-+}
-+
-+sub getSections {
-+      my ($self, $type) = @_;
-+      
-+      if (! $type) {
-+              return @{$self->{sections}};
-+      }
-+      
-+      my @matchedSections;
-+      foreach my $section (@{$self->{sections}}) {
-+              if ($section->type eq $type) {
-+                      push @matchedSections, $section;
-+              }
-+      }
-+      
-+      return @matchedSections;
-+}
-+
-+sub getSection {
-+      my ($self, $type, $name) = @_;
-+      
-+      if (! $name) {
-+              $name = "";
-+      }
-+      
-+      foreach my $section (@{$self->{sections}}) {
-+              if ($section->type eq $type and $section->name eq $name) {
-+                      return $section;
-+              }
-+      }
-+
-+}
-+
-+sub addAssignment {
-+      my ($self, $name, $value) = @_;
-+      $self->{assignments}{$name} = $value;
-+}
-+
-+sub getAssignment {
-+      my ($self, $name) = @_;
-+      return $self->{assignments}{$name};
-+}
-+
-+sub type {
-+      my $self = shift;
-+      return $self->{type};
-+}
-+
-+sub name {
-+      my $self = shift;
-+      return $self->{name};
-+}
-+
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/PTF/SystemPTF.pm b/arch/nios2nommu/scripts/PTF/SystemPTF.pm
-new file mode 100644
-index 0000000..9f44cfe
---- /dev/null
-+++ b/arch/nios2nommu/scripts/PTF/SystemPTF.pm
-@@ -0,0 +1,149 @@
-+package SystemPTF;
-+
-+use strict;
-+
-+use PTF::PTFParser;
-+use PTF::PTFSection;
-+use PTF::SystemPTF::CPU;
-+use PTF::SystemPTF::Board;
-+use PTF::SystemPTF::Module;
-+
-+# Fields:
-+
-+my %module_order;
-+
-+sub new {
-+      my $invocant = shift;
-+      my $class = ref($invocant) || $invocant;
-+      my $self = {
-+              filename => "",
-+              @_,
-+      };
-+      
-+      my $parser = PTFParser->new;
-+      $self->{root} = $parser->readPTF($self->{filename});
-+
-+      # if the specified PTF file could not be read properly, return undef;
-+      $self->{root} or return;
-+      
-+      # if the specified PTF file is not a SYSTEM, return undef.
-+      if ($self->{root}->type ne 'SYSTEM') {
-+              return;
-+      }
-+      
-+      # initialize the modulemap
-+      my @modules = $self->{root}->getSections ("MODULE");
-+      my $index = 0;
-+      foreach my $module (@modules) {
-+              # if the module is not enabled then do not add
-+              my $SBI = $module->getSection ('SYSTEM_BUILDER_INFO', '');
-+              if ($SBI->getAssignment ('Is_Enabled') eq "1") {
-+                      $self->{modules}->{$module->name} = $module;
-+                      $module_order{$module->name} = $index;
-+                      $index += 1;
-+              }
-+      }
-+
-+      bless ($self, $class);
-+      return $self;
-+}
-+
-+sub getName {
-+      my ($self) = @_;
-+      return $self->{root}->name;
-+}
-+
-+sub getCPUList {
-+      my ($self, @classes) = @_;
-+      my @cpulist = ();
-+      
-+      foreach my $module_name (keys (%{$self->{modules}})) {
-+              my $module = $self->{modules}->{$module_name};
-+              my $module_class = $module->getAssignment ('class');
-+              foreach my $class (@classes) {
-+                      if ($module_class eq $class) {
-+                              push @cpulist, $module->name;
-+                      }
-+              }
-+      }
-+      
-+      return @cpulist;
-+}
-+
-+sub getCPU {
-+      my ($self, $name) = @_;
-+      
-+      my $cpu = CPU->new (ptf => $self->{modules}->{$name});
-+}
-+
-+sub getModule {
-+      my ($self, $name) = @_;
-+      
-+      my $module = Module->new (ptf => $self->{modules}->{$name});
-+}
-+
-+sub getSlaveModules {
-+      my ($self, $master, $type) = @_;
-+      
-+      # create %connected set with just the master
-+      # value of hash key is inconsequential
-+      my %connected;
-+      $connected{$master} = ( );
-+      
-+      # create %pool set with all modules
-+      # value of hash key is inconsequential
-+      my %pool;
-+      @pool{keys (%{$self->{modules}})} = ( );
-+      
-+      my $dirty = 1;
-+      while ($dirty) {
-+              # %pool = difference (%pool, %connected)
-+              delete @pool{ keys %connected };
-+              
-+              $dirty = 0;
-+              
-+              foreach my $name (keys %pool) {
-+                      my $mod = $self->getModule ($name);
-+                      my %mod_masters;
-+                      @mod_masters{ $mod->getMasters ($type) } = ( );
-+                      
-+                      # if intersection (%masters, %connected) is not empty
-+                      delete @mod_masters{
-+                              grep ( ! exists $connected{ $_ },
-+                                      keys %mod_masters) };
-+                      
-+                      if (scalar(keys(%mod_masters)) > 0) {
-+                              $connected{$name} = ( );
-+                              $dirty = 1;
-+                      }
-+              }
-+      }
-+      
-+      delete $connected{$master};
-+
-+      return sort module_comparison keys (%connected); 
-+}
-+
-+sub getClockFreq () {
-+      my ($self) = @_;
-+      
-+      my $wsa = $self->{root}->getSection ('WIZARD_SCRIPT_ARGUMENTS', '');
-+      $wsa or return;
-+      
-+      my $result = $wsa->getAssignment ('clock_freq');
-+      return $result;
-+}
-+
-+# This is not really a class method... more of a helper function really...
-+sub module_comparison {
-+      if ($module_order{$a} > $module_order{$b}) {
-+              return 1;
-+      } elsif ($module_order{$a} < $module_order{$b}) {
-+              return -1;
-+      } else {
-+              return 0;
-+      }
-+}
-+
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/PTF/SystemPTF/Board.pm b/arch/nios2nommu/scripts/PTF/SystemPTF/Board.pm
-new file mode 100644
-index 0000000..fe2bbc8
---- /dev/null
-+++ b/arch/nios2nommu/scripts/PTF/SystemPTF/Board.pm
-@@ -0,0 +1,2 @@
-+1;
-+
-diff --git a/arch/nios2nommu/scripts/PTF/SystemPTF/CPU.pm b/arch/nios2nommu/scripts/PTF/SystemPTF/CPU.pm
-new file mode 100644
-index 0000000..ea10598
---- /dev/null
-+++ b/arch/nios2nommu/scripts/PTF/SystemPTF/CPU.pm
-@@ -0,0 +1,89 @@
-+package CPU;
-+
-+use PTF::PTFSection;
-+
-+sub new {
-+    my $invocant = shift;
-+    my $class = ref($invocant) || $invocant;
-+    my $self = {
-+              @_,
-+    };
-+      
-+    # if no ptf section was passed in, then return undef
-+    $self->{ptf} or return;
-+
-+    bless ($self, $class);
-+    return $self;
-+}
-+
-+sub getClass {
-+      my ($self) = @_;
-+      
-+      return $self->{ptf}->getAssignment ('class');
-+}
-+
-+sub getVersion {
-+      my ($self) = @_;
-+      
-+      return $self->{ptf}->getAssignment ('class_version');
-+}
-+
-+sub getConstant {
-+      my ($self, $name) = @_;
-+      
-+      # get WSA
-+      $wsa = $self->{ptf}->getSection('WIZARD_SCRIPT_ARGUMENTS', '');
-+      $wsa or return;
-+      
-+      # get constants section
-+      $constants = $wsa->getSection('CONSTANTS', '');
-+      $constants or return;
-+      
-+      # get section for specific constant
-+      $constant = $constants->getSection ('CONSTANT', $name);
-+      $constant or return;
-+      
-+      # get value of constant
-+      $value = $constant->getAssignment ('value');
-+      return $value;
-+}
-+
-+sub getWSAAssignment {
-+      my ($self, $name) = @_;
-+
-+      # get WSA
-+      $wsa = $self->{ptf}->getSection('WIZARD_SCRIPT_ARGUMENTS', '');
-+      $wsa or return;
-+
-+      # get value of WSA Assignment
-+      $value = $wsa->getAssignment ($name);
-+      return $value;
-+}
-+
-+sub getResetLocationOffset {
-+      my ($self) = @_;
-+      
-+      $wsa = $self->{ptf}->getSection('WIZARD_SCRIPT_ARGUMENTS', '');
-+      $wsa or return;
-+      
-+      my $location = $wsa->getAssignment ('reset_slave');
-+      my $offset = $wsa->getAssignment ('reset_offset');
-+      
-+      return ($location, $offset);
-+}
-+
-+sub isEnabled {
-+      my ($self) = @_;
-+      
-+      $sbi = $self->{ptf}->getSection('SYSTEM_BUILDER_INFO', '');
-+      $sbi or return;
-+      
-+      my $enabled = $sbi->getAssignment ('Is_Enabled');
-+      if ($enabled eq "1") {
-+              return 1;
-+      } else {
-+              return 0;
-+      }
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/PTF/SystemPTF/Module.pm b/arch/nios2nommu/scripts/PTF/SystemPTF/Module.pm
-new file mode 100644
-index 0000000..48d246b
---- /dev/null
-+++ b/arch/nios2nommu/scripts/PTF/SystemPTF/Module.pm
-@@ -0,0 +1,267 @@
-+package Module;
-+
-+use PTF::PTFSection;
-+
-+sub new {
-+    my $invocant = shift;
-+    my $class = ref($invocant) || $invocant;
-+    my $self = {
-+      @_,
-+    };
-+    
-+    # if no ptf section was passed in, then return undef
-+    $self->{ptf} or return;
-+
-+    bless ($self, $class);
-+    return $self;
-+}
-+
-+sub getClass {
-+      my ($self) = @_;
-+      
-+      return $self->{ptf}->getAssignment ('class');
-+}
-+
-+sub getPorts {
-+      my ($self) = @_;
-+      
-+      my @port_names;
-+      
-+      my @ports = $self->{ptf}->getSections ('SLAVE');
-+      foreach $port (@ports) {
-+              push @port_names, $port->name;
-+      }
-+
-+      return @port_names;
-+}
-+
-+sub getPort {
-+      my ($self, $port_name) = @_;
-+      
-+      my $port;
-+
-+      if (! $port_name) {
-+              # use first port found
-+              my @port_names = $self->getPorts ();
-+              $port = $self->{ptf}->getSection ('SLAVE', $port_names[0]);
-+      } else {
-+              $port = $self->{ptf}->getSection ('SLAVE', $port_name);
-+              if (! $port) {
-+                      # return undef if the PTF section doesn't exist
-+                      return;
-+              }
-+      }
-+      
-+      return $port;
-+}
-+
-+sub getWSAAssignment {
-+      my ($self, $assignment) = @_;
-+      
-+      my $WSA = $self->{ptf}->getSection ('WIZARD_SCRIPT_ARGUMENTS', '');
-+      if (! $WSA) {
-+              # return undef if the WSA section doesn't exist.
-+              return;
-+      }
-+      
-+      my $result = $WSA->getAssignment ($assignment);
-+      
-+      return $result;
-+      
-+}
-+
-+sub getWSAConstant {
-+      my ($self, $name) = @_;
-+      
-+      my $WSA = $self->{ptf}->getSection ('WIZARD_SCRIPT_ARGUMENTS', '');
-+      if (! $WSA) {
-+              # return undef if the WSA section doesn't exist.
-+              return;
-+      }
-+      
-+      my $constants = $WSA->getSection ('CONSTANTS', '');
-+      if (! $constants) {
-+              # return undef if the CONSTANTS section doesn't exist.
-+              return;
-+      }
-+      
-+      my $constant = $constants->getSection ('CONSTANT', $name);
-+      if (! $constant) {
-+              # return undef if the CONSTANT $name section doesn't exist.
-+              return;
-+      }
-+      
-+      my $result = $constant->getAssignment ('value');
-+      return $result;
-+      
-+}
-+
-+sub isMemoryDevice {
-+      my ($self, $port_name) = @_;
-+      
-+      my $port = $self->getPort ($port_name);
-+      if (! $port) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $SBI = $port->getSection('SYSTEM_BUILDER_INFO', '');
-+      if (! $SBI) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $result = $SBI->getAssignment('Is_Memory_Device');
-+      
-+      return $result;
-+}
-+
-+sub isCustomInstruction {
-+      my ($self, $port_name) = @_;
-+      
-+      my $port = $self->getPort ($port_name);
-+      if (! $port) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $SBI = $port->getSection('SYSTEM_BUILDER_INFO', '');
-+      if (! $SBI) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $result = $SBI->getAssignment('Is_Custom_Instruction');
-+      
-+      return $result;
-+}
-+
-+sub getBaseAddress {
-+      my ($self, $port_name) = @_;
-+      
-+      my $port = $self->getPort ($port_name);
-+      if (! $port) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $SBI = $port->getSection('SYSTEM_BUILDER_INFO', '');
-+      if (! $SBI) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $result = $SBI->getAssignment('Base_Address');
-+      if ($result eq 'N/A') {
-+              return;
-+      }
-+      return $result;
-+}
-+
-+sub getSize {
-+      my ($self, $port_name) = @_;
-+      
-+      my $port = $self->getPort ($port_name);
-+      $port or return;  #return undef if the ptf section doesn't exist
-+      
-+      my $SBI = $port->getSection ('SYSTEM_BUILDER_INFO', '');
-+      my $data_width = $SBI->getAssignment ('Data_Width');
-+      my $addr_width = $SBI->getAssignment ('Address_Width');
-+      
-+      if ($data_width == 8) {
-+              $size = 1 << $addr_width;
-+      } elsif ($data_width == 16) {
-+              $size = 1 << ($addr_width + 1);
-+      } elsif ($data_width == 32) {
-+              $size = 1 << ($addr_width + 2);
-+      } elsif ($data_width == 64) {
-+              $size = 1 << ($addr_width + 3);
-+      } elsif ($data_width == 128) {
-+              $size = 1 << ($addr_width + 4);
-+      } else {
-+              return;
-+      }
-+      
-+      $size_text = sprintf ("%#010x", $size);
-+      return $size_text;
-+}
-+
-+sub getIRQ {
-+      my ($self, $port_name) = @_;
-+      
-+      my $port = $self->getPort ($port_name);
-+      if (! $port) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $SBI = $port->getSection('SYSTEM_BUILDER_INFO', '');
-+      if (! $SBI) {
-+              # return undef if the PTF section doesn't exist
-+              return;
-+      }
-+      
-+      my $result = $SBI->getAssignment('Has_IRQ');
-+      if ($result ne "1") {
-+              # this device has no associated IRQ
-+              return;
-+      }
-+      
-+      my @irq_masters = $SBI->getSections('IRQ_MASTER');
-+      return $irq_masters[0]->getAssignment('IRQ_Number');
-+}
-+
-+sub getMasters {
-+      my ($self, $type) = @_;
-+      my %masters = ();
-+      
-+      # get list of all slave for device
-+      my @slaves = $self->{ptf}->getSections ('SLAVE');
-+      
-+      # get list of masters of relevant type for all slaves
-+      foreach my $slave (@slaves) {
-+              # get SBI for slave
-+              my $SBI = $slave->getSection ('SYSTEM_BUILDER_INFO', '');
-+              
-+              # get list of all MASTERED_BY and IRQ_MASTER sections
-+              my @mastered_bys = $SBI->getSections ('MASTERED_BY');
-+              my @irq_masters = $SBI->getSections ('IRQ_MASTER');
-+              
-+              # start adding masters to the list
-+              foreach my $master (@mastered_bys, @irq_masters) {
-+                      my $section_name = $master->name;
-+                      $section_name =~ /(.*)\/(.*)/;
-+                      my $master_name = $1;
-+                      my $master_type = $2;
-+
-+                      if (! $type) {
-+                              $masters{$master_name} = ();
-+                      } else {
-+                              if ($master_type eq $type) {
-+                                      $masters{$master_name} = ();
-+                              }
-+                      }
-+                      
-+              }
-+              
-+      }
-+      
-+      return keys (%masters);
-+}
-+
-+sub isEnabled {
-+      my ($self) = @_;
-+      
-+      $sbi = $self->{ptf}->getSection('SYSTEM_BUILDER_INFO', '');
-+      $sbi or return;
-+      
-+      my $enabled = $sbi->getAssignment ('Is_Enabled');
-+      if ($enabled eq "1") {
-+              return 1;
-+      } else {
-+              return 0;
-+      }
-+}
-+
-+1;
-+
-diff --git a/arch/nios2nommu/scripts/gen_nios2_system.h.pl b/arch/nios2nommu/scripts/gen_nios2_system.h.pl
-new file mode 100644
-index 0000000..b7bcff5
---- /dev/null
-+++ b/arch/nios2nommu/scripts/gen_nios2_system.h.pl
-@@ -0,0 +1,314 @@
-+# This script generates an appropriate hardware.h file for Nios II Linux based
-+# on information within the target hardware's system.ptf file.  This script
-+# outputs everything to stdout.
-+#
-+# usage:
-+#
-+#  [SOPC Builder]$ perl gen_hardware.h.pl <target cpu> <exec location> \
-+#                    <upload location>
-+#
-+
-+use PTF::SystemPTF;
-+use strict;
-+use integer;
-+
-+my $target_cpu;
-+my $exec_location;
-+my $upload_location;
-+
-+if (scalar (@ARGV) != 3) {
-+      print STDERR "ERROR: Invalid number of parameters.\n";
-+      print ("#error Invalid number of parameters.\n");
-+      exit;
-+} else {
-+      $target_cpu = $ARGV[0];
-+      $exec_location = $ARGV[1];
-+      $upload_location = $ARGV[2];
-+}
-+
-+#
-+# startup the parser.
-+#
-+my $system = SystemPTF->new;
-+if (!$system) {
-+      print STDERR "ERROR: Specified file is not a SYSTEM ptf file.\n";
-+      print ("#error Specified file is not a SYSTEM ptf file.\n");
-+      exit;
-+}
-+
-+#
-+# print header for nios2_system.h
-+#
-+print <<ENDOFHEADER;
-+#ifndef __NIOS2_SYSTEM_H__
-+#define __NIOS2_SYSTEM_H__
-+
-+/*
-+ * This file contains hardware information about the target platform.
-+ * The nios2_system.h file is being phased out and will be removed in a 
-+ * later release.
-+ *
-+ * All base addresses for non memory devices have their high bit turned on to
-+ * bypass the cache.
-+ *
-+ * This file is automatically generated.  Do not modify.
-+ */
-+   
-+ENDOFHEADER
-+
-+#
-+# generate contents for nios2_system.h
-+#
-+my $result; # dummy variable
-+my $cpu = $system->getCPU ($target_cpu);
-+if (! $cpu) {
-+      print STDERR "ERROR: $target_cpu is not a valid CPU in system: " . $system->getName () . ".\n";
-+      print "#error $target_cpu is not a valid CPU in system: " . $system->getName () . ".\n";
-+      exit 1;
-+}
-+
-+my $exec_module = $system->getModule ($exec_location);
-+if (! $exec_module) {
-+      print STDERR "ERROR: $exec_location is not a valid module in the system: " . $system->getName() . ".\n";
-+      print "#error $exec_location is not a valid module in system: " . $system->getName () . ".\n";
-+      exit 1;
-+}
-+
-+my $upload_module = $system->getModule ($upload_location);
-+if (! $upload_module) {
-+      print STDERR "ERROR: $upload_location is not a valid module in the system: " . $system->getName() . ".\n";
-+      print "#error $upload_location is not a valid module in system: " . $system->getName () . ".\n";
-+      exit 1;
-+}
-+
-+my %found_classes;
-+my @found_classes_order;
-+
-+# the SYSPTF environment variable is set by kernel build process.
-+if ($ENV{SYSPTF} ne "") {
-+      print "/* Input System: " . $ENV{SYSPTF} .  ":" . $system->getName () . " */\n";
-+} else {
-+      print "/* Input System: " . $system->getName () . " */\n";
-+}
-+print "/* Target CPU: " . $target_cpu . " */\n";
-+
-+print "\n";
-+
-+print <<ENDOFCONSTANTS;
-+/* Nios II Constants */
-+#define NIOS2_STATUS_PIE_MSK  0x1
-+#define NIOS2_STATUS_PIE_OFST 0
-+#define NIOS2_STATUS_U_MSK    0x2
-+#define NIOS2_STATUS_U_OFST   1
-+ENDOFCONSTANTS
-+
-+print "\n";
-+
-+print "/*\n";
-+print " * Outputting basic values from system.ptf.\n";
-+print " */\n\n";
-+
-+#
-+# Start outputing information about each module.
-+#
-+my @module_names = $system->getSlaveModules ($target_cpu);
-+foreach my $module_name (@module_names) {
-+      my $module = $system->getModule ($module_name);
-+      my $module_class = $module->getClass ();
-+      my @module_ports = $module->getPorts ();
-+      my $mask = 0;
-+      my $text_printed = 0;
-+      my $output = "";
-+
-+      # $output .= "/* $module_name (of type $module_class) */\n";
-+
-+      if (! exists $found_classes{$module_class}) {
-+              push @found_classes_order, $module_class;
-+      }
-+      push @{$found_classes{$module_class}}, $module_name;
-+      
-+      if (! $module->isMemoryDevice () && ! $module->isCustomInstruction ()) {
-+              # turn on high bit for base address
-+              $mask = 0x80000000;
-+      }
-+
-+      if (scalar (@module_ports) == 1) {
-+              my $base_address;
-+              my $mem_size;
-+              my $mem_end;
-+              
-+              # base address information 
-+              $base_address = $module->getBaseAddress ();
-+              if ($base_address) {
-+                      $output .= sprintf ("#define na_%-50s %#010x\n", 
-+                              ($module_name, hex ($base_address) | $mask));
-+                      $text_printed = 1;
-+              }
-+              if ($module->isMemoryDevice()) {
-+                      # output size and end address
-+                      $mem_size = $module->getSize();
-+                      $output .= sprintf ("#define na_%-50s %#010x\n",
-+                              ($module_name . "_size", hex ($mem_size)));
-+                      $mem_end = hex ($mem_size) + hex($base_address);
-+                      $output .= sprintf ("#define na_%-50s %#010x\n",
-+                              ($module_name . "_end", $mem_end));
-+
-+                      $text_printed = 1;
-+              }
-+
-+              # irq information 
-+              $result = $module->getIRQ ();
-+              if (defined ($result)) {
-+                      $output .= sprintf ("#define na_%-30s %30s\n", 
-+                              ($module_name . "_irq", $result));
-+                      $text_printed = 1;
-+              }
-+
-+      } else {
-+              # if device has multiple ports
-+              foreach my $port_name (@module_ports) {
-+                      # base address information
-+                      $result = $module->getBaseAddress ($port_name);
-+                      if ($result) {
-+                      $output .= sprintf ("#define na_%-50s %#010x\n", 
-+                              ($module_name . "_" . $port_name, hex ($result) | $mask));
-+                              $text_printed = 1;
-+                      }
-+
-+                      # irq information
-+                      $result = $module->getIRQ ($port_name);
-+                      if (defined ($result)) {
-+                      $output .= sprintf ("#define na_%-30s %30s\n", 
-+                              ($module_name . "_" . $port_name . "_irq", $result));
-+                              $text_printed = 1;
-+                      }
-+              }
-+      }
-+
-+      if ($text_printed == 1) {
-+              # $output .= "\n";
-+              print $output;
-+      }
-+}
-+
-+print "\n";
-+
-+#
-+# Handle special cases through customized perl scripts
-+#
-+foreach my $class_name (@found_classes_order) {
-+      my $code = "";
-+      
-+      foreach my $dir (@INC) {
-+              if (-e "$dir/nios2_system.h/$class_name.pm") {
-+                      print "/* Executing ...scripts/nios2_system.h/$class_name.pm */\n";
-+                      $code .= "require \"$dir/nios2_system.h/BasicModule.pm\";";
-+                      $code .= "require \"$dir/nios2_system.h/$class_name.pm\";";
-+                      $code .= $class_name . "::run(\$system, \@{\$found_classes{\$class_name}});";
-+                      eval $code;
-+                      if ($@) {
-+                              print "#warning Could not execute ...scripts/nios2_system.h/$class_name.pm\n";
-+                              print "#warning Error message is stored in nios2_system.h:\n";
-+                              print "/*\n";
-+                              print "$@";
-+                              print "*/\n";
-+                              print STDERR "Could not execute ...scripts/nios2_system.h/$class_name.pm\n";
-+                              print STDERR "Error message follows:\n";
-+                              print STDERR "$@";
-+                      } 
-+                      last;
-+              }
-+      }
-+}
-+
-+#
-+# Write out system information
-+#
-+print "/*\n";
-+print " * Basic System Information\n";
-+print " */\n";
-+
-+$result = $cpu->getWSAAssignment ('cache_icache_size');
-+printf ("#define %-53s %10d\n", ("nasys_icache_size", $result));
-+
-+$result = $cpu->getConstant ('nasys_icache_line_size');
-+printf ("#define %-53s %10d\n", ("nasys_icache_line_size", $result));
-+
-+$result = $cpu->getWSAAssignment ('cache_dcache_size');
-+printf ("#define %-53s %10d\n", ("nasys_dcache_size", $result));
-+
-+$result = $cpu->getConstant ('nasys_dcache_line_size');
-+printf ("#define %-53s %10d\n", ("nasys_dcache_line_size", $result));
-+
-+print "\n";
-+
-+printf ("#define %-33s %30s\n", 
-+      ("nasys_program_mem", "na_${exec_location}"));
-+printf ("#define %-33s %30s\n", 
-+      ("nasys_program_mem_size", "na_${exec_location}_size"));
-+printf ("#define %-33s %30s\n", 
-+      ("nasys_program_mem_end", "na_${exec_location}_end"));
-+      
-+print "\n";
-+
-+if ($upload_location eq "flash_kernel") {
-+      # nothing to do
-+      print ("/* Redefinition of CFI flash memory unecessary */\n");
-+} else {
-+      my $module = $system->getModule ("flash_kernel");
-+      if ($module) {
-+              # there is a conflicting module in the system, error.
-+              print STDERR "Error, a SOPC module named flash_kernel already exists but is not the upload location.\n";
-+              print "#error The module name \"flash_kernel\" already exists but isn't the upload location.\n";
-+              print "#error This will break the kernel.\n";
-+              print "#error Please rename the module to something else in SOPC Builder.\n\n";
-+              exit 1;
-+      } else {
-+              print ("/*\n");
-+              print (" * Redefining upload location ($upload_location) to flash_kernel.\n");
-+              print (" */\n\n");
-+              # undefine the original module names and re-define them here.
-+              print ("#undef  na_${upload_location}\n");
-+              print ("#undef  na_${upload_location}_size\n");
-+              print ("#undef  na_${upload_location}_end\n");
-+              
-+              my $base_address = $upload_module->getBaseAddress ();
-+              printf ("#define %-33s %30s\n",
-+                      ("na_flash_kernel", $base_address));
-+                      
-+              my $mem_size = $upload_module->getSize();
-+              printf ("#define %-33s %30s\n",
-+                      ("na_flash_kernel_size", $mem_size));
-+                      
-+              my $mem_end = hex ($base_address) + hex ($mem_size);
-+              printf ("#define %-53s %#010x\n",
-+                      ("na_flash_kernel_end", $mem_end));
-+      }
-+}
-+
-+print "\n";
-+
-+printf ("#define %-33s %30s\n", 
-+      ("nasys_clock_freq", $system->getClockFreq()));
-+printf ("#define %-33s %30s\n", 
-+      ("nasys_clock_freq_1000", int ($system->getClockFreq()) / 1000));
-+      
-+{     
-+      my ($reset_location, $reset_offset) = $cpu->getResetLocationOffset();
-+      my ($reset_module_name, $reset_port_name) = ($reset_location =~ /(.*)\/(.*)/);
-+      my $reset_module = $system->getModule ($reset_module_name);
-+      my $reset_address = $reset_module->getBaseAddress ($reset_port_name);
-+      
-+      $reset_address = hex ($reset_address) + hex ($reset_offset);
-+      printf ("#define %-53s %#010x\n", 
-+              ("CPU_RESET_ADDRESS", $reset_address));
-+}
-+
-+print "\n";
-+
-+#
-+# print footer for nios2_system.h
-+#
-+print <<ENDOFFOOTER;
-+#endif /* __NIOS2_SYSTEM_H__ */
-+ENDOFFOOTER
-diff --git a/arch/nios2nommu/scripts/hwselect.pl b/arch/nios2nommu/scripts/hwselect.pl
-new file mode 100644
-index 0000000..8181bee
---- /dev/null
-+++ b/arch/nios2nommu/scripts/hwselect.pl
-@@ -0,0 +1,166 @@
-+# This script generates arch/nios2nommu/hardware.mk based on user input
-+
-+# usage:
-+#
-+#  [SOPC Builder]$ perl hwselect.pl <ptf file path> <target file path>
-+#
-+
-+use PTF::SystemPTF;
-+use strict;
-+use integer;
-+
-+my $ptf_filename;
-+my $target_filename;
-+my $index;
-+my $system;
-+
-+#
-+# Subroutine: Prompt user for an answer
-+#
-+
-+sub request_answer {
-+      my ($min, $max) = @_;
-+      my $answer;
-+
-+      do {
-+              print "Selection: ";
-+              $answer = <STDIN>;
-+              if (! ($answer >= $min && $answer <= $max)) {
-+                      print "Invalid response, please try again.\n";
-+              }
-+      } until $answer >= $min && $answer <= $max;
-+
-+      return $answer;
-+}
-+
-+#
-+# Check for correct number of args
-+#
-+
-+if (scalar (@ARGV) != 2) {
-+      print STDERR "ERROR: Invalid number of parameters.\n";
-+      exit;
-+} else {
-+      $ptf_filename = $ARGV[0];
-+      $target_filename = $ARGV[1];
-+}
-+
-+#
-+# Check to see if the specified file exists
-+#
-+
-+if (! -e $ptf_filename) {
-+      print STDERR "ERROR: Could not open SYSTEM ptf file.\n";
-+      exit;
-+}
-+
-+#
-+# startup the parser.
-+#
-+$system = SystemPTF->new (filename => $ptf_filename);
-+if (!$system) {
-+      print STDERR "ERROR: Specified file is not a SYSTEM ptf file.\n";
-+      exit;
-+}
-+
-+#
-+# Grab listing of Nios II processors and force user to select one:
-+# 
-+
-+print "\n--- Please select which CPU you wish to build the kernel against:\n\n";
-+
-+my @cpulist = $system->getCPUList ('altera_nios2');
-+my %cpuinfo;
-+
-+$index = 1;
-+foreach my $cpu (@cpulist) {
-+      my $cpu_module = $system->getCPU ($cpu);
-+      if ($cpu_module->isEnabled ()) {
-+              my $class = $cpu_module->getClass();
-+              my $type = $cpu_module->getWSAAssignment('cpu_selection');
-+              my $version = $cpu_module->getVersion();
-+
-+              print "($index) $cpu - Class: $class Type: $type Version: $version\n";
-+      }
-+      $index += 1;
-+}
-+
-+print "\n";
-+
-+my $cpu_selection = $cpulist[request_answer (1, $index - 1) - 1];
-+
-+#
-+# Grab list of memory devices that $cpu_selection is hooked up to:
-+#
-+my @modulelist = $system->getSlaveModules ($cpu_selection);
-+my %cfiinfo;
-+my %meminfo;
-+foreach my $module_name (@modulelist) {
-+      my $module = $system->getModule ($module_name);
-+      my $class = $module->getClass ();
-+
-+      if ($module->isEnabled ()) {    
-+              if ($class eq 'altera_avalon_cfi_flash') {
-+                      $cfiinfo{$module_name}{class} = $class;
-+                      $cfiinfo{$module_name}{size} = $module->getSize();
-+              } 
-+
-+              if ($module->isMemoryDevice()) {
-+                      $meminfo{$module_name}{class} = $class;
-+                      $meminfo{$module_name}{size} = $module->getSize();
-+              }
-+      }
-+}
-+
-+#
-+# Select an upload device:
-+#
-+print "\n--- Please select a device to upload the kernel to:\n\n";
-+
-+$index = 1;
-+foreach my $name (keys (%cfiinfo)) {
-+      my $size = hex ($cfiinfo{$name}{size});
-+      print "($index) $name\n\tClass: $cfiinfo{$name}{class}\n\tSize: $size bytes\n\n";
-+      $index += 1;
-+}
-+
-+my @cfilist = keys (%cfiinfo);
-+my $cfi_selected = $cfilist[request_answer (1, $index - 1) - 1];
-+
-+delete $meminfo{$cfi_selected};
-+
-+#
-+# Select program memory to execute kernel from:
-+# 
-+print "\n--- Please select a device to execute kernel from:\n\n";
-+
-+$index = 1;
-+foreach my $name (keys (%meminfo)) {
-+      my $size = hex ($meminfo{$name}{size});
-+      print "($index) $name\n\tClass: $meminfo{$name}{class}\n\tSize: $size bytes\n\n";
-+      $index += 1;
-+}
-+
-+my @memlist = keys (%meminfo);
-+my $mem_selected = $memlist[request_answer (1, $index - 1) - 1];
-+
-+print "\n--- Summary using\n\n";
-+print "PTF: $ptf_filename\n";
-+print "CPU:                            $cpu_selection\n";
-+print "Device to upload to:            $cfi_selected\n";
-+print "Program memory to execute from: $mem_selected\n";
-+
-+#
-+# Write settings out to Makefile fragment
-+#
-+open (HWMK, ">$target_filename") ||
-+      die "Could not write to $target_filename";
-+
-+print HWMK "SYSPTF = $ptf_filename\n";
-+print HWMK "CPU = $cpu_selection\n";
-+print HWMK "UPLMEM = $cfi_selected\n";
-+print HWMK "EXEMEM = $mem_selected\n";
-+
-+close (HWMK);
-+
-+print "\n--- Settings written to $target_filename\n\n";
-\ No newline at end of file
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/BasicModule.pm b/arch/nios2nommu/scripts/nios2_system.h/BasicModule.pm
-new file mode 100644
-index 0000000..e15c26b
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/BasicModule.pm
-@@ -0,0 +1,267 @@
-+package BasicModule;
-+
-+require PTF::SystemPTF;
-+require PTF::SystemPTF::Module;
-+use strict;
-+
-+# Description: Prints an error message to stdout.  This should prefix each line
-+#              with "#error " so that it can be properly read by the C 
-+#              pre-processor.
-+# Args: $module_name: name of module that was is required by driver
-+#       $class_name: name of device class that module belongs to.
-+sub print_error_name_used {
-+      my ($class, $module_name, $class_name) = @_;
-+
-+      print "#error The kernel requires that the $class->required_class_name device be named as $module_name.\n";
-+      print "#error The current hardware has $module_name defined as a(n) $class_name device.\n";
-+      print "#error This will cause the kernel to fail.\n";
-+      print "#error Please rename the current $module_name device to something else in SOPC Builder.\n";
-+}
-+
-+# Description: This casts the base address to a specific data type
-+#              By default, it does not cast the base address to
-+#              anything.
-+sub base_address_cast {
-+      my ($class, $port_name) = @_;
-+      return;
-+}
-+
-+# Description: This sub-routine prints out a prefix that is shown only once
-+#              before any translations take place.
-+sub print_prefix {
-+      my ($class, $system) = @_;
-+      printf ("\n");
-+}
-+
-+# Description: Prints a set of lines to stdout that re-defines all symbols
-+#              related to $module_name to the symbols required by the driver.
-+#              Typically starts off with "#undefine ..." statements followed
-+#              by one or more "#define statements".
-+# Args: $required_module_name: the module name that's expected by the kernel.
-+#       $module_name: the name of the module that was found in the PTF file.
-+sub translate {
-+      my ($class, $system, $required_module_name, $module_name) = @_;
-+      
-+      # get the necessary info about the module
-+      my $module = $system->getModule ($module_name);
-+      my @port_names = $module->getPorts ();
-+      
-+      my $boolean_base_address_cast = 0;
-+      if (scalar (@port_names) > 1) {
-+              foreach my $port_name (@port_names) {
-+                      my $cast = $class->base_address_cast ($port_name);
-+                      if (defined ($cast)) {
-+                              $boolean_base_address_cast = 1;
-+                              last;
-+                      }
-+              }
-+      } else {
-+              my $cast = $class->base_address_cast;
-+              if (defined ($cast)) {
-+                      $boolean_base_address_cast = 1;
-+              }
-+      }
-+
-+      if ($module_name eq $required_module_name && 
-+                      !$boolean_base_address_cast) {
-+              printf ("/* No translation necessary for $module_name */\n\n");
-+              return;
-+      }
-+
-+      # undefine the original entries
-+      print "/* Redefining $module_name -> $required_module_name */\n";
-+      if (scalar (@port_names) == 1) {
-+              my $irq = $module->getIRQ ();
-+              print "#undef na_" . $module_name . "\n";
-+              if (defined ($irq)) {
-+                      print "#undef na_" . $module_name . "_irq\n";
-+              }
-+              print "\n";
-+      } else {
-+              foreach my $port_name (@port_names) {
-+                      print "#undef na_" . $module_name . "_" . 
-+                              $port_name . "\n";
-+                      my $irq = $module->getIRQ ($port_name);
-+                      if (defined ($irq)) {
-+                              print "#undef na_" . $module_name . "_" .
-+                                      $port_name . "_irq\n";
-+                      }
-+                      print "\n";
-+              }
-+      }
-+      
-+      if (scalar (@port_names) == 1) {
-+              # set up a string to pass to printf that will output the correct
-+              # #define base address statement.
-+
-+              # turn on the high bit for the base address to bypass cache.
-+              my $base_address = $module->getBaseAddress ();
-+              $base_address = hex ($base_address) | 0x80000000;
-+      
-+              my $cast = $class->base_address_cast;
-+              $class->print_define_line ($required_module_name, 
-+                      undef, "addr", $cast, $base_address);
-+      
-+              # print out an IRQ define statement if necessary
-+              my $irq = $module->getIRQ ();
-+              if (defined ($irq)) {
-+                      $class->print_define_line ($required_module_name, 
-+                              undef, "irq", undef, $irq);
-+              }
-+              printf ("\n");
-+      } else {
-+              foreach my $port_name (@port_names) {
-+                      my $cast = $class->base_address_cast ($port_name);
-+                      my $base_address = $module->getBaseAddress ($port_name);
-+                      $base_address = hex ($base_address) | 0x80000000;
-+                      $class->print_define_line ($required_module_name, 
-+                              $port_name, "addr", $cast, $base_address);
-+
-+                      my $irq = $module->getIRQ ($port_name);
-+                      if (defined ($irq)) {
-+                              $class->print_define_line (
-+                                      $required_module_name, $port_name,
-+                                      "irq", undef, $irq);
-+                      }
-+                      
-+                      print "\n";
-+              }
-+      }
-+}
-+
-+# Description: The following sub-routine prints out "undef" or "define"
-+#              statements based on the arguments received.
-+# Args: $name: "define" or "undef"
-+#       $port: name of port (if applicable)
-+#       $type: "addr" or "irq"
-+#       $cast: data type to cast base address to (if applicable)
-+#       $value: value of symbol to be defined (if applicable)
-+sub print_define_line {
-+      my ($class, $name, $port, $type, $cast, $value) = @_;
-+
-+      # construct the symbol that is being used
-+      my $symbol .= "na_";
-+      $symbol .= $name;
-+
-+      $symbol .= defined ($port) ? "_" . $port : "";
-+      $symbol .= $type eq "irq" ? "_irq" : "";
-+      
-+      my $string_value;
-+      if ($type eq "addr") {
-+              $string_value = sprintf ("%#010x", $value);
-+              if (defined $cast) {
-+                      $string_value = "(($cast*) $string_value)";
-+              }
-+      } else {
-+              $string_value = $value;
-+      }
-+      printf ("%-41s %30s\n", "#define $symbol", $string_value);
-+}     
-+
-+# Description: This sub-routine prints out a prefix that is shown only once
-+#              after any translations take place.
-+sub print_suffix {
-+      my ($class, $system) = @_;
-+      # intentionally left empty
-+}
-+      
-+# Description: The following function allows the class to further determine if
-+#              the module is valid.  For instance, the timer class requires
-+#              that the selected module does not have a fixed period.
-+#              This function returns true by default which basically means
-+#              that all modules belonging to class are valid.
-+sub is_module_valid {
-+      my ($class, $system, $module_name) = @_;
-+      return 1;
-+}
-+
-+# Description: This sub-routine is required.  It is executed by the
-+#              "../gen_nios2_system_h.pl" script whenever any devices of type
-+#              $class->required_class_name are found in the PTF file.
-+#
-+#              It looks for any conflicting module names first.  If any are
-+#              found, "print_error_name_used" is called and this perl module
-+#              exits.
-+#
-+#              It then goes through the list of module names found in the PTF
-+#              file that are of type $class->required_class_name and maps them to the
-+#              list of unused names in $class->required_module_names.
-+#
-+#              Finally, it will call the "translate" sub-routine to output the
-+#              symbols required by the driver.
-+# Args: $system: a variable containing a reference to the system.ptf file that
-+#                provides full access to any information in the file.
-+#       @found_module_names: a list of module names that are of type
-+#                            $class->required_class_name
-+sub run2 {
-+      my ($class, $system, @found_module_names) = @_;
-+
-+      # initialize a mapping of required module names to actual module names
-+      my %module_map;
-+      foreach my $module_name ($class->required_module_names) {
-+              $module_map{$module_name} = "";
-+      }
-+
-+      # if the required module name is already in use in the PTF file for a
-+      # different device class, flag it as an error. 
-+      my $error_found = 0;
-+      foreach my $module_name ($class->required_module_names) {
-+              my $module = $system->getModule ($module_name);
-+
-+              if (!defined ($module)) {
-+                      next;
-+              }
-+              
-+              my $class_name = $module->getClass ();
-+              if ($class_name ne $class->required_class_name) {
-+                      $class->print_error_name_used ($class, $module_name, $class_name);
-+                      $error_found = 1;
-+              }
-+      }
-+
-+      # if errors were found, then there's no point in continuing.
-+      if ($error_found == 1) {
-+              return;
-+      }
-+
-+      # Run through list of modules that belong to the class and start
-+      # mapping each module name to the first unused required module name
-+      # as defined above
-+      FOUND_MOD_LOOP: foreach my $module_name (@found_module_names) {
-+
-+              # If the module name has already been used, then continue
-+              # to the next one.
-+              foreach my $required_module_name ($class->required_module_names) {
-+                      if ($module_map{$required_module_name} eq $module_name) {
-+                              next FOUND_MOD_LOOP;
-+                      }
-+              }
-+
-+              # assertion: $module_name is not mapped yet.
-+              foreach my $required_module_name ($class->required_module_names) {
-+                      if ($module_map{$required_module_name} ne "") {
-+                              next;
-+                      }
-+
-+                      if ($class->is_module_valid ($system, $module_name)) {
-+                              $module_map{$required_module_name} = $module_name;
-+                      }
-+                      last;
-+              }
-+      }
-+
-+      $class->print_prefix ($system);
-+
-+      # Now that everything's been mapped (or as close as we're going to get
-+      # to it being mapped), start printing out the literal translation.
-+      foreach my $required_module_name ($class->required_module_names) {
-+              my $module_name = $module_map{$required_module_name};
-+              if (length ($module_name) > 0) {
-+                      $class->translate ($system, $required_module_name, $module_name);
-+              }
-+      }
-+
-+      $class->print_suffix ($system);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_cf.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_cf.pm
-new file mode 100644
-index 0000000..dada452
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_cf.pm
-@@ -0,0 +1,18 @@
-+package altera_avalon_cf;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      "ide"
-+}
-+
-+sub required_class_name {
-+      "altera_avalon_cf"
-+}
-+
-+sub run {
-+      altera_avalon_cf->run2(@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_jtag_uart.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_jtag_uart.pm
-new file mode 100644
-index 0000000..22bb9c9
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_jtag_uart.pm
-@@ -0,0 +1,18 @@
-+package altera_avalon_jtag_uart;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      ("jtag_uart")
-+}
-+
-+sub required_class_name {
-+      "altera_avalon_jtag_uart";
-+}
-+
-+sub run {
-+      altera_avalon_jtag_uart->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_lan91c111.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_lan91c111.pm
-new file mode 100644
-index 0000000..5a29b7e
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_lan91c111.pm
-@@ -0,0 +1,38 @@
-+package altera_avalon_lan91c111;
-+
-+require PTF::SystemPTF;
-+require PTF::SystemPTF::Module;
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      "enet"
-+}
-+
-+sub required_class_name {
-+      "altera_avalon_lan91c111"
-+}
-+
-+sub translate {
-+      my $class = shift;
-+      my ($system, $required_module_name, $module_name) = @_;
-+      $class->SUPER::translate (@_);
-+
-+      my $module = $system->getModule ($module_name);
-+
-+      my $offset_keyword = "LAN91C111_REGISTERS_OFFSET";
-+      my $offset = $module->getWSAConstant ($offset_keyword);
-+      printf ("%-41s %30s\n", "#define $offset_keyword", $offset);
-+
-+      my $width_keyword = "LAN91C111_DATA_BUS_WIDTH";
-+      my $width = $module->getWSAConstant ($width_keyword);
-+      printf ("%-41s %30s\n", "#define $width_keyword", $width);
-+
-+      print "\n";
-+}
-+
-+sub run {
-+      altera_avalon_lan91c111->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_pio.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_pio.pm
-new file mode 100644
-index 0000000..afdbcae
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_pio.pm
-@@ -0,0 +1,46 @@
-+package altera_avalon_pio;
-+
-+require PTF::SystemPTF;
-+require PTF::SystemPTF::Module;
-+use strict;
-+
-+sub run {
-+      my ($system, @pio_names) = @_;
-+
-+      print "#ifndef __ASSEMBLY__\n";
-+      print "#include <asm/pio_struct.h>\n";
-+      print "#endif\n\n";
-+      
-+      foreach my $pio_name (@pio_names) {
-+              my $module = $system->getModule ($pio_name);
-+
-+              # get all the relevant information
-+              my $base_address = $module->getBaseAddress ();
-+              $base_address = hex ($base_address) | 0x80000000;
-+              my $irq = $module->getIRQ ();
-+
-+              print "/* Casting base addresses to the appropriate structure */\n";
-+
-+              # undefine all the old symbols first
-+              print "#undef na_${pio_name}\n";
-+              if (defined ($irq)) {
-+                      print "#undef na_${pio_name}_irq\n";
-+                      print "\n";
-+              }
-+
-+              # define base address
-+              $base_address = sprintf ("%#010x", $base_address);
-+              printf ("%-41s %30s\n", "#define na_${pio_name}", 
-+                      "((np_pio*) ${base_address})");
-+
-+              # define irq
-+              if (defined ($irq)) {
-+                      printf ("%-41s %30s\n", "#define na_${pio_name}_irq", 
-+                              $irq);
-+              }
-+
-+              print "\n";
-+      }
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_spi.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_spi.pm
-new file mode 100644
-index 0000000..719a22c
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_spi.pm
-@@ -0,0 +1,30 @@
-+package altera_avalon_spi;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      "spi"
-+}
-+
-+sub required_class_name {
-+      "altera_avalon_spi"
-+}
-+
-+sub base_address_cast {
-+      "np_spi"
-+}
-+
-+sub print_prefix {
-+      my ($class, $system) = @_;
-+
-+      print "#ifndef __ASSEMBLY__\n";
-+      print "#include <asm/spi_struct.h>\n";
-+      print "#endif\n\n";
-+}
-+
-+sub run {
-+      altera_avalon_spi->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_sysid.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_sysid.pm
-new file mode 100644
-index 0000000..deb9826
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_sysid.pm
-@@ -0,0 +1,18 @@
-+package altera_avalon_sysid;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_class_name {
-+      "altera_avalon_sysid"
-+}
-+
-+sub required_module_names {
-+      "sysid"
-+}
-+
-+sub run {
-+      altera_avalon_sysid->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_timer.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_timer.pm
-new file mode 100644
-index 0000000..495ccdc
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_timer.pm
-@@ -0,0 +1,46 @@
-+package altera_avalon_timer;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_class_name {
-+      "altera_avalon_timer";
-+}
-+
-+sub required_module_names {
-+      "timer0"
-+}
-+
-+sub print_prefix {
-+      my ($class, $system) = @_;
-+
-+      print "\n";
-+      print "#ifndef __ASSEMBLY__\n";
-+      print "#include <asm/timer_struct.h>\n";
-+      print "#endif\n";
-+      print "\n";
-+}
-+
-+sub base_address_cast {
-+      "np_timer"
-+}
-+
-+# only timers with a non-fixed-period are valid
-+sub is_module_valid {
-+      my ($class, $system, $module_name) = @_;
-+      
-+      my $module = $system->getModule ($module_name);
-+      my $fixed_period = $module->getWSAAssignment ('fixed_period');  
-+
-+      if ($fixed_period eq '0') {
-+              return 1;
-+      } else {
-+              return 0;
-+      }
-+}
-+
-+sub run {
-+      altera_avalon_timer->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_uart.pm b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_uart.pm
-new file mode 100644
-index 0000000..abf48d7
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/altera_avalon_uart.pm
-@@ -0,0 +1,44 @@
-+package altera_avalon_uart;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      ("uart0", "uart1", "uart2", "uart3")
-+}
-+
-+sub required_class_name {
-+      "altera_avalon_uart";
-+}
-+
-+sub base_address_cast {
-+      "np_uart"
-+}
-+
-+sub print_prefix {
-+      my ($class, $system) = @_;
-+
-+      print "#ifndef __ASSEMBLY__\n";
-+      print "#include <asm/uart_struct.h>\n";
-+      print "#endif\n\n";
-+}     
-+
-+sub translate {
-+      my $class = shift;
-+      my ($system, $required_module_name, $module_name) = @_;
-+
-+      $class->SUPER::translate (@_);
-+
-+      if (!defined ($altera_avalon_uart::default_uart)) {
-+              print "/* The default uart is always the first one found in the PTF file */\n";
-+              print "#define nasys_printf_uart na_$required_module_name\n\n";
-+              $altera_avalon_uart::default_uart = $required_module_name;
-+      }
-+
-+}
-+
-+sub run {
-+      altera_avalon_uart->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/mtip_avalon_10_100_mac.pm b/arch/nios2nommu/scripts/nios2_system.h/mtip_avalon_10_100_mac.pm
-new file mode 100644
-index 0000000..fdd727b
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/mtip_avalon_10_100_mac.pm
-@@ -0,0 +1,18 @@
-+package mtip_avalon_10_100_mac;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_class_name {
-+      "mtip_avalon_10_100_mac";
-+}
-+
-+sub required_module_names {
-+      "mtip_mac"
-+}
-+
-+sub run {
-+      mtip_avalon_10_100_mac->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/mtx_avalon_dm9000.pm b/arch/nios2nommu/scripts/nios2_system.h/mtx_avalon_dm9000.pm
-new file mode 100644
-index 0000000..5985c2f
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/mtx_avalon_dm9000.pm
-@@ -0,0 +1,18 @@
-+package mtx_avalon_dm9000;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      "dm9000"
-+}
-+
-+sub required_class_name {
-+      "mtx_avalon_dm9000"
-+}
-+
-+sub run {
-+      mtx_avalon_dm9000->run2(@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/mtx_avalon_isp1161a1.pm b/arch/nios2nommu/scripts/nios2_system.h/mtx_avalon_isp1161a1.pm
-new file mode 100644
-index 0000000..e70ffa3
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/mtx_avalon_isp1161a1.pm
-@@ -0,0 +1,18 @@
-+package mtx_avalon_isp1161a1;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      "usb"
-+}
-+
-+sub required_class_name {
-+      "mtx_avalon_isp1161a1";
-+}
-+
-+sub run {
-+      mtx_avalon_isp1161a1->run2(@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/opencores_ethernet_mac.pm b/arch/nios2nommu/scripts/nios2_system.h/opencores_ethernet_mac.pm
-new file mode 100644
-index 0000000..7b580b5
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/opencores_ethernet_mac.pm
-@@ -0,0 +1,18 @@
-+package opencores_ethernet_mac;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      "igor_mac"
-+}
-+
-+sub required_class_name {
-+      "opencores_ethernet_mac"
-+}
-+
-+sub run {
-+      opencores_ethernet_mac->run2 (@_);
-+}
-+
-+1;
-diff --git a/arch/nios2nommu/scripts/nios2_system.h/opencores_i2c.pm b/arch/nios2nommu/scripts/nios2_system.h/opencores_i2c.pm
-new file mode 100644
-index 0000000..512d12c
---- /dev/null
-+++ b/arch/nios2nommu/scripts/nios2_system.h/opencores_i2c.pm
-@@ -0,0 +1,18 @@
-+package opencores_i2c;
-+
-+use base qw(BasicModule);
-+use strict;
-+
-+sub required_module_names {
-+      ("i2c_0", "i2c_1")
-+}
-+
-+sub required_class_name {
-+      "opencores_i2c";
-+}
-+
-+sub run {
-+      opencores_i2c->run2 (@_);
-+}
-+
-+1;
-diff --git a/include/asm-nios2nommu/ChangeLog b/include/asm-nios2nommu/ChangeLog
-new file mode 100644
-index 0000000..94aaa27
---- /dev/null
-+++ b/include/asm-nios2nommu/ChangeLog
-@@ -0,0 +1,14 @@
-+2004-06-29  Ken Hill  <khill@microtronix.com>
-+
-+      * bitops.h (find_next_zero_bit): Fix problem with with masking for found_first
-+      handling. The masking of the upper bits for size < 32 bits would set all
-+      the bits to 1. Removing any zero's there may have been.
-+
-+2004-06-02  Ken Hill  <khill@microtronix.com>
-+
-+      * processor.h (TASK_SIZE): Change na_sdram_end to nasys_program_mem_end to remove
-+      dependancy on quartus memory component name.
-+
-+      * page.h (PAGE_OFFSET): Change na_sdram to nasys_program_mem to remove
-+      dependancy on quartus memory component name.
-+
-diff --git a/include/asm-nios2nommu/Kbuild b/include/asm-nios2nommu/Kbuild
-new file mode 100644
-index 0000000..abf0368
---- /dev/null
-+++ b/include/asm-nios2nommu/Kbuild
-@@ -0,0 +1,4 @@
-+include include/asm-generic/Kbuild.asm
-+
-+header-y += traps.h
-+header-y += io.h
-diff --git a/include/asm-nios2nommu/a.out.h b/include/asm-nios2nommu/a.out.h
-new file mode 100644
-index 0000000..8297687
---- /dev/null
-+++ b/include/asm-nios2nommu/a.out.h
-@@ -0,0 +1,85 @@
-+/* $Id: a.out.h,v 1.1 2006/07/05 06:20:25 gerg Exp $ */
-+/*
-+ * Copyright (C) 2004 Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#ifndef __NIOS2NOMMU_A_OUT_H__
-+#define __NIOS2NOMMU_A_OUT_H__
-+
-+#define SPARC_PGSIZE    0x1000        /* Thanks to the sun4 architecture... */
-+#define SEGMENT_SIZE    SPARC_PGSIZE  /* whee... */
-+
-+struct exec {
-+      unsigned char a_dynamic:1;      /* A __DYNAMIC is in this image */
-+      unsigned char a_toolversion:7;
-+      unsigned char a_machtype;
-+      unsigned short a_info;
-+      unsigned long a_text;           /* length of text, in bytes */
-+      unsigned long a_data;           /* length of data, in bytes */
-+      unsigned long a_bss;            /* length of bss, in bytes */
-+      unsigned long a_syms;           /* length of symbol table, in bytes */
-+      unsigned long a_entry;          /* where program begins */
-+      unsigned long a_trsize;
-+      unsigned long a_drsize;
-+};
-+
-+#define INIT_EXEC {                           \
-+      .a_dynamic      = 0,                    \
-+      .a_toolversion  = 0,                    \
-+      .a_machtype     = 0,                    \
-+      .a_info         = 0,                    \
-+      .a_text         = 0,                    \
-+      .a_data         = 0,                    \
-+      .a_bss          = 0,                    \
-+      .a_syms         = 0,                    \
-+      .a_entry        = 0,                    \
-+      .a_trsize       = 0,                    \
-+      .a_drsize       = 0,                    \
-+}
-+
-+/* Where in the file does the text information begin? */
-+#define N_TXTOFF(x)     (N_MAGIC(x) == ZMAGIC ? 0 : sizeof (struct exec))
-+
-+/* Where do the Symbols start? */
-+#define N_SYMOFF(x)     (N_TXTOFF(x) + (x).a_text +   \
-+                         (x).a_data + (x).a_trsize +  \
-+                         (x).a_drsize)
-+
-+/* Where does text segment go in memory after being loaded? */
-+#define N_TXTADDR(x)    (((N_MAGIC(x) == ZMAGIC) &&        \
-+                       ((x).a_entry < SPARC_PGSIZE)) ?   \
-+                          0 : SPARC_PGSIZE)
-+
-+/* And same for the data segment.. */
-+#define N_DATADDR(x) (N_MAGIC(x)==OMAGIC ?         \
-+                      (N_TXTADDR(x) + (x).a_text)  \
-+                       : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
-+
-+#define N_TRSIZE(a)   ((a).a_trsize)
-+#define N_DRSIZE(a)   ((a).a_drsize)
-+#define N_SYMSIZE(a)  ((a).a_syms)
-+
-+#ifdef __KERNEL__
-+
-+#define STACK_TOP     TASK_SIZE
-+
-+#endif
-+
-+#endif /* __NIOS2NOMMU_A_OUT_H__ */
-diff --git a/include/asm-nios2nommu/altera_juart.h b/include/asm-nios2nommu/altera_juart.h
-new file mode 100644
-index 0000000..da6320d
---- /dev/null
-+++ b/include/asm-nios2nommu/altera_juart.h
-@@ -0,0 +1,36 @@
-+/*------------------------------------------------------------------------
-+ *
-+ *  linux/drivers/serial/altera_juart.h
-+ *
-+ *  Driver for Altera JTAG UART core with Avalon interface
-+ *
-+ * Copyright (C) 2004 Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * History:
-+ *    Jun/20/2005   DGT Microtronix Datacom NiosII
-+ *
-+ -----------------------------------------------------------------------*/
-+
-+#ifndef _ALTERA_JUART_H_
-+    #define _ALTERA_JUART_H_
-+
-+    /* jtag uart details needed outside of the driver itself:           */
-+    /*  by: arch/kernel/start.c - boot time error message(s)            */
-+
-+    void jtaguart_console_write
-+            (       struct console  *co,
-+             const  char            *s,
-+                    unsigned int     count);
-+
-+#endif  /* _ALTERA_JUART_H_ */
-diff --git a/include/asm-nios2nommu/asm-macros.h b/include/asm-nios2nommu/asm-macros.h
-new file mode 100644
-index 0000000..9dda7cd
---- /dev/null
-+++ b/include/asm-nios2nommu/asm-macros.h
-@@ -0,0 +1,331 @@
-+/*
-+ * Macro used to simplify coding multi-line assembler.
-+ * Some of the bit test macro can simplify down to one line
-+ * depending on the mask value.
-+ *
-+ * Copyright (C) 2004 Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+/*
-+ * ANDs reg2 with mask and places the result in reg1.
-+ *
-+ * You cannnot use the same register for reg1 & reg2.
-+ */
-+
-+.macro ANDI32 reg1,reg2,mask
-+ .if \mask & 0xffff
-+  .if \mask & 0xffff0000
-+      movhi   \reg1,%hi(\mask)
-+      movui   \reg1,%lo(\mask)
-+      and     \reg1,\reg1,\reg2
-+  .else
-+      andi    \reg1,\reg2,%lo(\mask)
-+  .endif
-+ .else
-+      andhi   \reg1,\reg2,%hi(\mask)
-+ .endif
-+.endm
-+
-+/*
-+ * ORs reg2 with mask and places the result in reg1.
-+ *
-+ * It is safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro ORI32  reg1,reg2,mask
-+ .if \mask & 0xffff
-+  .if \mask & 0xffff0000
-+      orhi    \reg1,\reg2,%hi(\mask)
-+      ori     \reg1,\reg2,%lo(\mask)
-+  .else
-+      ori     \reg1,\reg2,%lo(\mask)
-+  .endif
-+ .else
-+      orhi    \reg1,\reg2,%hi(\mask)
-+ .endif
-+.endm
-+
-+/*
-+ * XORs reg2 with mask and places the result in reg1.
-+ *
-+ * It is safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro XORI32 reg1,reg2,mask
-+ .if \mask & 0xffff
-+  .if \mask & 0xffff0000
-+      xorhi   \reg1,\reg2,%hi(\mask)
-+      xori    \reg1,\reg1,%lo(\mask)
-+  .else
-+      xori    \reg1,\reg2,%lo(\mask)
-+  .endif
-+ .else
-+      xorhi   \reg1,\reg2,%hi(\mask)
-+ .endif
-+.endm
-+
-+/*
-+ * This is a support macro for BTBZ & BTBNZ.  It checks
-+ * the bit to make sure it is valid 32 value.
-+ *
-+ * It is safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BT     reg1,reg2,bit
-+.if \bit > 31
-+ .err 
-+.else
-+ .if \bit < 16
-+      andi    \reg1,\reg2,(1 << \bit)
-+ .else
-+      andhi   \reg1,\reg2,(1 << (\bit - 16))
-+ .endif
-+.endif
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and branches to label if the
-+ * bit is zero.  The result of the bit test is stored in reg1.
-+ *
-+ * It is safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTBZ   reg1,reg2,bit,label
-+      BT      \reg1,\reg2,\bit
-+      beq     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and branches to label if the
-+ * bit is non-zero.  The result of the bit test is stored in reg1.
-+ *
-+ * It is safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTBNZ  reg1,reg2,bit,label
-+      BT      \reg1,\reg2,\bit
-+      bne     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then compliments the bit in reg2.
-+ * The result of the bit test is stored in reg1.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTC    reg1,reg2,bit
-+.if \bit > 31
-+ .err 
-+.else
-+ .if \bit < 16
-+      andi    \reg1,\reg2,(1 << \bit)
-+      xori    \reg2,\reg2,(1 << \bit)
-+ .else
-+      andhi   \reg1,\reg2,(1 << (\bit - 16))
-+      xorhi   \reg2,\reg2,(1 << (\bit - 16))
-+ .endif
-+.endif
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then sets the bit in reg2.
-+ * The result of the bit test is stored in reg1.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTS    reg1,reg2,bit
-+.if \bit > 31
-+ .err 
-+.else
-+ .if \bit < 16
-+      andi    \reg1,\reg2,(1 << \bit)
-+      ori     \reg2,\reg2,(1 << \bit)
-+ .else
-+      andhi   \reg1,\reg2,(1 << (\bit - 16))
-+      orhi    \reg2,\reg2,(1 << (\bit - 16))
-+ .endif
-+.endif
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then resets the bit in reg2.
-+ * The result of the bit test is stored in reg1.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTR    reg1,reg2,bit
-+.if \bit > 31
-+ .err 
-+.else
-+ .if \bit < 16
-+      andi    \reg1,\reg2,(1 << \bit)
-+      andi    \reg2,\reg2,%lo(~(1 << \bit))
-+ .else
-+      andhi   \reg1,\reg2,(1 << (\bit - 16))
-+      andhi   \reg2,\reg2,%lo(~(1 << (\bit - 16)))
-+ .endif
-+.endif
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then compliments the bit in reg2.
-+ * The result of the bit test is stored in reg1.  If the 
-+ * original bit was zero it branches to label.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTCBZ  reg1,reg2,bit,label
-+      BTC     \reg1,\reg2,\bit
-+      beq     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then compliments the bit in reg2.
-+ * The result of the bit test is stored in reg1.  If the 
-+ * original bit was non-zero it branches to label.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTCBNZ reg1,reg2,bit,label
-+      BTC     \reg1,\reg2,\bit
-+      bne     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then sets the bit in reg2.
-+ * The result of the bit test is stored in reg1.  If the 
-+ * original bit was zero it branches to label.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTSBZ  reg1,reg2,bit,label
-+      BTS     \reg1,\reg2,\bit
-+      beq     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then sets the bit in reg2.
-+ * The result of the bit test is stored in reg1.  If the 
-+ * original bit was non-zero it branches to label.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTSBNZ reg1,reg2,bit,label
-+      BTS     \reg1,\reg2,\bit
-+      bne     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then resets the bit in reg2.
-+ * The result of the bit test is stored in reg1.  If the 
-+ * original bit was zero it branches to label.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTRBZ  reg1,reg2,bit,label
-+      BTR     \reg1,\reg2,\bit
-+      bne     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bit in reg2 and then resets the bit in reg2.
-+ * The result of the bit test is stored in reg1.  If the 
-+ * original bit was non-zero it branches to label.
-+ *
-+ * It is NOT safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro BTRBNZ reg1,reg2,bit,label
-+      BTR     \reg1,\reg2,\bit
-+      bne     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bits in mask against reg2 stores the result in reg1.
-+ * If the all the bits in the mask are zero it branches to label.
-+ *
-+ * It is safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro TSTBZ  reg1,reg2,mask,label
-+      ANDI32  \reg1,\reg2,\mask
-+      beq     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Tests the bits in mask against reg2 stores the result in reg1.
-+ * If the any of the bits in the mask are 1 it branches to label.
-+ *
-+ * It is safe to use the same register for reg1 & reg2.
-+ */
-+
-+.macro TSTBNZ reg1,reg2,mask,label
-+      ANDI32  \reg1,\reg2,\mask
-+      bne     \reg1,r0,\label
-+.endm
-+
-+/*
-+ * Pushes reg onto the stack.
-+ */
-+
-+.macro PUSH   reg
-+      addi    sp,sp,-4
-+      stw     \reg,0(sp)
-+.endm
-+
-+/*
-+ * Pops the top of the stack into reg.
-+ */
-+
-+.macro POP    reg
-+      ldw     \reg,0(sp)
-+      addi    sp,sp,4
-+.endm
-+
-+/*
-+ * Clears reg
-+ */
-+
-+.macro CLR    reg
-+        mov   \reg,r0
-+.endm
-+
-+/*
-+ * The preprocessor macro does not work for
-+ * the nios2 compiler. Undefine ENTRY and define
-+ * a real assembler macro.
-+ */
-+#undef ENTRY
-+#define ENTRY(name) ASM_ENTRY name
-+
-+.macro ASM_ENTRY name
-+.globl \name
-+__ALIGN
-+  \name:
-+.endm
-diff --git a/include/asm-nios2nommu/atomic.h b/include/asm-nios2nommu/atomic.h
-new file mode 100644
-index 0000000..fb627de
---- /dev/null
-+++ b/include/asm-nios2nommu/atomic.h
-@@ -0,0 +1,146 @@
-+#ifndef __ASM_SH_ATOMIC_H
-+#define __ASM_SH_ATOMIC_H
-+
-+/*
-+ * Atomic operations that C can't guarantee us.  Useful for
-+ * resource counting etc..
-+ *
-+ */
-+
-+typedef struct { volatile int counter; } atomic_t;
-+
-+#define ATOMIC_INIT(i)        ( (atomic_t) { (i) } )
-+
-+#define atomic_read(v)                ((v)->counter)
-+#define atomic_set(v,i)               ((v)->counter = (i))
-+
-+#include <asm/system.h>
-+
-+/*
-+ * To get proper branch prediction for the main line, we must branch
-+ * forward to code at the end of this object's .text section, then
-+ * branch back to restart the operation.
-+ */
-+
-+static __inline__ void atomic_add(int i, atomic_t * v)
-+{
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+      *(long *)v += i;
-+      local_irq_restore(flags);
-+}
-+
-+static __inline__ void atomic_sub(int i, atomic_t *v)
-+{
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+      *(long *)v -= i;
-+      local_irq_restore(flags);
-+}
-+
-+static __inline__ int atomic_add_return(int i, atomic_t * v)
-+{
-+      unsigned long temp, flags;
-+
-+      local_irq_save(flags);
-+      temp = *(long *)v;
-+      temp += i;
-+      *(long *)v = temp;
-+      local_irq_restore(flags);
-+
-+      return temp;
-+}
-+
-+#define atomic_add_negative(a, v)     (atomic_add_return((a), (v)) < 0)
-+
-+static __inline__ int atomic_sub_return(int i, atomic_t * v)
-+{
-+      unsigned long temp, flags;
-+
-+      local_irq_save(flags);
-+      temp = *(long *)v;
-+      temp -= i;
-+      *(long *)v = temp;
-+      local_irq_restore(flags);
-+
-+      return temp;
-+}
-+
-+#define atomic_dec_return(v) atomic_sub_return(1,(v))
-+#define atomic_inc_return(v) atomic_add_return(1,(v))
-+
-+/*
-+ * atomic_inc_and_test - increment and test
-+ * @v: pointer of type atomic_t
-+ *
-+ * Atomically increments @v by 1
-+ * and returns true if the result is zero, or false for all
-+ * other cases.
-+ */
-+#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
-+
-+#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
-+#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
-+
-+#define atomic_inc(v) atomic_add(1,(v))
-+#define atomic_dec(v) atomic_sub(1,(v))
-+
-+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
-+{
-+      int ret;
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+      ret = v->counter;
-+      if (likely(ret == old))
-+              v->counter = new;
-+      local_irq_restore(flags);
-+
-+      return ret;
-+}
-+
-+#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
-+
-+static inline int atomic_add_unless(atomic_t *v, int a, int u)
-+{
-+      int ret;
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+      ret = v->counter;
-+      if (ret != u)
-+              v->counter += a;
-+      local_irq_restore(flags);
-+
-+      return ret != u;
-+}
-+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
-+
-+static __inline__ void atomic_clear_mask(unsigned int mask, atomic_t *v)
-+{
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+      *(long *)v &= ~mask;
-+      local_irq_restore(flags);
-+}
-+
-+static __inline__ void atomic_set_mask(unsigned int mask, atomic_t *v)
-+{
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+      *(long *)v |= mask;
-+      local_irq_restore(flags);
-+}
-+
-+/* Atomic operations are already serializing on SH */
-+#define smp_mb__before_atomic_dec()   barrier()
-+#define smp_mb__after_atomic_dec()    barrier()
-+#define smp_mb__before_atomic_inc()   barrier()
-+#define smp_mb__after_atomic_inc()    barrier()
-+
-+#include <asm-generic/atomic.h>
-+#endif /* __ASM_SH_ATOMIC_H */
-diff --git a/include/asm-nios2nommu/auxvec.h b/include/asm-nios2nommu/auxvec.h
-new file mode 100644
-index 0000000..fc21e4d
---- /dev/null
-+++ b/include/asm-nios2nommu/auxvec.h
-@@ -0,0 +1,4 @@
-+#ifndef __ASM_SH_AUXVEC_H
-+#define __ASM_SH_AUXVEC_H
-+
-+#endif /* __ASM_SH_AUXVEC_H */
-diff --git a/include/asm-nios2nommu/bitops.h b/include/asm-nios2nommu/bitops.h
-new file mode 100644
-index 0000000..7bf1862
---- /dev/null
-+++ b/include/asm-nios2nommu/bitops.h
-@@ -0,0 +1,11 @@
-+#ifndef __ASM_NIOS2NOMMU_BITOPS_H
-+#define __ASM_NIOS2NOMMU_BITOPS_H
-+
-+#ifdef __KERNEL__
-+#include <asm/system.h>
-+#include <asm-generic/bitops.h>
-+#define smp_mb__before_clear_bit()    barrier()
-+#define smp_mb__after_clear_bit()     barrier()
-+#endif /* __KERNEL__ */
-+
-+#endif /* __ASM_NIOS2NOMMU_BITOPS_H */
-diff --git a/include/asm-nios2nommu/bootinfo.h b/include/asm-nios2nommu/bootinfo.h
-new file mode 100644
-index 0000000..ee8c39e
---- /dev/null
-+++ b/include/asm-nios2nommu/bootinfo.h
-@@ -0,0 +1,2 @@
-+
-+/* Nothing for nios2nommu */
-diff --git a/include/asm-nios2nommu/bug.h b/include/asm-nios2nommu/bug.h
-new file mode 100644
-index 0000000..d99ab08
---- /dev/null
-+++ b/include/asm-nios2nommu/bug.h
-@@ -0,0 +1,4 @@
-+#ifndef _MNIOS2NOMMU_BUG_H
-+#define _MNIOS2NOMMU_BUG_H
-+#include <asm-generic/bug.h>
-+#endif
-diff --git a/include/asm-nios2nommu/bugs.h b/include/asm-nios2nommu/bugs.h
-new file mode 100644
-index 0000000..a0753eb
---- /dev/null
-+++ b/include/asm-nios2nommu/bugs.h
-@@ -0,0 +1,40 @@
-+#ifndef __ASM_NIOS_BUGS_H
-+#define __ASM_NIOS_BUGS_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/bugs.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ *  Copyright (C) 1994  Linus Torvalds
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/*
-+ * This is included by init/main.c to check for architecture-dependent bugs.
-+ *
-+ * Needs:
-+ *    void check_bugs(void);
-+ */
-+
-+static void check_bugs(void)
-+{
-+}
-+
-+#endif
-diff --git a/include/asm-nios2nommu/byteorder.h b/include/asm-nios2nommu/byteorder.h
-new file mode 100644
-index 0000000..960b6d3
---- /dev/null
-+++ b/include/asm-nios2nommu/byteorder.h
-@@ -0,0 +1,38 @@
-+#ifndef __ASM_NIOS_BYTEORDER_H
-+#define __ASM_NIOS_BYTEORDER_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/byteorder.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/types.h>
-+
-+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
-+#  define __BYTEORDER_HAS_U64__
-+#  define __SWAB_64_THRU_32__
-+#endif
-+
-+#include <linux/byteorder/little_endian.h>
-+
-+#endif
-+
-diff --git a/include/asm-nios2nommu/cache.h b/include/asm-nios2nommu/cache.h
-new file mode 100644
-index 0000000..82bbd14
---- /dev/null
-+++ b/include/asm-nios2nommu/cache.h
-@@ -0,0 +1,36 @@
-+/*
-+ * Copyright (C) 2004 Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#ifndef __ARCH_NIOS2NOMMU_CACHE_H
-+#define __ARCH_NIOS2NOMMU_CACHE_H
-+
-+#include <asm/nios.h>
-+
-+/* bytes per L1 cache line */
-+#define        L1_CACHE_BYTES nasys_icache_line_size  /* 32, this need to be at least 1 */
-+#define L1_CACHE_ALIGN(x)     (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
-+#define L1_CACHE_SHIFT        5
-+
-+
-+#define __cacheline_aligned
-+#define ____cacheline_aligned
-+
-+#endif
-diff --git a/include/asm-nios2nommu/cachectl.h b/include/asm-nios2nommu/cachectl.h
-new file mode 100644
-index 0000000..39d7d9d
---- /dev/null
-+++ b/include/asm-nios2nommu/cachectl.h
-@@ -0,0 +1,36 @@
-+/*
-+ * Copyright (C) 2004 Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2NOMMU_CACHECTL_H
-+#define _NIOS2NOMMU_CACHECTL_H
-+
-+/* Definitions for the cacheflush system call.  */
-+
-+#define FLUSH_SCOPE_LINE    1 /* Flush a cache line */
-+#define FLUSH_SCOPE_PAGE    2 /* Flush a page */
-+#define FLUSH_SCOPE_ALL     3 /* Flush the whole cache -- superuser only */
-+
-+#define FLUSH_CACHE_DATA    1 /* Writeback and flush data cache */
-+#define FLUSH_CACHE_INSN    2 /* Flush instruction cache */
-+#define FLUSH_CACHE_BOTH    3 /* Flush both caches */
-+
-+#endif /* _NIOS2NOMMU_CACHECTL_H */
-diff --git a/include/asm-nios2nommu/cacheflush.h b/include/asm-nios2nommu/cacheflush.h
-new file mode 100644
-index 0000000..4543201
---- /dev/null
-+++ b/include/asm-nios2nommu/cacheflush.h
-@@ -0,0 +1,59 @@
-+#ifndef _NIOS2NOMMU_CACHEFLUSH_H
-+#define _NIOS2NOMMU_CACHEFLUSH_H
-+
-+/*
-+ * Ported from m68knommu.
-+ *
-+ * (C) Copyright 2003, Microtronix Datacom Ltd.
-+ * (C) Copyright 2000-2002, Greg Ungerer <gerg@snapgear.com>
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#include <linux/mm.h>
-+
-+extern void cache_push (unsigned long vaddr, int len);
-+extern void dcache_push (unsigned long vaddr, int len);
-+extern void icache_push (unsigned long vaddr, int len);
-+extern void cache_push_all (void);
-+extern void cache_clear (unsigned long paddr, int len);
-+
-+#define flush_cache_all()                     __flush_cache_all()
-+#define flush_cache_mm(mm)                    do { } while (0)
-+#define flush_cache_range(vma, start, end)    cache_push(start, end - start)
-+#define flush_cache_page(vma, vmaddr)         do { } while (0)
-+#define flush_dcache_range(start,end)         dcache_push(start, end - start)
-+#define flush_dcache_page(page)                       do { } while (0)
-+#define flush_dcache_mmap_lock(mapping)               do { } while (0)
-+#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
-+#define flush_icache_range(start,end)         cache_push(start, end - start)
-+#define flush_icache_page(vma,pg)             do { } while (0)
-+#define flush_icache_user_range(vma,pg,adr,len)       do { } while (0)
-+
-+#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
-+      memcpy(dst, src, len)
-+#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
-+      memcpy(dst, src, len)
-+
-+
-+extern inline void __flush_cache_all(void)
-+{
-+      cache_push_all();
-+}
-+
-+#endif /* _NIOS2NOMMU_CACHEFLUSH_H */
-diff --git a/include/asm-nios2nommu/checksum.h b/include/asm-nios2nommu/checksum.h
-new file mode 100644
-index 0000000..1f6879e
---- /dev/null
-+++ b/include/asm-nios2nommu/checksum.h
-@@ -0,0 +1,320 @@
-+#ifndef __NIOS2_CHECKSUM_H
-+#define __NIOS2_CHECKSUM_H
-+
-+/*  checksum.h:  IP/UDP/TCP checksum routines on the NIOS.
-+ *
-+ *  Copyright(C) 1995 Linus Torvalds
-+ *  Copyright(C) 1995 Miguel de Icaza
-+ *  Copyright(C) 1996 David S. Miller
-+ *  Copyright(C) 2001 Ken Hill
-+ *  Copyright(C) 2004 Microtronix Datacom Ltd.
-+ *
-+ * derived from:
-+ *    Alpha checksum c-code
-+ *      ix86 inline assembly
-+ *      Spar nommu
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+/*
-+ * computes the checksum of the TCP/UDP pseudo-header
-+ * returns a 16-bit checksum, already complemented
-+ */
-+
-+extern inline unsigned short csum_tcpudp_magic(unsigned long saddr,
-+                                             unsigned long daddr,
-+                                             unsigned short len,
-+                                             unsigned short proto,
-+                                             unsigned int sum)
-+{
-+    barrier();
-+      __asm__ __volatile__(
-+"             add     %0, %3, %0\n"
-+"             bgeu    %0, %3, 1f\n"
-+"             addi    %0, %0, 1\n"
-+"1:           add     %0, %4, %0\n"
-+"             bgeu    %0, %4, 1f\n"
-+"             addi    %0, %0, 1\n"
-+"1:           add     %0, %5, %0\n"
-+"             bgeu    %0, %5, 1f\n"
-+"             addi    %0, %0, 1\n"
-+"1:\n"
-+/*
-+              We need the carry from the addition of 16-bit
-+              significant addition, so we zap out the low bits
-+              in one half, zap out the high bits in another,
-+              shift them both up to the top 16-bits of a word
-+              and do the carry producing addition, finally
-+              shift the result back down to the low 16-bits.
-+
-+              Actually, we can further optimize away two shifts
-+              because we know the low bits of the original
-+              value will be added to zero-only bits so cannot
-+              affect the addition result nor the final carry
-+              bit.
-+*/
-+"             slli    %1,%0, 16\n"            /* Need a copy to fold with */
-+                                              /* Bring the LOW 16 bits up */
-+"             add     %0, %1, %0\n"           /* add and set carry, neat eh? */
-+"             cmpltu  r15, %0, %1\n"          /* get remaining carry bit */
-+"             srli    %0, %0, 16\n"           /* shift back down the result */
-+"             add     %0, %0, r15\n"
-+"             nor     %0, %0, %0\n"           /* negate */
-+              : "=&r" (sum), "=&r" (saddr)
-+              : "0" (sum), "1" (saddr), "r" (ntohl(len+proto)), "r" (daddr)
-+              : "r15");
-+              return ((unsigned short) sum); 
-+    barrier();
-+}
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+
-+  extern inline unsigned short from32to16(unsigned long x)
-+  {
-+    barrier();
-+      __asm__ __volatile__(
-+              "add    %0, %1, %0\n"
-+              "cmpltu r15, %0, %1\n"
-+              "srli   %0, %0, 16\n"
-+              "add    %0, %0, r15\n"
-+              : "=r" (x)
-+              : "r" (x << 16), "0" (x)
-+              : "r15");
-+      return x;
-+    barrier();
-+  }
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+
-+extern inline unsigned long do_csum(const unsigned char * buff, int len)
-+{
-+ int odd, count;
-+ unsigned long result = 0;
-+
-+    barrier();
-+ if (len <= 0)
-+      goto out;
-+ odd = 1 & (unsigned long) buff;
-+ if (odd) {
-+////result = *buff;                     // dgt: Big    endian
-+      result = *buff << 8;                // dgt: Little endian
-+
-+      len--;
-+      buff++;
-+ }
-+ count = len >> 1;            /* nr of 16-bit words.. */
-+ if (count) {
-+      if (2 & (unsigned long) buff) {
-+              result += *(unsigned short *) buff;
-+              count--;
-+              len -= 2;
-+              buff += 2;
-+      }
-+      count >>= 1;            /* nr of 32-bit words.. */
-+      if (count) {
-+              unsigned long carry = 0;
-+              do {
-+                      unsigned long w = *(unsigned long *) buff;
-+                      count--;
-+                      buff += 4;
-+                      result += carry;
-+                      result += w;
-+                      carry = (w > result);
-+              } while (count);
-+              result += carry;
-+              result = (result & 0xffff) + (result >> 16);
-+      }
-+      if (len & 2) {
-+              result += *(unsigned short *) buff;
-+              buff += 2;
-+      }
-+ }
-+ if (len & 1)
-+      result += *buff;  /* This is little machine, byte is right */
-+ result = from32to16(result);
-+ if (odd)
-+      result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
-+out:
-+      return result;
-+    barrier();
-+  }
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+
-+/* ihl is always 5 or greater, almost always is 5, iph is always word
-+ * aligned but can fail to be dword aligned very often.
-+ */
-+
-+  extern inline unsigned short ip_fast_csum(const unsigned char *iph, unsigned int ihl)
-+  {
-+      unsigned int sum;
-+
-+    barrier();
-+      __asm__ __volatile__(
-+"             andi    r8, %1, 2\n"    /* Remember original alignment */
-+"             ldw     %0, (%1)\n"     /* 16 or 32 bit boundary */
-+"             beq     r8, r0, 1f\n"   /* Aligned on 32 bit boundary, go */
-+"             srli    %0, %0, 16\n"   /* Get correct 16 bits */
-+"             addi    %2, %2, -1\n"   /* Take off for 4 bytes, pickup last 2 at end */
-+"             addi    %1, %1, 2\n"    /* Adjust pointer to 32 bit boundary */
-+"             br      2f\n"
-+"1:\n"
-+"             addi    %2, %2, -1\n"
-+"             addi    %1, %1, 4\n"    /* Bump ptr a long word */
-+"2:\n"
-+"             ldw     r9, (%1)\n"
-+"1:\n"
-+"             add     %0, r9, %0\n"
-+"             bgeu    %0, r9, 2f\n"
-+"             addi    %0, %0, 1\n"
-+"2:\n"
-+"             addi    %1, %1, 4\n"
-+"             addi    %2, %2, -1\n"
-+"             ldw     r9, (%1)\n"
-+"             bne     %2, r0, 1b\n"
-+"             beq     r8, r0, 1f\n"   /* 32 bit boundary time to leave */
-+"             srli    r9, r9, 16\n"   /* 16 bit boundary, get correct 16 bits */
-+"             add     %0, r9, %0\n"
-+"             bgeu    %0, r9, 1f\n"
-+"             addi    %0, %0, 1\n"
-+"1:\n"
-+"             slli    %2, %0, 16\n"
-+"             add     %0, %2, %0\n"
-+"             cmpltu  r8, %0, %2\n"
-+"             srli    %0, %0, 16\n"
-+"             add     %0, %0, r8\n"
-+"             nor     %0, %0, %0\n"
-+              : "=&r" (sum), "=&r" (iph), "=&r" (ihl)
-+              : "1" (iph), "2" (ihl)
-+              : "r8", "r9");
-+      return sum;
-+    barrier();
-+  }
-+
-+/*these 2 functions are now in checksum.c */
-+unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum);
-+unsigned int csum_partial_copy(const char *src, char *dst, int len, int sum);
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+/*
-+ * the same as csum_partial_copy, but copies from user space.
-+ *
-+ * here even more important to align src and dst on a 32-bit (or even
-+ * better 64-bit) boundary
-+ */
-+extern inline unsigned int
-+csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *csum_err)
-+{
-+    barrier();
-+      if (csum_err) *csum_err = 0;
-+      memcpy(dst, src, len);
-+      return csum_partial(dst, len, sum);
-+    barrier();
-+}
-+
-+#define csum_partial_copy_nocheck(src, dst, len, sum) \
-+      csum_partial_copy ((src), (dst), (len), (sum))
-+
-+
-+/*
-+ * this routine is used for miscellaneous IP-like checksums, mainly
-+ * in icmp.c
-+ */
-+
-+extern inline unsigned short ip_compute_csum(unsigned char * buff, int len)
-+{
-+    barrier();
-+ return ~from32to16(do_csum(buff,len));
-+    barrier();
-+}
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+
-+#define csum_partial_copy_fromuser(s, d, l, w)  \
-+                     csum_partial_copy((char *) (s), (d), (l), (w))
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+
-+/*
-+ *    Fold a partial checksum without adding pseudo headers
-+ */
-+extern __inline__ unsigned int csum_fold(unsigned int sum)
-+{
-+    barrier();
-+      __asm__ __volatile__(
-+              "add    %0, %1, %0\n"
-+              "cmpltu r8, %0, %1\n"
-+              "srli   %0, %0, 16\n"
-+              "add    %0, %0, r8\n"
-+              "nor    %0, %0, %0\n"
-+              : "=r" (sum)
-+              : "r" (sum << 16), "0" (sum)
-+              : "r8"); 
-+      return sum;
-+    barrier();
-+}
-+
-+
-+/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-+
-+
-+extern __inline__ unsigned long csum_tcpudp_nofold(unsigned long saddr,
-+                                                 unsigned long daddr,
-+                                                 unsigned short len,
-+                                                 unsigned short proto,
-+                                                 unsigned int sum)
-+{
-+    barrier();
-+      __asm__ __volatile__(
-+              "add    %0, %1, %0\n"
-+              "cmpltu r8, %0, %1\n"
-+              "add    %0, %0, r8\n"   /* add carry */
-+              "add    %0, %2, %0\n"
-+              "cmpltu r8, %0, %2\n"
-+              "add    %0, %0, r8\n"   /* add carry */
-+              "add    %0, %3, %0\n"
-+              "cmpltu r8, %0, %3\n"
-+              "add    %0, %0, r8\n"   /* add carry */
-+              : "=r" (sum), "=r" (saddr)
-+              : "r" (daddr), "r" ( (ntohs(len)<<16) + (proto*256) ),
-+                "0" (sum),
-+                "1" (saddr)
-+              : "r8");
-+
-+      return sum;
-+    barrier();
-+}
-+
-+
-+#endif /* (__NIOS2_CHECKSUM_H) */
-diff --git a/include/asm-nios2nommu/cprefix.h b/include/asm-nios2nommu/cprefix.h
-new file mode 100644
-index 0000000..4983211
---- /dev/null
-+++ b/include/asm-nios2nommu/cprefix.h
-@@ -0,0 +1,38 @@
-+/* cprefix.h:  This file is included by assembly source which needs
-+ *             to know what the c-label prefixes are. The newer versions
-+ *           of cpp that come with gcc predefine such things to help
-+ *           us out. The reason this stuff is needed is to make
-+ *           solaris compiles of the kernel work.
-+ *
-+ * Copyright (C) 2004 Microtronix Datacom Ltd.
-+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#ifndef __NIOS2_CPREFIX_H
-+#define __NIOS2_CPREFIX_H
-+
-+#define C_LABEL_PREFIX
-+
-+#define CONCAT(a, b) CONCAT2(a, b)
-+#define CONCAT2(a, b) a##b
-+
-+#define C_LABEL(name) CONCAT(C_LABEL_PREFIX, name)
-+
-+#endif /* !(__NIOS2_CPREFIX_H) */
-diff --git a/include/asm-nios2nommu/cpumask.h b/include/asm-nios2nommu/cpumask.h
-new file mode 100644
-index 0000000..86fb365
---- /dev/null
-+++ b/include/asm-nios2nommu/cpumask.h
-@@ -0,0 +1,28 @@
-+/*
-+ * All rights reserved.          
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _ASM_NIOS2NOMMU_CPUMASK_H
-+#define _ASM_NIOS2NOMMU_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_NIOS2NOMMU_CPUMASK_H */
-diff --git a/include/asm-nios2nommu/cputime.h b/include/asm-nios2nommu/cputime.h
-new file mode 100644
-index 0000000..370e4f2
---- /dev/null
-+++ b/include/asm-nios2nommu/cputime.h
-@@ -0,0 +1,31 @@
-+/*
-+ *    cputime.h
-+ *    (C) Copyright 2004, Microtronix Datacom Ltd.
-+ *
-+ * Taken from m68knommu
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2NOMMU_CPUTIME_H
-+#define __NIOS2NOMMU_CPUTIME_H
-+
-+#include <asm-generic/cputime.h>
-+
-+#endif /* __NIOS@NOMMU_CPUTIME_H */
-diff --git a/include/asm-nios2nommu/current.h b/include/asm-nios2nommu/current.h
-new file mode 100644
-index 0000000..5ac1dbc
---- /dev/null
-+++ b/include/asm-nios2nommu/current.h
-@@ -0,0 +1,39 @@
-+#ifndef _NIOS2NOMMU_CURRENT_H
-+#define _NIOS2NOMMU_CURRENT_H
-+/*
-+ *    current.h
-+ *    (C) Copyright 2000, Lineo, David McCullough <davidm@uclinux.org>
-+ *    (C) Copyright 2002, Greg Ungerer (gerg@snapgear.com)
-+ *    (C) Copyright 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/thread_info.h>
-+
-+struct task_struct;
-+
-+static inline struct task_struct *get_current(void)
-+{
-+      return(current_thread_info()->task);
-+}
-+
-+#define       current get_current()
-+
-+#endif /* _NIOS2NOMMU_CURRENT_H */
-diff --git a/include/asm-nios2nommu/delay.h b/include/asm-nios2nommu/delay.h
-new file mode 100644
-index 0000000..da0a184
---- /dev/null
-+++ b/include/asm-nios2nommu/delay.h
-@@ -0,0 +1,96 @@
-+#ifndef _NIOS_DELAY_H
-+#define _NIOS_DELAY_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/delay.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004      dgt     NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/param.h>
-+
-+extern __inline__ void __delay(unsigned long loops)
-+{
-+      int dummy;
-+
-+      __asm__ __volatile__(
-+        "1:  \n\t"
-+        "    beq    %0,zero,2f\n\t"
-+        "    addi   %0, %0, -1\n\t" 
-+        "    br     1b\n\t" 
-+        "2:  \n\t" 
-+
-+        :  "=r" (dummy)                     /* Need output for optimizer */
-+
-+        :  "0" (loops)                      /* %0  Input                */
-+        );
-+}
-+
-+/*
-+ * Note that 19 * 226 == 4294 ==~ 2^32 / 10^6, so
-+ * loops = (4294 * usecs * loops_per_jiffy * HZ) / 2^32.
-+ *
-+ * The mul instruction gives us loops = (a * b) / 2^32.
-+ * We choose a = usecs * 19 * HZ and b = loops_per_jiffy * 226
-+ * because this lets us support a wide range of HZ and
-+ * loops_per_jiffy values without either a or b overflowing 2^32.
-+ * Thus we need usecs * HZ <= (2^32 - 1) / 19 = 226050910 and
-+ * loops_per_jiffy <= (2^32 - 1) / 226 = 19004280
-+ * (which corresponds to ~3800 bogomips at HZ = 100).
-+ *  -- paulus
-+ */
-+#define __MAX_UDELAY  (226050910UL/HZ)        /* maximum udelay argument */
-+#define __MAX_NDELAY  (4294967295UL/HZ)       /* maximum ndelay argument */
-+
-+extern unsigned long loops_per_jiffy;
-+
-+extern __inline__ void __udelay(unsigned int x)
-+{
-+      unsigned int loops;
-+
-+      __asm__("mulxuu %0,%1,%2" : "=r" (loops) :
-+              "r" (x), "r" (loops_per_jiffy * 226));
-+      __delay(loops);
-+}
-+
-+extern __inline__ void __ndelay(unsigned int x)
-+{
-+      unsigned int loops;
-+
-+      __asm__("mulxuu %0,%1,%2" : "=r" (loops) :
-+              "r" (x), "r" (loops_per_jiffy * 5));
-+      __delay(loops);
-+}
-+
-+extern void __bad_udelay(void);               /* deliberately undefined */
-+extern void __bad_ndelay(void);               /* deliberately undefined */
-+
-+#define udelay(n) (__builtin_constant_p(n)? \
-+      ((n) > __MAX_UDELAY? __bad_udelay(): __udelay((n) * (19 * HZ))) : \
-+      __udelay((n) * (19 * HZ)))
-+
-+#define ndelay(n) (__builtin_constant_p(n)? \
-+      ((n) > __MAX_NDELAY? __bad_ndelay(): __ndelay((n) * HZ)) : \
-+      __ndelay((n) * HZ))
-+
-+#define muldiv(a, b, c)    (((a)*(b))/(c))
-+
-+#endif /* defined(_NIOS_DELAY_H) */
-diff --git a/include/asm-nios2nommu/device.h b/include/asm-nios2nommu/device.h
-new file mode 100644
-index 0000000..d8f9872
---- /dev/null
-+++ b/include/asm-nios2nommu/device.h
-@@ -0,0 +1,7 @@
-+/*
-+ * Arch specific extensions to struct device
-+ *
-+ * This file is released under the GPLv2
-+ */
-+#include <asm-generic/device.h>
-+
-diff --git a/include/asm-nios2nommu/div64.h b/include/asm-nios2nommu/div64.h
-new file mode 100644
-index 0000000..68d72e4
---- /dev/null
-+++ b/include/asm-nios2nommu/div64.h
-@@ -0,0 +1,31 @@
-+#ifndef __ASMNIOS_DIV64_H
-+#define __ASMNIOS_DIV64_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/div64.h
-+ *
-+ * Derived from m68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm-generic/div64.h>
-+
-+#endif
-+
-diff --git a/include/asm-nios2nommu/dma-mapping.h b/include/asm-nios2nommu/dma-mapping.h
-new file mode 100644
-index 0000000..6289370
---- /dev/null
-+++ b/include/asm-nios2nommu/dma-mapping.h
-@@ -0,0 +1,79 @@
-+#ifndef _ASM_DMA_MAPPING_H
-+#define _ASM_DMA_MAPPING_H
-+
-+#include <asm/scatterlist.h>
-+#include <asm/cache.h>
-+
-+void *dma_alloc_noncoherent(struct device *dev, size_t size,
-+                         dma_addr_t *dma_handle, gfp_t flag);
-+
-+void dma_free_noncoherent(struct device *dev, size_t size,
-+                       void *vaddr, dma_addr_t dma_handle);
-+
-+void *dma_alloc_coherent(struct device *dev, size_t size,
-+                         dma_addr_t *dma_handle, gfp_t flag);
-+
-+void dma_free_coherent(struct device *dev, size_t size,
-+                       void *vaddr, dma_addr_t dma_handle);
-+
-+extern dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
-+      enum dma_data_direction direction);
-+extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
-+      size_t size, enum dma_data_direction direction);
-+extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-+      enum dma_data_direction direction);
-+extern dma_addr_t dma_map_page(struct device *dev, struct page *page,
-+      unsigned long offset, size_t size, enum dma_data_direction direction);
-+extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
-+      size_t size, enum dma_data_direction direction);
-+extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
-+      int nhwentries, enum dma_data_direction direction);
-+extern void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
-+      size_t size, enum dma_data_direction direction);
-+extern void dma_sync_single_for_device(struct device *dev,
-+      dma_addr_t dma_handle, size_t size, enum dma_data_direction direction);
-+extern void dma_sync_single_range_for_cpu(struct device *dev,
-+      dma_addr_t dma_handle, unsigned long offset, size_t size,
-+      enum dma_data_direction direction);
-+extern void dma_sync_single_range_for_device(struct device *dev,
-+      dma_addr_t dma_handle, unsigned long offset, size_t size,
-+      enum dma_data_direction direction);
-+extern void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
-+      int nelems, enum dma_data_direction direction);
-+extern void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
-+      int nelems, enum dma_data_direction direction);
-+extern int dma_mapping_error(dma_addr_t dma_addr);
-+extern int dma_supported(struct device *dev, u64 mask);
-+
-+static inline int
-+dma_set_mask(struct device *dev, u64 mask)
-+{
-+      if(!dev->dma_mask || !dma_supported(dev, mask))
-+              return -EIO;
-+
-+      *dev->dma_mask = mask;
-+
-+      return 0;
-+}
-+
-+static inline int
-+dma_get_cache_alignment(void)
-+{
-+      /* XXX Largest on any MIPS */
-+      return 128;
-+}
-+
-+extern int dma_is_consistent(dma_addr_t dma_addr);
-+
-+extern void dma_cache_sync(void *vaddr, size_t size,
-+             enum dma_data_direction direction);
-+
-+// #define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
-+// 
-+// extern int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
-+//    dma_addr_t device_addr, size_t size, int flags);
-+// extern void dma_release_declared_memory(struct device *dev);
-+// extern void * dma_mark_declared_memory_occupied(struct device *dev,
-+//    dma_addr_t device_addr, size_t size);
-+
-+#endif /* _ASM_DMA_MAPPING_H */
-diff --git a/include/asm-nios2nommu/dma.h b/include/asm-nios2nommu/dma.h
-new file mode 100644
-index 0000000..ea098d5
---- /dev/null
-+++ b/include/asm-nios2nommu/dma.h
-@@ -0,0 +1,63 @@
-+/* $Id: dma.h,v 1.1 2006/07/05 06:20:25 gerg Exp $
-+ *
-+ * Copyright 2004 (C) Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _ASM_NIOS2_DMA_H
-+#define _ASM_NIOS2_DMA_H
-+
-+#include <linux/kernel.h>
-+#include <asm/asm-offsets.h>
-+
-+#define MAX_DMA_ADDRESS       (LINUX_SDRAM_END)
-+
-+int request_dma(unsigned int, const char *);
-+void free_dma(unsigned int);
-+void enable_dma(unsigned int dmanr);
-+void disable_dma(unsigned int dmanr);
-+void set_dma_count(unsigned int dmanr, unsigned int count);
-+int get_dma_residue(unsigned int dmanr);
-+void nios2_set_dma_data_width(unsigned int dmanr, unsigned int width);
-+
-+void nios2_set_dma_handler(unsigned int dmanr, int (*handler)(void*, int), void* user);
-+int nios2_request_dma(const char *);
-+
-+void nios2_set_dma_mode(unsigned int dmanr, unsigned int mode);
-+void nios2_set_dma_rcon(unsigned int dmanr, unsigned int set);
-+void nios2_set_dma_wcon(unsigned int dmanr, unsigned int set);
-+void nios2_set_dma_raddr(unsigned int dmanr, unsigned int a);
-+void nios2_set_dma_waddr(unsigned int dmanr, unsigned int a);
-+
-+static inline unsigned long claim_dma_lock(void)
-+{
-+}
-+
-+static inline void release_dma_lock(unsigned long flags)
-+{
-+}
-+
-+#ifdef CONFIG_PCI
-+extern int isa_dma_bridge_buggy;
-+#else
-+#define isa_dma_bridge_buggy  (0)
-+#endif
-+
-+#endif /* !(_ASM_NIOS2_DMA_H) */
-diff --git a/include/asm-nios2nommu/elf.h b/include/asm-nios2nommu/elf.h
-new file mode 100644
-index 0000000..94b2ac0
---- /dev/null
-+++ b/include/asm-nios2nommu/elf.h
-@@ -0,0 +1,140 @@
-+#ifndef __NIOS2_ELF_H
-+#define __NIOS2_ELF_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/elf.h
-+ *
-+ * Nio2 ELF relocation types
-+ *
-+ * Derived from M68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ * Mar/18/2004                xwt             NiosII relocation types added
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <asm/ptrace.h>
-+#include <asm/user.h>
-+
-+#define R_NIOS2_NONE                  0
-+#define R_NIOS2_S16                           1
-+#define R_NIOS2_U16                           2
-+#define R_NIOS2_PCREL16                       3
-+#define R_NIOS2_CALL26                        4
-+#define R_NIOS2_IMM5                  5
-+#define R_NIOS2_CACHE_OPX             6
-+#define R_NIOS2_IMM6                  7
-+#define R_NIOS2_IMM8                  8
-+#define R_NIOS2_HI16                  9
-+#define R_NIOS2_LO16                  10
-+#define R_NIOS2_HIADJ16               11
-+#define R_NIOS2_BFD_RELOC_32  12
-+#define R_NIOS2_BFD_RELOC_16  13
-+#define R_NIOS2_BFD_RELOC_8   14
-+#define R_NIOS2_GPREL                 15
-+#define R_NIOS2_GNU_VTINHERIT         16
-+#define R_NIOS2_GNU_VTENTRY   17
-+#define R_NIOS2_UJMP                  18
-+#define R_NIOS2_CJMP                  19
-+#define R_NIOS2_CALLR                 20
-+#define R_NIOS2_ALIGN                 21
-+/* Keep this the last entry.  */
-+#define R_NIOS2_NUM                           22
-+
-+typedef unsigned long elf_greg_t;
-+
-+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
-+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
-+
-+typedef unsigned long elf_fpregset_t;
-+
-+/*
-+ * This is used to ensure we don't load something for the wrong architecture.
-+ */
-+#define elf_check_arch(x) \
-+      ((x)->e_machine == EM_ALTERA_NIOS2)
-+
-+/*
-+ * These are used to set parameters in the core dumps.
-+ */
-+#define ELF_CLASS     ELFCLASS32
-+#define ELF_DATA      ELFDATA2LSB
-+#define ELF_ARCH      EM_ALTERA_NIOS2
-+
-+#define ELF_PLAT_INIT(_r, load_addr)  _r->a1 = 0
-+
-+#define USE_ELF_CORE_DUMP
-+#define ELF_EXEC_PAGESIZE     4096
-+
-+/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
-+   use of this is to invoke "./ld.so someprog" to test out a new version of
-+   the loader.  We need to make sure that it is out of the way of the program
-+   that it will "exec", and that there is sufficient room for the brk.  */
-+
-+#define ELF_ET_DYN_BASE         0xD0000000UL
-+
-+/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is
-+   now struct_user_regs, they are different) */
-+
-+#define ELF_CORE_COPY_REGS(pr_reg, regs)                              \
-+      /* Bleech. */                                                   \
-+      pr_reg[0] = regs->r1;                                           \
-+      pr_reg[1] = regs->r2;                                           \
-+      pr_reg[2] = regs->r3;                                           \
-+      pr_reg[3] = regs->r4;                                           \
-+      pr_reg[4] = regs->r5;                                           \
-+      pr_reg[5] = regs->r6;                                           \
-+      pr_reg[6] = regs->r7;                                           \
-+      pr_reg[7] = regs->r8;                                           \
-+      pr_reg[8] = regs->r9;                                           \
-+      pr_reg[9] = regs->r10;                                          \
-+      pr_reg[10] = regs->r11;                                         \
-+      pr_reg[11] = regs->r12;                                         \
-+      pr_reg[12] = regs->r13;                                         \
-+      pr_reg[13] = regs->r14;                                         \
-+      pr_reg[14] = regs->r15;                                         \
-+      pr_reg[23] = regs->sp;                                          \
-+      pr_reg[26] = regs->estatus;                                     \
-+      {                                                               \
-+        struct switch_stack *sw = ((struct switch_stack *)regs) - 1;  \
-+        pr_reg[15] = sw->r16;                                         \
-+        pr_reg[16] = sw->r17;                                         \
-+        pr_reg[17] = sw->r18;                                         \
-+        pr_reg[18] = sw->r19;                                         \
-+        pr_reg[19] = sw->r20;                                         \
-+        pr_reg[20] = sw->r21;                                         \
-+        pr_reg[21] = sw->r22;                                         \
-+        pr_reg[22] = sw->r23;                                         \
-+        pr_reg[24] = sw->fp;                                          \
-+        pr_reg[25] = sw->gp;                                          \
-+      }
-+
-+/* This yields a mask that user programs can use to figure out what
-+   instruction set this cpu supports.  */
-+
-+#define ELF_HWCAP     (0)
-+
-+/* This yields a string that ld.so will use to load implementation
-+   specific libraries for optimization.  This is more specific in
-+   intent than poking at uname or /proc/cpuinfo.  */
-+
-+#define ELF_PLATFORM  (NULL)
-+
-+#ifdef __KERNEL__
-+#define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
-+#endif
-+
-+#endif
-diff --git a/include/asm-nios2nommu/emergency-restart.h b/include/asm-nios2nommu/emergency-restart.h
-new file mode 100644
-index 0000000..108d8c4
---- /dev/null
-+++ b/include/asm-nios2nommu/emergency-restart.h
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_EMERGENCY_RESTART_H
-+#define _ASM_EMERGENCY_RESTART_H
-+
-+#include <asm-generic/emergency-restart.h>
-+
-+#endif /* _ASM_EMERGENCY_RESTART_H */
-diff --git a/include/asm-nios2nommu/entry.h b/include/asm-nios2nommu/entry.h
-new file mode 100644
-index 0000000..4b1773f
---- /dev/null
-+++ b/include/asm-nios2nommu/entry.h
-@@ -0,0 +1,187 @@
-+/*
-+ * Hacked from m68knommu port.
-+ *
-+ *  Copyright(C) 2004 Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2NOMMU_ENTRY_H
-+#define __NIOS2NOMMU_ENTRY_H
-+
-+#ifdef __ASSEMBLY__
-+
-+#include <asm/setup.h>
-+#include <asm/page.h>
-+#include <asm/asm-offsets.h>
-+
-+/*
-+ * Stack layout in 'ret_from_exception':
-+ *
-+ * This allows access to the syscall arguments in registers r4-r8
-+ *
-+ *     0(sp) - r8
-+ *     4(sp) - r9
-+ *     8(sp) - r10
-+ *     C(sp) - r11
-+ *    10(sp) - r12
-+ *    14(sp) - r13
-+ *    18(sp) - r14
-+ *    1C(sp) - r15
-+ *    20(sp) - r1
-+ *    24(sp) - r2
-+ *    28(sp) - r3
-+ *    2C(sp) - r4
-+ *    30(sp) - r5
-+ *    34(sp) - r6
-+ *    38(sp) - r7
-+ *    3C(sp) - orig_r2
-+ *    40(sp) - ra
-+ *    44(sp) - fp
-+ *    48(sp) - sp
-+ *    4C(sp) - gp
-+ *    50(sp) - estatus
-+ *    54(sp) - status_extension
-+ *    58(sp) - ea
-+ *
-+ */
-+
-+/* process bits for task_struct.flags */
-+PF_TRACESYS_OFF = 3
-+PF_TRACESYS_BIT = 5
-+PF_PTRACED_OFF = 3
-+PF_PTRACED_BIT = 4
-+PF_DTRACE_OFF = 1
-+PF_DTRACE_BIT = 5
-+
-+LENOSYS = 38
-+
-+/*
-+ * This defines the normal kernel pt-regs layout.
-+ *
-+ */
-+
-+/*
-+ * Standard Nios2 interrupt entry and exit macros.
-+ * Must be called with interrupts disabled.
-+ */
-+.macro SAVE_ALL
-+      movia   r24,status_extension    // Read status extension
-+      ldw     r24,0(r24)
-+      andi    r24,r24,PS_S_ASM
-+      bne     r24,r0,1f               // In supervisor mode, already on kernel stack
-+      movia   r24,_current_thread     // Switch to current kernel stack
-+      ldw     r24,0(r24)              //  using the thread_info
-+      addi    r24,r24,THREAD_SIZE_ASM-PT_REGS_SIZE
-+      stw     sp,PT_SP(r24)           // Save user stack before changing
-+      mov     sp,r24
-+      br      2f
-+
-+1:    mov     r24,sp
-+      addi    sp,sp,-PT_REGS_SIZE     // Backup the kernel stack pointer
-+      stw     r24,PT_SP(sp)
-+2:    stw     r1,PT_R1(sp)
-+      stw     r2,PT_R2(sp)
-+      stw     r3,PT_R3(sp)
-+      stw     r4,PT_R4(sp)
-+      stw     r5,PT_R5(sp)
-+      stw     r6,PT_R6(sp)
-+      stw     r7,PT_R7(sp)
-+      stw     r8,PT_R8(sp)
-+      stw     r9,PT_R9(sp)
-+      stw     r10,PT_R10(sp)
-+      stw     r11,PT_R11(sp)
-+      stw     r12,PT_R12(sp)
-+      stw     r13,PT_R13(sp)
-+      stw     r14,PT_R14(sp)
-+      stw     r15,PT_R15(sp)
-+      stw     r2,PT_ORIG_R2(sp)
-+      stw     ra,PT_RA(sp)
-+      stw     fp,PT_FP(sp)
-+      stw     gp,PT_GP(sp)
-+      rdctl   r24,estatus
-+      stw     r24,PT_ESTATUS(sp)
-+      movia   r24,status_extension    // Read status extension
-+      ldw     r1,0(r24)
-+      stw     r1,PT_STATUS_EXTENSION(sp)      // Store user/supervisor status
-+      ORI32   r1,r1,PS_S_ASM                  // Set supervisor mode
-+      stw     r1,0(r24)
-+      stw     ea,PT_EA(sp)
-+.endm
-+
-+.macro RESTORE_ALL
-+      ldw     r1,PT_STATUS_EXTENSION(sp)      // Restore user/supervisor status
-+      movia   r24,status_extension
-+      stw     r1,0(r24)
-+      ldw     r1,PT_R1(sp)            // Restore registers
-+      ldw     r2,PT_R2(sp)
-+      ldw     r3,PT_R3(sp)
-+      ldw     r4,PT_R4(sp)
-+      ldw     r5,PT_R5(sp)
-+      ldw     r6,PT_R6(sp)
-+      ldw     r7,PT_R7(sp)
-+      ldw     r8,PT_R8(sp)
-+      ldw     r9,PT_R9(sp)
-+      ldw     r10,PT_R10(sp)
-+      ldw     r11,PT_R11(sp)
-+      ldw     r12,PT_R12(sp)
-+      ldw     r13,PT_R13(sp)
-+      ldw     r14,PT_R14(sp)
-+      ldw     r15,PT_R15(sp)
-+      ldw     ra,PT_RA(sp)
-+      ldw     fp,PT_FP(sp)
-+      ldw     gp,PT_GP(sp)
-+      ldw     r24,PT_ESTATUS(sp)
-+      wrctl   estatus,r24
-+      ldw     ea,PT_EA(sp)
-+      ldw     sp,PT_SP(sp)            // Restore sp last
-+.endm
-+
-+.macro        SAVE_SWITCH_STACK
-+      addi    sp,sp,-SWITCH_STACK_SIZE
-+      stw     r16,SW_R16(sp)
-+      stw     r17,SW_R17(sp)
-+      stw     r18,SW_R18(sp)
-+      stw     r19,SW_R19(sp)
-+      stw     r20,SW_R20(sp)
-+      stw     r21,SW_R21(sp)
-+      stw     r22,SW_R22(sp)
-+      stw     r23,SW_R23(sp)
-+      stw     fp,SW_FP(sp)
-+      stw     gp,SW_GP(sp)
-+      stw     ra,SW_RA(sp)
-+.endm
-+
-+.macro        RESTORE_SWITCH_STACK
-+      ldw     r16,SW_R16(sp)
-+      ldw     r17,SW_R17(sp)
-+      ldw     r18,SW_R18(sp)
-+      ldw     r19,SW_R19(sp)
-+      ldw     r20,SW_R20(sp)
-+      ldw     r21,SW_R21(sp)
-+      ldw     r22,SW_R22(sp)
-+      ldw     r23,SW_R23(sp)
-+      ldw     fp,SW_FP(sp)
-+      ldw     gp,SW_GP(sp)
-+      ldw     ra,SW_RA(sp)
-+      addi    sp,sp,SWITCH_STACK_SIZE
-+.endm
-+
-+#endif /* __ASSEMBLY__ */
-+#endif /* __NIOS2NOMMU_ENTRY_H */
-diff --git a/include/asm-nios2nommu/errno.h b/include/asm-nios2nommu/errno.h
-new file mode 100644
-index 0000000..c2caf21
---- /dev/null
-+++ b/include/asm-nios2nommu/errno.h
-@@ -0,0 +1,6 @@
-+#ifndef _NIOS2NOMMU_ERRNO_H
-+#define _NIOS2NOMMU_ERRNO_H
-+
-+#include <asm-generic/errno.h>
-+
-+#endif /* _NIOS2NOMMU_ERRNO_H */
-diff --git a/include/asm-nios2nommu/fcntl.h b/include/asm-nios2nommu/fcntl.h
-new file mode 100644
-index 0000000..9d98af2
---- /dev/null
-+++ b/include/asm-nios2nommu/fcntl.h
-@@ -0,0 +1,11 @@
-+#ifndef _NIOS2_FCNTL_H
-+#define _NIOS2_FCNTL_H
-+
-+#define O_DIRECTORY   040000  /* must be a directory */
-+#define O_NOFOLLOW    0100000 /* don't follow links */
-+#define O_DIRECT      0200000 /* direct disk access hint - currently ignored */
-+#define O_LARGEFILE   0400000
-+
-+#include <asm-generic/fcntl.h>
-+
-+#endif /* _NIOS2_FCNTL_H */
-diff --git a/include/asm-nios2nommu/flat.h b/include/asm-nios2nommu/flat.h
-new file mode 100644
-index 0000000..681329a
---- /dev/null
-+++ b/include/asm-nios2nommu/flat.h
-@@ -0,0 +1,129 @@
-+/*
-+ * include/asm-nios2nommu/flat.h -- uClinux bFLT relocations
-+ *
-+ *  Copyright (C) 2004,05  Microtronix Datacom Ltd
-+ *
-+ * This file is subject to the terms and conditions of the GNU General
-+ * Public License.  See the file COPYING in the main directory of this
-+ * archive for more details.
-+ *
-+ * Written by Wentao Xu <wentao@microtronix.com>
-+ */
-+
-+#ifndef __NIOS2_FLAT_H__
-+#define __NIOS2_FLAT_H__
-+
-+#define       flat_reloc_valid(reloc, size)   ((reloc) <= (size + 0x8000))
-+
-+/* The stack is 64-bit aligned for Nios II, so (sp - 1) shall
-+ * be 64-bit aligned, where -1 is for argc
-+ */
-+#define       flat_stack_align(sp)            (sp = (unsigned long *)(((unsigned long)sp - 1) & (-8)))
-+
-+/* The uClibc port for Nios II expects the argc is followed by argv and envp */
-+#define       flat_argvp_envp_on_stack()      1
-+
-+#define       flat_old_ram_flag(flags)        (flags)
-+
-+/* We store the type of relocation in the top 4 bits of the `relval.' */
-+
-+/* Convert a relocation entry into an address.  */
-+static inline unsigned long
-+flat_get_relocate_addr (unsigned long relval)
-+{
-+      return relval & 0x0fffffff; /* Mask out top 4-bits */
-+}
-+
-+#define FLAT_NIOS2_RELOC_TYPE(relval) ((relval) >> 28)
-+
-+#define FLAT_NIOS2_R_32                       0 /* Normal 32-bit reloc */
-+#define FLAT_NIOS2_R_HI_LO            1 /* High 16-bits + low 16-bits field */
-+#define FLAT_NIOS2_R_HIADJ_LO 2 /* High 16-bits adjust + low 16-bits field */
-+#define FLAT_NIOS2_R_CALL26           4 /* Call imm26 */
-+
-+#define flat_set_persistent(relval, p)        0
-+
-+/* Extract the address to be relocated from the symbol reference at rp;
-+ * relval is the raw relocation-table entry from which RP is derived.
-+ * rp shall always be 32-bit aligned
-+ */
-+static inline unsigned long flat_get_addr_from_rp (unsigned long *rp,
-+                                                 unsigned long relval,
-+                                                 unsigned long flags,
-+                                                 unsigned long *persistent)
-+{
-+      switch (FLAT_NIOS2_RELOC_TYPE(relval))
-+      {
-+      case FLAT_NIOS2_R_32:
-+              /* Simple 32-bit address. The loader expect it in bigger endian */
-+              return htonl(*rp);
-+
-+      case FLAT_NIOS2_R_HI_LO:
-+              /* get the two 16-bit immediate value from instructions, then
-+               * construct a 32-bit value. Again the loader expect bigger endian
-+               */
-+              return htonl ((((rp[0] >> 6) & 0xFFFF) << 16 ) | 
-+                                        ((rp[1] >> 6) & 0xFFFF));
-+
-+      case FLAT_NIOS2_R_HIADJ_LO:
-+              {
-+              /* get the two 16-bit immediate value from instructions, then
-+               * construct a 32-bit value. Again the loader expect bigger endian
-+               */
-+               unsigned int low, high;
-+               high = (rp[0] >> 6) & 0xFFFF;
-+               low  = (rp[1] >> 6) & 0xFFFF;
-+               
-+               if ((low >> 15) & 1) high--;
-+               
-+               return htonl ((high << 16 ) | low );
-+              }
-+      case FLAT_NIOS2_R_CALL26:
-+              /* the 26-bit immediate value is actually 28-bit */
-+              return htonl(((*rp) >> 6) << 2);
-+
-+      default:
-+              return ~0;      /* bogus value */
-+      }
-+}
-+
-+/* Insert the address addr into the symbol reference at rp;
-+ * relval is the raw relocation-table entry from which rp is derived.
-+ * rp shall always be 32-bit aligned
-+ */
-+static inline void flat_put_addr_at_rp (unsigned long *rp, unsigned long addr,
-+                                      unsigned long relval)
-+{
-+      unsigned long exist_val;
-+      switch (FLAT_NIOS2_RELOC_TYPE (relval)) {
-+      case FLAT_NIOS2_R_32:
-+              /* Simple 32-bit address.  */
-+              *rp = addr;
-+              break;
-+
-+      case FLAT_NIOS2_R_HI_LO:
-+              exist_val = rp[0];
-+              rp[0] = ((((exist_val >> 22) << 16) | (addr >> 16)) << 6) | (exist_val & 0x3F);
-+              exist_val = rp[1];
-+              rp[1] = ((((exist_val >> 22) << 16) | (addr & 0xFFFF)) << 6) | (exist_val & 0x3F);
-+              break;
-+
-+      case FLAT_NIOS2_R_HIADJ_LO:
-+              {
-+              unsigned int high = (addr >> 16);
-+              if ((addr >> 15) & 1) 
-+                      high = (high + 1) & 0xFFFF;
-+              exist_val = rp[0];
-+              rp[0] = ((((exist_val >> 22) << 16) | high) << 6) | (exist_val & 0x3F);
-+              exist_val = rp[1];
-+              rp[1] = ((((exist_val >> 22) << 16) | (addr & 0xFFFF)) << 6) | (exist_val & 0x3F);
-+              break;
-+              }
-+      case FLAT_NIOS2_R_CALL26:
-+              /* the opcode of CALL is 0, so just store the value */
-+              *rp = ((addr >> 2) << 6);
-+              break;
-+      }
-+}
-+
-+#endif /* __NIOS2_FLAT_H__ */
-diff --git a/include/asm-nios2nommu/futex.h b/include/asm-nios2nommu/futex.h
-new file mode 100644
-index 0000000..6a332a9
---- /dev/null
-+++ b/include/asm-nios2nommu/futex.h
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_FUTEX_H
-+#define _ASM_FUTEX_H
-+
-+#include <asm-generic/futex.h>
-+
-+#endif
-diff --git a/include/asm-nios2nommu/gpio.h b/include/asm-nios2nommu/gpio.h
-new file mode 100644
-index 0000000..b91937b
---- /dev/null
-+++ b/include/asm-nios2nommu/gpio.h
-@@ -0,0 +1,11 @@
-+#ifndef _ASM_GPIO_H_
-+#define _ASM_GPIO_H_ 1
-+
-+
-+struct gpio_i2c_pins {
-+      unsigned sda_pin;
-+      unsigned scl_pin;
-+};
-+
-+#endif /*_ASM_GPIO_*/
-+
-diff --git a/include/asm-nios2nommu/hardirq.h b/include/asm-nios2nommu/hardirq.h
-new file mode 100644
-index 0000000..0041f51
---- /dev/null
-+++ b/include/asm-nios2nommu/hardirq.h
-@@ -0,0 +1,43 @@
-+/*
-+ * Ported from m68knommu
-+ *
-+ * Copyright (C) 2003, Microtronix Datacom Ltd.
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#ifndef __NIOS2_HARDIRQ_H
-+#define __NIOS2_HARDIRQ_H
-+
-+#include <linux/cache.h>
-+#include <linux/threads.h>
-+
-+typedef struct {
-+      unsigned int __softirq_pending;
-+} ____cacheline_aligned irq_cpustat_t;
-+
-+#include <linux/irq_cpustat.h>        /* Standard mappings for irq_cpustat_t above */
-+
-+#define HARDIRQ_BITS  8
-+
-+#ifdef CONFIG_SMP
-+# error nios2nommu SMP is not available
-+#endif /* CONFIG_SMP */
-+
-+#endif /* __NIOS2_HARDIRQ_H */
-diff --git a/include/asm-nios2nommu/hdreg.h b/include/asm-nios2nommu/hdreg.h
-new file mode 100644
-index 0000000..b4d910a
---- /dev/null
-+++ b/include/asm-nios2nommu/hdreg.h
-@@ -0,0 +1,30 @@
-+/*
-+ *  Copyright (C) 1994-1996  Linus Torvalds & authors
-+ *  Copyright (C) 2002  Wentau Xu (www.microtronix.com)
-+ *  copyright (C) 2004  Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2_HDREG_H
-+#define __NIOS2_HDREG_H
-+
-+typedef unsigned long ide_ioreg_t;
-+
-+#endif /* __NIOS2_HDREG_H */
-diff --git a/include/asm-nios2nommu/hw_irq.h b/include/asm-nios2nommu/hw_irq.h
-new file mode 100644
-index 0000000..d2fd3be
---- /dev/null
-+++ b/include/asm-nios2nommu/hw_irq.h
-@@ -0,0 +1,16 @@
-+#ifndef _ASM_HW_IRQ_H
-+#define _ASM_HW_IRQ_H
-+
-+/*
-+ *    linux/include/asm/hw_irq.h
-+ *
-+ *    (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
-+ *
-+ *    moved some of the old arch/i386/kernel/irq.h to here. VY
-+ *
-+ *    IRQ/IPI changes taken from work by Thomas Radke
-+ *    <tomsoft@informatik.tu-chemnitz.de>
-+ */
-+
-+
-+#endif /* _ASM_HW_IRQ_H */
-diff --git a/include/asm-nios2nommu/ide.h b/include/asm-nios2nommu/ide.h
-new file mode 100644
-index 0000000..f8ef9ad
---- /dev/null
-+++ b/include/asm-nios2nommu/ide.h
-@@ -0,0 +1,40 @@
-+/*
-+ *  linux/include/asm-niosnommu2/ide.h
-+ *
-+ *  Copyright (C) 1994-1996  Linus Torvalds & authors
-+ *  Copyright (C) 2004             Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __ASMNIOS2_IDE_H
-+#define __ASMNIOS2_IDE_H
-+
-+#ifdef __KERNEL__
-+#undef MAX_HWIFS              /* we're going to force it */
-+
-+#ifndef MAX_HWIFS
-+#define MAX_HWIFS     1
-+#endif
-+
-+#include <asm-generic/ide_iops.h>
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* __ASMNIOS2_IDE_H */
-diff --git a/include/asm-nios2nommu/init.h b/include/asm-nios2nommu/init.h
-new file mode 100644
-index 0000000..8641f4f
---- /dev/null
-+++ b/include/asm-nios2nommu/init.h
-@@ -0,0 +1,22 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#error "<asm/init.h> should never be used - use <linux/init.h> instead"
-diff --git a/include/asm-nios2nommu/io.h b/include/asm-nios2nommu/io.h
-new file mode 100644
-index 0000000..d0e3741
---- /dev/null
-+++ b/include/asm-nios2nommu/io.h
-@@ -0,0 +1,277 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2_IO_H
-+#define __NIOS2_IO_H
-+
-+#ifdef __KERNEL__
-+
-+#include <linux/kernel.h>
-+
-+#include <asm/page.h>      /* IO address mapping routines need this */
-+#include <asm/system.h>
-+#include <asm/unaligned.h>
-+
-+extern void insw(unsigned long port, void *dst, unsigned long count);
-+extern void outsw(unsigned long port, void *src, unsigned long count);
-+extern void insl(unsigned long port, void *dst, unsigned long count);
-+extern void outsl(unsigned long port, void *src, unsigned long count);
-+
-+#define readsb(p,d,l)         insb(p,d,l)
-+#define readsw(p,d,l)         insw(p,d,l)
-+#define readsl(p,d,l)         insl(p,d,l)
-+#define writesb(p,d,l)                outsb(p,d,l)
-+#define writesw(p,d,l)                outsw(p,d,l)
-+#define writesl(p,d,l)                outsl(p,d,l)
-+#ifndef irq_canonicalize
-+#define irq_canonicalize(i)   (i)
-+#endif
-+
-+#endif /* __KERNEL__ */
-+/* IO macros are needed by userspace programs */
-+
-+/*
-+ * readX/writeX() are used to access memory mapped devices. On some
-+ * architectures the memory mapped IO stuff needs to be accessed
-+ * differently. On the Nios architecture, we just read/write the
-+ * memory location directly.
-+ */
-+
-+#define readb(addr)   \
-+({                                            \
-+      unsigned char __res;\
-+      __asm__ __volatile__( \
-+              "ldbuio %0, 0(%1)" \
-+              : "=r"(__res)   \
-+              : "r" (addr));  \
-+      __res;                          \
-+})
-+
-+#define readw(addr)   \
-+({                                            \
-+      unsigned short __res;\
-+      __asm__ __volatile__( \
-+              "ldhuio %0, 0(%1)" \
-+              : "=r"(__res)   \
-+              : "r" (addr));  \
-+      __res;                          \
-+})
-+
-+#define readl(addr)   \
-+({                                            \
-+      unsigned int __res;\
-+      __asm__ __volatile__( \
-+              "ldwio %0, 0(%1)" \
-+              : "=r"(__res)   \
-+              : "r" (addr));  \
-+      __res;                          \
-+})
-+
-+#define writeb(b,addr)        \
-+({                                            \
-+      __asm__ __volatile__( \
-+              "stbio %0, 0(%1)" \
-+              : : "r"(b), "r" (addr));        \
-+})
-+
-+#define writew(b,addr)        \
-+({                                            \
-+      __asm__ __volatile__( \
-+              "sthio %0, 0(%1)" \
-+              : : "r"(b), "r" (addr));        \
-+})
-+
-+#define writel(b,addr)        \
-+({                                            \
-+      __asm__ __volatile__( \
-+              "stwio %0, 0(%1)" \
-+              : : "r"(b), "r" (addr));        \
-+})
-+
-+#define __raw_readb readb
-+#define __raw_readw readw
-+#define __raw_readl readl
-+#define __raw_writeb writeb
-+#define __raw_writew writew
-+#define __raw_writel writel
-+
-+#define mmiowb()
-+
-+/*
-+ *    make the short names macros so specific devices
-+ *    can override them as required
-+ */
-+
-+#define memset_io(addr,c,len) memset((void *)(((unsigned int)(addr)) | 0x80000000),(c),(len))
-+#define memcpy_fromio(to,from,len)    memcpy((to),(void *)(((unsigned int)(from)) | 0x80000000),(len))
-+#define memcpy_toio(to,from,len)      memcpy((void *)(((unsigned int)(to)) | 0x80000000),(from),(len))
-+
-+#define inb(addr)    readb(addr)
-+#define inw(addr)    readw(addr)
-+#define inl(addr)    readl(addr)
-+
-+#define outb(x,addr) ((void) writeb(x,addr))
-+#define outw(x,addr) ((void) writew(x,addr))
-+#define outl(x,addr) ((void) writel(x,addr))
-+
-+#define inb_p(addr)    inb(addr)
-+#define inw_p(addr)    inw(addr)
-+#define inl_p(addr)    inl(addr)
-+
-+#define outb_p(x,addr) outb(x,addr)
-+#define outw_p(x,addr) outw(x,addr)
-+#define outl_p(x,addr) outl(x,addr)
-+
-+/* IO macros are needed by userspace programs */
-+#ifdef __KERNEL__
-+
-+extern inline void insb(unsigned long port, void *dst, unsigned long count)
-+{
-+      unsigned char *p=(unsigned char*)dst;
-+      while (count--)
-+              *p++ = inb(port);
-+}
-+
-+/* See arch/niosnommu/io.c for optimized version */
-+extern inline void _insw(unsigned long port, void *dst, unsigned long count)
-+{
-+      unsigned short *p=(unsigned short*)dst;
-+      while (count--)
-+              *p++ = inw(port);
-+}
-+
-+/* See arch/niosnommu/kernel/io.c for unaligned destination pointer */
-+extern inline void _insl(unsigned long port, void *dst, unsigned long count)
-+{
-+      unsigned long *p=(unsigned long*)dst;
-+      while (count--)
-+              *p++ = inl(port);
-+}
-+
-+extern inline void outsb(unsigned long port, void *src, unsigned long count)
-+{
-+      unsigned char *p=(unsigned char*)src;
-+      while (count--) 
-+        outb( *p++, port );
-+}
-+
-+/* See arch/niosnommu/io.c for optimized version */
-+extern inline void _outsw(unsigned long port, void *src, unsigned long count)
-+{
-+      unsigned short *p=(unsigned short*)src;
-+      while (count--) 
-+        outw( *p++, port );
-+}
-+
-+/* See arch/niosnommu/kernel/io.c for unaligned source pointer */
-+extern inline void _outsl(unsigned long port, void *src, unsigned long count)
-+{
-+      unsigned long *p=(unsigned long*)src;
-+      while (count--) 
-+        outl( *p++, port );
-+}
-+
-+
-+
-+extern inline void mapioaddr(unsigned long physaddr, unsigned long virt_addr,
-+                           int bus, int rdonly)
-+{
-+      return;
-+}
-+
-+//vic - copied from m68knommu
-+
-+/* Values for nocacheflag and cmode */
-+#define IOMAP_FULL_CACHING            0
-+#define IOMAP_NOCACHE_SER             1
-+#define IOMAP_NOCACHE_NONSER          2
-+#define IOMAP_WRITETHROUGH            3
-+
-+extern void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag);
-+extern void __iounmap(void *addr, unsigned long size);
-+
-+extern inline void *ioremap(unsigned long physaddr, unsigned long size)
-+{
-+      return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
-+}
-+extern inline void *ioremap_nocache(unsigned long physaddr, unsigned long size)
-+{
-+      return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
-+}
-+extern inline void *ioremap_writethrough(unsigned long physaddr, unsigned long size)
-+{
-+      return __ioremap(physaddr, size, IOMAP_WRITETHROUGH);
-+}
-+extern inline void *ioremap_fullcache(unsigned long physaddr, unsigned long size)
-+{
-+      return __ioremap(physaddr, size, IOMAP_FULL_CACHING);
-+}
-+
-+extern void iounmap(void *addr);
-+
-+
-+#define IO_SPACE_LIMIT 0xffffffff
-+
-+#define dma_cache_inv(_start,_size)           dcache_push(_start,_size)
-+#define dma_cache_wback(_start,_size)         dcache_push(_start,_size)
-+#define dma_cache_wback_inv(_start,_size)     dcache_push(_start,_size)
-+
-+/* Pages to physical address... */
-+#define page_to_phys(page)      page_to_virt(page)
-+#define page_to_bus(page)       page_to_virt(page)
-+
-+#define mm_ptov(vaddr)                ((void *) (vaddr))
-+#define mm_vtop(vaddr)                ((unsigned long) (vaddr))
-+#define phys_to_virt(vaddr)   ((void *) (vaddr))
-+#define virt_to_phys(vaddr)   ((unsigned long) (vaddr))
-+
-+#define virt_to_bus virt_to_phys
-+#define bus_to_virt phys_to_virt
-+
-+#define ioport_map(port, nr)  ioremap(port, nr)
-+#define ioport_unmap(port)    iounmap(port)
-+
-+/*
-+ * 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
-+
-+#define readsb(p,d,l)         insb(p,d,l)
-+#define readsw(p,d,l)         insw(p,d,l)
-+#define readsl(p,d,l)         insl(p,d,l)
-+#define writesb(p,d,l)                outsb(p,d,l)
-+#define writesw(p,d,l)                outsw(p,d,l)
-+#define writesl(p,d,l)                outsl(p,d,l)
-+#ifndef irq_canonicalize
-+#define irq_canonicalize(i)   (i)
-+#endif
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* !(__NIOS2_IO_H) */
-+
-diff --git a/include/asm-nios2nommu/ioctl.h b/include/asm-nios2nommu/ioctl.h
-new file mode 100644
-index 0000000..c02a36a
---- /dev/null
-+++ b/include/asm-nios2nommu/ioctl.h
-@@ -0,0 +1,100 @@
-+/* $Id: ioctl.h,v 1.1 2006/07/05 06:20:25 gerg Exp $
-+ *
-+ * linux/ioctl.h for Linux by H.H. Bergman.
-+ *
-+ * Copyright (C) 2004,  Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2_IOCTL_H
-+#define _NIOS2_IOCTL_H
-+
-+/* ioctl command encoding: 32 bits total, command in lower 16 bits,
-+ * size of the parameter structure in the lower 14 bits of the
-+ * upper 16 bits.
-+ * Encoding the size of the parameter structure in the ioctl request
-+ * is useful for catching programs compiled with old versions
-+ * and to avoid overwriting user space outside the user buffer area.
-+ * The highest 2 bits are reserved for indicating the ``access mode''.
-+ * NOTE: This limits the max parameter size to 16kB -1 !
-+ */
-+
-+/*
-+ * I don't really have any idea about what this should look like, so
-+ * for the time being, this is heavily based on the PC definitions.
-+ */
-+
-+/*
-+ * The following is for compatibility across the various Linux
-+ * platforms.  The i386 ioctl numbering scheme doesn't really enforce
-+ * a type field.  De facto, however, the top 8 bits of the lower 16
-+ * bits are indeed used as a type field, so we might just as well make
-+ * this explicit here.  Please be sure to use the decoding macros
-+ * below from now on.
-+ */
-+#define _IOC_NRBITS   8
-+#define _IOC_TYPEBITS 8
-+#define _IOC_SIZEBITS 14
-+#define _IOC_DIRBITS  2
-+
-+#define _IOC_NRMASK   ((1 << _IOC_NRBITS)-1)
-+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
-+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
-+#define _IOC_DIRMASK  ((1 << _IOC_DIRBITS)-1)
-+
-+#define _IOC_NRSHIFT  0
-+#define _IOC_TYPESHIFT        (_IOC_NRSHIFT+_IOC_NRBITS)
-+#define _IOC_SIZESHIFT        (_IOC_TYPESHIFT+_IOC_TYPEBITS)
-+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
-+
-+/*
-+ * Direction bits.
-+ */
-+#define _IOC_NONE     0U
-+#define _IOC_WRITE    1U
-+#define _IOC_READ     2U
-+
-+#define _IOC(dir,type,nr,size) \
-+      (((dir)  << _IOC_DIRSHIFT) | \
-+       ((type) << _IOC_TYPESHIFT) | \
-+       ((nr)   << _IOC_NRSHIFT) | \
-+       ((size) << _IOC_SIZESHIFT))
-+
-+/* used to create numbers */
-+#define _IO(type,nr)          _IOC(_IOC_NONE,(type),(nr),0)
-+#define _IOR(type,nr,size)    _IOC(_IOC_READ,(type),(nr),sizeof(size))
-+#define _IOW(type,nr,size)    _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
-+#define _IOWR(type,nr,size)   _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
-+
-+/* used to decode ioctl numbers.. */
-+#define _IOC_DIR(nr)          (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
-+#define _IOC_TYPE(nr)         (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
-+#define _IOC_NR(nr)           (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
-+#define _IOC_SIZE(nr)         (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
-+
-+/* ...and for the drivers/sound files... */
-+
-+#define IOC_IN                (_IOC_WRITE << _IOC_DIRSHIFT)
-+#define IOC_OUT               (_IOC_READ << _IOC_DIRSHIFT)
-+#define IOC_INOUT     ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
-+#define IOCSIZE_MASK  (_IOC_SIZEMASK << _IOC_SIZESHIFT)
-+#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
-+
-+#endif /* _NIOS2_IOCTL_H */
-diff --git a/include/asm-nios2nommu/ioctls.h b/include/asm-nios2nommu/ioctls.h
-new file mode 100644
-index 0000000..288025c
---- /dev/null
-+++ b/include/asm-nios2nommu/ioctls.h
-@@ -0,0 +1,103 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __ARCH_NIOS2_IOCTLS_H__
-+#define __ARCH_NIOS2_IOCTLS_H__
-+
-+#include <asm/ioctl.h>
-+
-+/* 0x54 is just a magic number to make these relatively unique ('T') */
-+
-+#define TCGETS                0x5401
-+#define TCSETS                0x5402
-+#define TCSETSW               0x5403
-+#define TCSETSF               0x5404
-+#define TCGETA                0x5405
-+#define TCSETA                0x5406
-+#define TCSETAW               0x5407
-+#define TCSETAF               0x5408
-+#define TCSBRK                0x5409
-+#define TCXONC                0x540A
-+#define TCFLSH                0x540B
-+#define TIOCEXCL      0x540C
-+#define TIOCNXCL      0x540D
-+#define TIOCSCTTY     0x540E
-+#define TIOCGPGRP     0x540F
-+#define TIOCSPGRP     0x5410
-+#define TIOCOUTQ      0x5411
-+#define TIOCSTI               0x5412
-+#define TIOCGWINSZ    0x5413
-+#define TIOCSWINSZ    0x5414
-+#define TIOCMGET      0x5415
-+#define TIOCMBIS      0x5416
-+#define TIOCMBIC      0x5417
-+#define TIOCMSET      0x5418
-+#define TIOCGSOFTCAR  0x5419
-+#define TIOCSSOFTCAR  0x541A
-+#define FIONREAD      0x541B
-+#define TIOCINQ               FIONREAD
-+#define TIOCLINUX     0x541C
-+#define TIOCCONS      0x541D
-+#define TIOCGSERIAL   0x541E
-+#define TIOCSSERIAL   0x541F
-+#define TIOCPKT               0x5420
-+#define FIONBIO               0x5421
-+#define TIOCNOTTY     0x5422
-+#define TIOCSETD      0x5423
-+#define TIOCGETD      0x5424
-+#define TCSBRKP               0x5425  /* Needed for POSIX tcsendbreak() */
-+#define TIOCTTYGSTRUCT        0x5426  /* For debugging only */
-+#define TIOCSBRK      0x5427  /* BSD compatibility */
-+#define TIOCCBRK      0x5428  /* BSD compatibility */
-+#define TIOCGSID      0x5429  /* Return the session ID of FD */
-+#define TIOCGPTN      _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
-+#define TIOCSPTLCK    _IOW('T',0x31, int)  /* Lock/unlock Pty */
-+
-+#define FIONCLEX      0x5450  /* these numbers need to be adjusted. */
-+#define FIOCLEX               0x5451
-+#define FIOASYNC      0x5452
-+#define TIOCSERCONFIG 0x5453
-+#define TIOCSERGWILD  0x5454
-+#define TIOCSERSWILD  0x5455
-+#define TIOCGLCKTRMIOS        0x5456
-+#define TIOCSLCKTRMIOS        0x5457
-+#define TIOCSERGSTRUCT        0x5458 /* For debugging only */
-+#define TIOCSERGETLSR   0x5459 /* Get line status register */
-+#define TIOCSERGETMULTI 0x545A /* Get multiport config  */
-+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
-+
-+#define TIOCMIWAIT    0x545C  /* wait for a change on serial input line(s) */
-+#define TIOCGICOUNT   0x545D  /* read serial port inline interrupt counts */
-+#define FIOQSIZE      0x545E
-+
-+/* Used for packet mode */
-+#define TIOCPKT_DATA           0
-+#define TIOCPKT_FLUSHREAD      1
-+#define TIOCPKT_FLUSHWRITE     2
-+#define TIOCPKT_STOP           4
-+#define TIOCPKT_START          8
-+#define TIOCPKT_NOSTOP                16
-+#define TIOCPKT_DOSTOP                32
-+
-+#define TIOCSER_TEMT    0x01  /* Transmitter physically empty */
-+
-+#endif /* __ARCH_NIOS2_IOCTLS_H__ */
-diff --git a/include/asm-nios2nommu/ipc.h b/include/asm-nios2nommu/ipc.h
-new file mode 100644
-index 0000000..cb86a31
---- /dev/null
-+++ b/include/asm-nios2nommu/ipc.h
-@@ -0,0 +1,51 @@
-+#ifndef __NIOS2_IPC_H__
-+#define __NIOS2_IPC_H__
-+
-+/* Copied from sparc version
-+ * These are used to wrap system calls on the Nios.
-+ *
-+ * See arch/niosnommu/kernel/sys_nios.c for ugly details..
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+struct ipc_kludge {
-+      struct msgbuf *msgp;
-+      long msgtyp;
-+};
-+
-+#define SEMOP          1
-+#define SEMGET                 2
-+#define SEMCTL                 3
-+#define MSGSND                11
-+#define MSGRCV                12
-+#define MSGGET                13
-+#define MSGCTL                14
-+#define SHMAT         21
-+#define SHMDT         22
-+#define SHMGET                23
-+#define SHMCTL                24
-+
-+/* Used by the DIPC package, try and avoid reusing it */
-+#define DIPC            25
-+
-+#define IPCCALL(version,op)   ((version)<<16 | (op))
-+
-+#endif
-diff --git a/include/asm-nios2nommu/ipcbuf.h b/include/asm-nios2nommu/ipcbuf.h
-new file mode 100644
-index 0000000..ef59533
---- /dev/null
-+++ b/include/asm-nios2nommu/ipcbuf.h
-@@ -0,0 +1,49 @@
-+#ifndef __NIOS2_IPCBUF_H__
-+#define __NIOS2_IPCBUF_H__
-+
-+/* Copied from asm-m68k/ipcbuf.h
-+ * The user_ipc_perm structure for Nios architecture.
-+ * Note extra padding because this structure is passed back and forth
-+ * between kernel and user space.
-+ *
-+ * Pad space is left for:
-+ * - 32-bit mode_t and seq
-+ * - 2 miscellaneous 32-bit values
-+ * 
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+struct ipc64_perm
-+{
-+      __kernel_key_t          key;
-+      __kernel_uid32_t        uid;
-+      __kernel_gid32_t        gid;
-+      __kernel_uid32_t        cuid;
-+      __kernel_gid32_t        cgid;
-+      __kernel_mode_t         mode;
-+      unsigned short          __pad1;
-+      unsigned short          seq;
-+      unsigned short          __pad2;
-+      unsigned long           __unused1;
-+      unsigned long           __unused2;
-+};
-+
-+#endif /* __NIOS2_IPCBUF_H__ */
-diff --git a/include/asm-nios2nommu/irq.h b/include/asm-nios2nommu/irq.h
-new file mode 100644
-index 0000000..f0e37a2
---- /dev/null
-+++ b/include/asm-nios2nommu/irq.h
-@@ -0,0 +1,181 @@
-+/*
-+ * 21Mar2001    1.1    dgt/microtronix
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+
-+#ifndef _NIOS2NOMMU_IRQ_H_
-+#define _NIOS2NOMMU_IRQ_H_
-+
-+extern void disable_irq(unsigned int);
-+extern void enable_irq(unsigned int);
-+
-+#include <linux/interrupt.h>
-+
-+#define       SYS_IRQS        32
-+#define       NR_IRQS         SYS_IRQS
-+
-+/*
-+ * Interrupt source definitions
-+ * General interrupt sources are the level 1-7.
-+ * Adding an interrupt service routine for one of these sources
-+ * results in the addition of that routine to a chain of routines.
-+ * Each one is called in succession.  Each individual interrupt
-+ * service routine should determine if the device associated with
-+ * that routine requires service.
-+ */
-+
-+#define IRQ01         (1)     /* level 1  interrupt */
-+#define IRQ02         (2)     /* level 2  interrupt */
-+#define IRQ03         (3)     /* level 3  interrupt */
-+#define IRQ04         (4)     /* level 4  interrupt */
-+#define IRQ05         (5)     /* level 5  interrupt */
-+#define IRQ06         (6)     /* level 6  interrupt */
-+#define IRQ07         (7)     /* level 7  interrupt */
-+#define IRQ08         (8)     /* level 8  interrupt */
-+#define IRQ09         (9)     /* level 9  interrupt */
-+#define IRQ0A         (10)    /* level 10 interrupt */
-+#define IRQ0B         (11)    /* level 11 interrupt */
-+#define IRQ0C         (12)    /* level 12 interrupt */
-+#define IRQ0D         (13)    /* level 13 interrupt */
-+#define IRQ0E         (14)    /* level 14 interrupt */
-+#define IRQ0F         (15)    /* level 15 interrupt */
-+#define IRQ10         (16)    /* level 16 interrupt */
-+#define IRQ12         (17)    /* level 17 interrupt */
-+#define IRQ13         (18)    /* level 18 interrupt */
-+#define IRQ14         (19)    /* level 19 interrupt */
-+#define IRQ15         (20)    /* level 20 interrupt */
-+#define IRQ16         (21)    /* level 21 interrupt */
-+#define IRQ17         (22)    /* level 22 interrupt */
-+#define IRQ18         (23)    /* level 23 interrupt */
-+#define IRQ19         (24)    /* level 24 interrupt */
-+#define IRQ1A         (25)    /* level 25 interrupt */
-+#define IRQ1B         (26)    /* level 26 interrupt */
-+#define IRQ1C         (27)    /* level 27 interrupt */
-+#define IRQ1D         (28)    /* level 28 interrupt */
-+#define IRQ1E         (29)    /* level 29 interrupt */
-+#define IRQ1F         (30)    /* level 30 interrupt */
-+#define IRQ20         (31)    /* level 31 interrupt */
-+#define IRQ21         (32)    /* level 32 interrupt */
-+
-+#define IRQMAX                IRQ21
-+
-+/*
-+ * "Generic" interrupt sources
-+ */
-+
-+/*
-+ * Machine specific interrupt sources.
-+ *
-+ * Adding an interrupt service routine for a source with this bit
-+ * set indicates a special machine specific interrupt source.
-+ * The machine specific files define these sources.
-+ *
-+ * Removed, they are not used by any one.
-+ */
-+
-+/*
-+ * various flags for request_irq()
-+ */
-+#define IRQ_FLG_LOCK  (0x0001)        /* handler is not replaceable   */
-+#define IRQ_FLG_REPLACE       (0x0002)        /* replace existing handler     */
-+#define IRQ_FLG_FAST  (0x0004)
-+#define IRQ_FLG_SLOW  (0x0008)
-+#define IRQ_FLG_STD   (0x8000)        /* internally used              */
-+
-+/*
-+ * Functions to set and clear the interrupt mask.
-+ */
-+
-+/*
-+ * Use a zero to clean the bit.
-+ */
-+static inline void clrimr(int mask)
-+{
-+      int flags;
-+
-+      local_irq_save(flags);
-+      __asm__ __volatile__(
-+      "rdctl  r8, ienable\n"
-+      "and    r8,r8,%0\n"
-+      "wrctl  ienable, r8\n"
-+      : /* No output */
-+      : "r" (mask)
-+      : "r8");
-+      local_irq_restore(flags);
-+}
-+
-+/*
-+ * Use a one to set the bit.
-+ */
-+static inline void setimr(int mask)
-+{
-+      int flags;
-+
-+      local_irq_save(flags);
-+      __asm__ __volatile__(
-+      "rdctl  r8, ienable\n"
-+      "or     r8,r8,%0\n"
-+      "wrctl  ienable, r8\n"
-+      : /* No output */
-+      : "r" (mask)
-+      : "r8");
-+      local_irq_restore(flags);
-+}
-+
-+/*
-+ * This structure is used to chain together the ISRs for a particular
-+ * interrupt source (if it supports chaining).
-+ */
-+typedef struct irq_node {
-+      irq_handler_t   handler;
-+      unsigned long   flags;
-+      void            *dev_id;
-+      const char      *devname;
-+      struct irq_node *next;
-+} irq_node_t;
-+
-+/*
-+ * This function returns a new irq_node_t
-+ */
-+extern irq_node_t *new_irq_node(void);
-+
-+/*
-+ * This structure has only 4 elements for speed reasons
-+ */
-+typedef struct irq_hand {
-+      irq_handler_t   handler;
-+      unsigned long   flags;
-+      void            *dev_id;
-+      const char      *devname;
-+} irq_hand_t;
-+
-+/* count of spurious interrupts */
-+extern volatile unsigned int num_spurious;
-+
-+#define disable_irq_nosync(i) disable_irq(i)
-+
-+#ifndef irq_canonicalize
-+#define irq_canonicalize(i)   (i)
-+#endif
-+
-+#endif /* _NIOS2NOMMU_IRQ_H_ */
-diff --git a/include/asm-nios2nommu/irq_node.h b/include/asm-nios2nommu/irq_node.h
-new file mode 100644
-index 0000000..24f9763
---- /dev/null
-+++ b/include/asm-nios2nommu/irq_node.h
-@@ -0,0 +1,36 @@
-+#ifndef _NIOS2NOMMU_IRQNODE_H_
-+#define _NIOS2NOMMU_IRQNODE_H_
-+
-+#include <linux/interrupt.h>
-+
-+/*
-+ * This structure is used to chain together the ISRs for a particular
-+ * interrupt source (if it supports chaining).
-+ */
-+typedef struct irq_node {
-+      irqreturn_t     (*handler)(int, void *, struct pt_regs *);
-+      unsigned long   flags;
-+      void            *dev_id;
-+      const char      *devname;
-+      struct irq_node *next;
-+} irq_node_t;
-+
-+/*
-+ * This structure has only 4 elements for speed reasons
-+ */
-+typedef struct irq_handler {
-+      irqreturn_t     (*handler)(int, void *, struct pt_regs *);
-+      unsigned long   flags;
-+      void            *dev_id;
-+      const char      *devname;
-+} irq_handler_t;
-+
-+/* count of spurious interrupts */
-+extern volatile unsigned int num_spurious;
-+
-+/*
-+ * This function returns a new irq_node_t
-+ */
-+extern irq_node_t *new_irq_node(void);
-+
-+#endif /* _NIOS2NOMMU_IRQNODE_H_ */
-diff --git a/include/asm-nios2nommu/irq_regs.h b/include/asm-nios2nommu/irq_regs.h
-new file mode 100644
-index 0000000..3dd9c0b
---- /dev/null
-+++ b/include/asm-nios2nommu/irq_regs.h
-@@ -0,0 +1 @@
-+#include <asm-generic/irq_regs.h>
-diff --git a/include/asm-nios2nommu/kdebug.h b/include/asm-nios2nommu/kdebug.h
-new file mode 100644
-index 0000000..6ece1b0
---- /dev/null
-+++ b/include/asm-nios2nommu/kdebug.h
-@@ -0,0 +1 @@
-+#include <asm-generic/kdebug.h>
-diff --git a/include/asm-nios2nommu/kmap_types.h b/include/asm-nios2nommu/kmap_types.h
-new file mode 100644
-index 0000000..a26b91d
---- /dev/null
-+++ b/include/asm-nios2nommu/kmap_types.h
-@@ -0,0 +1,43 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _ASM_KMAP_TYPES_H
-+#define _ASM_KMAP_TYPES_H
-+
-+enum km_type {
-+      KM_BOUNCE_READ,
-+      KM_SKB_SUNRPC_DATA,
-+      KM_SKB_DATA_SOFTIRQ,
-+      KM_USER0,
-+      KM_USER1,
-+      KM_BIO_SRC_IRQ,
-+      KM_BIO_DST_IRQ,
-+      KM_PTE0,
-+      KM_PTE1,
-+      KM_IRQ0,
-+      KM_IRQ1,
-+      KM_SOFTIRQ0,
-+      KM_SOFTIRQ1,
-+      KM_TYPE_NR
-+};
-+
-+#endif
-diff --git a/include/asm-nios2nommu/linkage.h b/include/asm-nios2nommu/linkage.h
-new file mode 100644
-index 0000000..db79297
---- /dev/null
-+++ b/include/asm-nios2nommu/linkage.h
-@@ -0,0 +1,29 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __ASM_LINKAGE_H
-+#define __ASM_LINKAGE_H
-+
-+#define __ALIGN .align 3
-+#define __ALIGN_STR ".align 3"
-+
-+#endif
-diff --git a/include/asm-nios2nommu/linux_logo.h b/include/asm-nios2nommu/linux_logo.h
-new file mode 100644
-index 0000000..f9d38e7
---- /dev/null
-+++ b/include/asm-nios2nommu/linux_logo.h
-@@ -0,0 +1,953 @@
-+/* $Id: linux_logo.h,v 1.1 2006/07/05 06:20:25 gerg Exp $
-+ * include/asm-nios/linux_logo.h: This is a linux logo
-+ *                                 to be displayed on boot.
-+ *
-+ * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu)
-+ * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-+ * Copyright (C) 2004 Micrtronix Datacom Ltd.
-+ *
-+ * You can put anything here, but:
-+ * LINUX_LOGO_COLORS has to be less than 224
-+ * image size has to be 80x80
-+ * values have to start from 0x20
-+ * (i.e. RGB(linux_logo_red[0],
-+ *         linux_logo_green[0],
-+ *         linux_logo_blue[0]) is color 0x20)
-+ * BW image has to be 80x80 as well, with MS bit
-+ * on the left
-+ * Serial_console ascii image can be any size,
-+ * but should contain %s to display the version
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+ 
-+#include <linux/init.h>
-+#include <linux/version.h>
-+
-+#define linux_logo_banner "Linux/NIOS2 version " UTS_RELEASE
-+
-+#define __HAVE_ARCH_LINUX_LOGO
-+#define __HAVE_ARCH_LINUX_LOGO16
-+
-+#define LINUX_LOGO_COLORS     221
-+
-+#ifdef INCLUDE_LINUX_LOGO_DATA
-+
-+unsigned char linux_logo_red[] __initdata = {
-+    0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22,
-+    0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56,
-+    0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65,
-+    0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6,
-+    0xc3, 0x65, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6,
-+    0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7,
-+    0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x76, 0x79,
-+    0x62, 0x36, 0x9a, 0xe2, 0xec, 0xe1, 0xb8, 0xd7,
-+    0xaf, 0x25, 0xbc, 0xc0, 0xef, 0xea, 0xe8, 0xe8,
-+    0xf5, 0xf1, 0xda, 0xd3, 0x79, 0xdb, 0xf4, 0xf6,
-+    0xf6, 0xf6, 0xe2, 0x3d, 0xb4, 0xce, 0xe6, 0xee,
-+    0xf6, 0x68, 0xd8, 0xec, 0xf5, 0xc6, 0xc8, 0x9c,
-+    0x89, 0xd2, 0xee, 0xcb, 0xb9, 0xd2, 0x66, 0x5e,
-+    0x8b, 0xbe, 0xa8, 0xd5, 0xca, 0xb6, 0xae, 0x9c,
-+    0xc5, 0xbe, 0xbe, 0xca, 0x90, 0xb2, 0x9a, 0xa8,
-+    0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xfe,
-+    0xf6, 0xec, 0xfe, 0xd2, 0xea, 0xf5, 0xf2, 0xf2,
-+    0xe9, 0xee, 0xf6, 0xf2, 0xee, 0xf6, 0xda, 0xd4,
-+    0xfa, 0xca, 0xf2, 0xf6, 0xfe, 0xf2, 0xda, 0xe4,
-+    0xf6, 0xdd, 0xf2, 0xee, 0xfa, 0xf0, 0x12, 0x4a,
-+    0xd6, 0xf2, 0x8e, 0xf2, 0xf6, 0xf6, 0xb5, 0xf1,
-+    0x26, 0x9a, 0xea, 0xf6, 0xe0, 0xd2, 0x16, 0x9a,
-+    0x2e, 0xd2, 0x70, 0xd6, 0x46, 0x7c, 0xb4, 0x62,
-+    0xda, 0xee, 0xd6, 0xa3, 0x74, 0xa7, 0xa2, 0xe0,
-+    0xae, 0xbe, 0xce, 0xe2, 0xa3, 0x8e, 0x6d, 0x8e,
-+    0x32, 0xaf, 0x50, 0x9e, 0x5b, 0x8a, 0x98, 0x82,
-+    0x7a, 0x82, 0x56, 0x7c, 0x8a, 0x56, 0x5e, 0x86,
-+    0x6a, 0x52, 0x59, 0x64, 0x5e,
-+};
-+
-+unsigned char linux_logo_green[] __initdata = {
-+    0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22,
-+    0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56,
-+    0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65,
-+    0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6,
-+    0xc3, 0x62, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6,
-+    0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7,
-+    0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x62, 0x5c,
-+    0x4e, 0x26, 0x72, 0xaa, 0xba, 0xaf, 0x90, 0xae,
-+    0x92, 0x1a, 0xa4, 0x85, 0xb6, 0xbe, 0xc3, 0xc8,
-+    0xcf, 0xd0, 0xc2, 0xce, 0x57, 0xa2, 0xd6, 0xda,
-+    0xda, 0xd7, 0xb8, 0x2a, 0x7b, 0x91, 0xae, 0xca,
-+    0xda, 0x45, 0x9e, 0xb2, 0xd7, 0x9b, 0x90, 0x76,
-+    0x5c, 0xa2, 0xbe, 0xa6, 0x85, 0x96, 0x4e, 0x46,
-+    0x66, 0x92, 0x7a, 0x9a, 0x96, 0x9d, 0x9a, 0x6b,
-+    0x8a, 0x8e, 0xb2, 0xca, 0x90, 0xa6, 0x79, 0x7c,
-+    0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xfa,
-+    0xea, 0xd7, 0xf6, 0xbc, 0xda, 0xde, 0xda, 0xe6,
-+    0xca, 0xd8, 0xea, 0xe0, 0xcc, 0xf2, 0xce, 0xb2,
-+    0xee, 0xa2, 0xd6, 0xe6, 0xf6, 0xd7, 0xc5, 0xb8,
-+    0xc6, 0xb9, 0xce, 0xde, 0xce, 0xc6, 0x0e, 0x36,
-+    0xae, 0xbe, 0x86, 0xba, 0xbe, 0xe6, 0x8e, 0xc4,
-+    0x1e, 0x8e, 0xae, 0xba, 0xb2, 0xa6, 0x12, 0x7a,
-+    0x20, 0xc6, 0x64, 0xaa, 0x2f, 0x70, 0x85, 0x46,
-+    0xce, 0xd6, 0xa6, 0x6e, 0x51, 0x72, 0x92, 0xa6,
-+    0x87, 0x96, 0xa2, 0xd6, 0x85, 0x7a, 0x6a, 0x6e,
-+    0x22, 0x76, 0x36, 0x76, 0x3c, 0x6e, 0x63, 0x53,
-+    0x66, 0x62, 0x42, 0x50, 0x56, 0x42, 0x56, 0x56,
-+    0x56, 0x3e, 0x51, 0x52, 0x56,
-+};
-+
-+unsigned char linux_logo_blue[] __initdata = {
-+    0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22,
-+    0x12, 0x01, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56,
-+    0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x06, 0x65,
-+    0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6,
-+    0xc3, 0x59, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6,
-+    0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7,
-+    0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x2e, 0x08,
-+    0x0a, 0x06, 0x0a, 0x0b, 0x0b, 0x0f, 0x0c, 0x0f,
-+    0x3d, 0x09, 0x73, 0x09, 0x0d, 0x0a, 0x10, 0x1e,
-+    0x2d, 0x13, 0x86, 0xba, 0x19, 0x0a, 0x36, 0x3c,
-+    0x26, 0x14, 0x0d, 0x06, 0x07, 0x0a, 0x0b, 0x0f,
-+    0x4a, 0x06, 0x0a, 0x0c, 0x2b, 0x0a, 0x0b, 0x0a,
-+    0x06, 0x0a, 0x0a, 0x11, 0x0b, 0x0a, 0x0a, 0x1e,
-+    0x0f, 0x0d, 0x0a, 0x0b, 0x22, 0x6a, 0x72, 0x0b,
-+    0x0b, 0x22, 0x90, 0xca, 0x90, 0x92, 0x3c, 0x2c,
-+    0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xea,
-+    0xb6, 0x7c, 0xda, 0x8e, 0xa6, 0x87, 0x66, 0xb6,
-+    0x81, 0x6a, 0xc6, 0x9a, 0x5b, 0xd2, 0xb6, 0x6a,
-+    0xca, 0x45, 0x92, 0xb2, 0xca, 0x52, 0x8a, 0x3e,
-+    0x2e, 0x66, 0x66, 0xae, 0x3e, 0x47, 0x06, 0x0e,
-+    0x52, 0x36, 0x6a, 0x0e, 0x0e, 0xbe, 0x2c, 0x0e,
-+    0x0a, 0x5a, 0x0d, 0x0e, 0x3e, 0x0a, 0x06, 0x2e,
-+    0x06, 0x9e, 0x4e, 0x36, 0x06, 0x58, 0x24, 0x06,
-+    0x9e, 0xae, 0x3a, 0x08, 0x08, 0x07, 0x5e, 0x0a,
-+    0x32, 0x2e, 0x2a, 0xb2, 0x43, 0x48, 0x5f, 0x2e,
-+    0x06, 0x06, 0x07, 0x24, 0x06, 0x32, 0x06, 0x06,
-+    0x46, 0x2e, 0x22, 0x06, 0x06, 0x1e, 0x4c, 0x06,
-+    0x3a, 0x22, 0x42, 0x34, 0x42,
-+};
-+
-+unsigned char linux_logo[] __initdata = {
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22,
-+    0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-+    0x26, 0x26, 0x25, 0x28, 0x23, 0x22, 0x21, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x21, 0x23, 0x25, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d,
-+    0x2d, 0x2e, 0x2c, 0x2b, 0x2a, 0x25, 0x28, 0x22,
-+    0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
-+    0x24, 0x2a, 0x2c, 0x2f, 0x2c, 0x30, 0x30, 0x24,
-+    0x25, 0x27, 0x2b, 0x2c, 0x2f, 0x31, 0x32, 0x25,
-+    0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25,
-+    0x33, 0x34, 0x35, 0x21, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x21, 0x2b, 0x2f, 0x2c,
-+    0x30, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33,
-+    0x2d, 0x27, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x31,
-+    0x2d, 0x32, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x21, 0x28, 0x2a, 0x34,
-+    0x25, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x23, 0x32, 0x27, 0x21, 0x36,
-+    0x2a, 0x2d, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x22, 0x26, 0x2c, 0x35,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x25, 0x2f, 0x37, 0x32, 0x22,
-+    0x36, 0x35, 0x31, 0x27, 0x22, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x22,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x26, 0x38, 0x38, 0x35, 0x25,
-+    0x36, 0x21, 0x2d, 0x2b, 0x24, 0x21, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x21, 0x24, 0x39, 0x39, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x25, 0x2b, 0x30, 0x28, 0x22,
-+    0x36, 0x36, 0x27, 0x34, 0x30, 0x23, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x21, 0x26, 0x2d, 0x26, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x22, 0x22, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x2d, 0x33, 0x28, 0x21, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x2b, 0x2c, 0x25, 0x21, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x36, 0x36,
-+    0x36, 0x21, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x21, 0x23, 0x22, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x28, 0x34, 0x27, 0x22, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36,
-+    0x21, 0x21, 0x24, 0x27, 0x21, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x28, 0x27, 0x22, 0x33, 0x24, 0x36,
-+    0x36, 0x36, 0x36, 0x22, 0x2f, 0x2a, 0x23, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36,
-+    0x30, 0x3a, 0x38, 0x24, 0x24, 0x36, 0x36, 0x36,
-+    0x23, 0x2f, 0x3b, 0x3c, 0x3d, 0x30, 0x25, 0x21,
-+    0x36, 0x36, 0x36, 0x36, 0x2f, 0x32, 0x23, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x23,
-+    0x3e, 0x3f, 0x40, 0x3a, 0x22, 0x36, 0x36, 0x21,
-+    0x41, 0x42, 0x43, 0x44, 0x45, 0x3e, 0x23, 0x21,
-+    0x36, 0x36, 0x36, 0x36, 0x2f, 0x33, 0x28, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x2b,
-+    0x44, 0x40, 0x46, 0x47, 0x35, 0x36, 0x36, 0x26,
-+    0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x2e, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x32, 0x34, 0x36, 0x4d,
-+    0x4e, 0x25, 0x2f, 0x46, 0x4a, 0x22, 0x23, 0x32,
-+    0x4f, 0x50, 0x21, 0x31, 0x51, 0x52, 0x53, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x21, 0x3a,
-+    0x4d, 0x21, 0x31, 0x54, 0x55, 0x28, 0x30, 0x2b,
-+    0x4b, 0x4d, 0x36, 0x23, 0x32, 0x50, 0x3f, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x29, 0x20, 0x29, 0x20, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x2a, 0x38, 0x23, 0x37,
-+    0x55, 0x36, 0x28, 0x3a, 0x56, 0x57, 0x57, 0x58,
-+    0x3c, 0x4d, 0x36, 0x36, 0x36, 0x40, 0x40, 0x21,
-+    0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x29, 0x29, 0x29, 0x20, 0x29, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x30, 0x51, 0x23, 0x35,
-+    0x43, 0x25, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e,
-+    0x5f, 0x60, 0x61, 0x36, 0x31, 0x47, 0x3b, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x31, 0x2c, 0x25, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x22,
-+    0x40, 0x62, 0x63, 0x5d, 0x64, 0x65, 0x66, 0x67,
-+    0x68, 0x69, 0x66, 0x5e, 0x6a, 0x6b, 0x2a, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x33, 0x2e, 0x26, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x27, 0x2f, 0x23, 0x36,
-+    0x6c, 0x63, 0x6d, 0x64, 0x5c, 0x66, 0x69, 0x6e,
-+    0x6f, 0x70, 0x71, 0x69, 0x69, 0x72, 0x6c, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x33, 0x34, 0x27, 0x22,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x27, 0x34, 0x26, 0x73,
-+    0x74, 0x75, 0x76, 0x64, 0x65, 0x77, 0x69, 0x78,
-+    0x70, 0x71, 0x71, 0x71, 0x72, 0x5f, 0x5e, 0x21,
-+    0x36, 0x36, 0x36, 0x36, 0x25, 0x38, 0x2a, 0x23,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x33, 0x79,
-+    0x63, 0x7a, 0x7b, 0x5c, 0x66, 0x69, 0x6e, 0x7c,
-+    0x71, 0x71, 0x69, 0x7d, 0x7e, 0x7a, 0x7f, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x21, 0x51, 0x2b, 0x28,
-+    0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x32, 0x24,
-+    0x80, 0x81, 0x64, 0x82, 0x77, 0x69, 0x71, 0x71,
-+    0x69, 0x83, 0x84, 0x85, 0x7a, 0x85, 0x86, 0x36,
-+    0x21, 0x2b, 0x23, 0x36, 0x36, 0x39, 0x2e, 0x26,
-+    0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x27, 0x2d, 0x33, 0x21,
-+    0x87, 0x88, 0x89, 0x72, 0x67, 0x66, 0x5f, 0x89,
-+    0x8a, 0x63, 0x85, 0x8b, 0x8c, 0x8d, 0x41, 0x36,
-+    0x36, 0x2d, 0x3a, 0x35, 0x36, 0x24, 0x51, 0x32,
-+    0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x33, 0x21,
-+    0x55, 0x8e, 0x8f, 0x8a, 0x7d, 0x5e, 0x90, 0x7e,
-+    0x75, 0x75, 0x90, 0x62, 0x40, 0x3f, 0x49, 0x23,
-+    0x36, 0x24, 0x3a, 0x3a, 0x24, 0x36, 0x2e, 0x31,
-+    0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x21, 0x28, 0x33, 0x37, 0x25, 0x22,
-+    0x3b, 0x50, 0x8e, 0x8f, 0x90, 0x7e, 0x90, 0x63,
-+    0x74, 0x91, 0x92, 0x42, 0x93, 0x4b, 0x45, 0x2c,
-+    0x36, 0x36, 0x33, 0x39, 0x21, 0x36, 0x22, 0x51,
-+    0x33, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x22, 0x27, 0x2e, 0x2e, 0x36, 0x21,
-+    0x94, 0x3f, 0x50, 0x95, 0x96, 0x8f, 0x8f, 0x97,
-+    0x8e, 0x42, 0x50, 0x43, 0x47, 0x48, 0x48, 0x98,
-+    0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39,
-+    0x2e, 0x27, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x22, 0x24, 0x2b, 0x38, 0x28, 0x36, 0x32,
-+    0x4c, 0x4b, 0x50, 0x50, 0x50, 0x42, 0x42, 0x50,
-+    0x50, 0x40, 0x45, 0x99, 0x48, 0x48, 0x48, 0x48,
-+    0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x23,
-+    0x2f, 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x21, 0x28, 0x32, 0x51, 0x32, 0x28, 0x21, 0x98,
-+    0x48, 0x47, 0x9a, 0x50, 0x50, 0x50, 0x50, 0x50,
-+    0x9a, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x93, 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x2a, 0x2f, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x23, 0x30, 0x2e, 0x2c, 0x36, 0x21, 0x51, 0x9b,
-+    0x48, 0x48, 0x52, 0x3f, 0x50, 0x50, 0x40, 0x4b,
-+    0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x2d, 0x31, 0x27, 0x23, 0x21, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23,
-+    0x27, 0x2c, 0x2d, 0x21, 0x36, 0x28, 0x44, 0x48,
-+    0x48, 0x48, 0x48, 0x47, 0x46, 0x4f, 0x47, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x9c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x28, 0x51, 0x39, 0x26, 0x22, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25,
-+    0x35, 0x51, 0x28, 0x36, 0x36, 0x9d, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x9b, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x4f, 0x28, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x28, 0x38, 0x2b, 0x25, 0x22, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33,
-+    0x51, 0x25, 0x36, 0x36, 0x23, 0x40, 0x9b, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x9b, 0x99, 0x2b, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x30, 0x2f, 0x33, 0x24, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x21, 0x23, 0x30, 0x34,
-+    0x27, 0x36, 0x36, 0x36, 0x2a, 0x40, 0x47, 0x48,
-+    0x48, 0x48, 0x48, 0x9b, 0x99, 0x99, 0x9b, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x47, 0x52,
-+    0x46, 0x4f, 0x37, 0x21, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x30, 0x34, 0x2a, 0x23,
-+    0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x22, 0x25, 0x39, 0x2c,
-+    0x36, 0x36, 0x36, 0x21, 0x31, 0x4e, 0x9a, 0x4c,
-+    0x47, 0x9b, 0x9b, 0x52, 0x46, 0x4f, 0x52, 0x9b,
-+    0x9b, 0x9b, 0x47, 0x4f, 0x45, 0x9a, 0x93, 0x93,
-+    0x3f, 0x93, 0x98, 0x28, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, 0x26,
-+    0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x28,
-+    0x36, 0x36, 0x36, 0x22, 0x38, 0x98, 0x44, 0x99,
-+    0x9b, 0x48, 0x48, 0x9b, 0x4c, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x47, 0x52, 0x46, 0x43, 0x93,
-+    0x40, 0x40, 0x43, 0x53, 0x21, 0x23, 0x33, 0x23,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x2f, 0x32,
-+    0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x21, 0x24, 0x2b, 0x31, 0x36,
-+    0x36, 0x22, 0x36, 0x24, 0x9e, 0x4f, 0x9b, 0x48,
-+    0x48, 0x48, 0x48, 0x9b, 0x99, 0x9f, 0x52, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x47,
-+    0x4f, 0x9a, 0x3f, 0x46, 0x38, 0x36, 0x21, 0x30,
-+    0x26, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c,
-+    0x25, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x22, 0x26, 0x2e, 0x33, 0x36,
-+    0x25, 0x25, 0x36, 0x4d, 0x52, 0x48, 0x48, 0x48,
-+    0x47, 0x9f, 0x48, 0x48, 0x48, 0xa0, 0xa1, 0xa2,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x47, 0x44, 0x93, 0x43, 0x23, 0x36, 0x36,
-+    0x26, 0x24, 0x36, 0x36, 0x36, 0x36, 0x28, 0x2f,
-+    0x2a, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x23, 0x2a, 0x51, 0x24, 0x36,
-+    0x2a, 0x36, 0x28, 0x44, 0x48, 0x48, 0x48, 0x48,
-+    0xa3, 0xa4, 0x48, 0x48, 0x9f, 0xa5, 0xa6, 0x9f,
-+    0x48, 0x48, 0x48, 0xa2, 0xa7, 0x47, 0x48, 0x48,
-+    0x48, 0x48, 0x9b, 0x4b, 0x44, 0x37, 0x36, 0x23,
-+    0x28, 0x30, 0x22, 0x36, 0x36, 0x36, 0x36, 0x2d,
-+    0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x21, 0x28, 0x2b, 0x34, 0x36, 0x25,
-+    0x24, 0x36, 0x4a, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0xa8, 0xa1, 0x48, 0x48, 0x9f, 0xa9, 0xa6, 0x9f,
-+    0x48, 0x48, 0xaa, 0xa1, 0xa5, 0x9f, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x9b, 0x52, 0x3f, 0x21, 0x30,
-+    0x35, 0x25, 0x30, 0x36, 0x36, 0x36, 0x36, 0x32,
-+    0x2d, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x22, 0x26, 0x2e, 0x35, 0x36, 0x2a,
-+    0x36, 0x24, 0x4f, 0x48, 0x52, 0x52, 0x48, 0x48,
-+    0xab, 0xac, 0xa0, 0x48, 0xad, 0xa6, 0xa6, 0x9f,
-+    0x48, 0xa2, 0xa9, 0xa6, 0xa2, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x47, 0x32, 0x30,
-+    0x2a, 0x23, 0x30, 0x23, 0x36, 0x36, 0x36, 0x21,
-+    0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x21, 0x23, 0x2a, 0x51, 0x28, 0x28, 0x25,
-+    0x36, 0x3a, 0x48, 0x48, 0xae, 0xaf, 0x48, 0x48,
-+    0xad, 0xac, 0xa1, 0x9f, 0xa2, 0xa9, 0xa9, 0xa2,
-+    0x48, 0xab, 0x78, 0xa7, 0x48, 0x48, 0x48, 0x48,
-+    0x9f, 0x48, 0x48, 0x48, 0x48, 0x48, 0x38, 0x21,
-+    0x36, 0x36, 0x22, 0x27, 0x36, 0x36, 0x36, 0x36,
-+    0x2e, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x22, 0x25, 0x2c, 0x34, 0x36, 0x30, 0x21,
-+    0x23, 0x43, 0x48, 0x48, 0xb0, 0xb1, 0xb2, 0x9f,
-+    0x48, 0xb3, 0xa5, 0xb3, 0xab, 0xa9, 0xa9, 0xb3,
-+    0xb4, 0xa9, 0xb5, 0xb0, 0x48, 0x48, 0xa0, 0xa5,
-+    0xa1, 0xad, 0x48, 0x48, 0x48, 0x48, 0x94, 0x36,
-+    0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36,
-+    0x2a, 0x2e, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x21, 0x23, 0x2a, 0x51, 0x25, 0x21, 0x2a, 0x36,
-+    0x2e, 0x9b, 0x48, 0x48, 0x48, 0xb6, 0xb7, 0xa4,
-+    0xa2, 0xa7, 0xb5, 0x78, 0x6f, 0x6f, 0x6e, 0x6f,
-+    0xa9, 0xb5, 0xab, 0x48, 0x9f, 0xab, 0xa9, 0xa1,
-+    0xaa, 0x48, 0x48, 0x48, 0x48, 0x48, 0x98, 0x36,
-+    0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36,
-+    0x22, 0x2f, 0x30, 0x22, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x22, 0x25, 0x2c, 0x34, 0x36, 0x24, 0x28, 0x36,
-+    0x54, 0x48, 0x48, 0x48, 0x48, 0xa2, 0xa8, 0xa1,
-+    0xa5, 0xa6, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f,
-+    0x6f, 0x78, 0xa5, 0xa0, 0xa0, 0x78, 0xa6, 0xa2,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36,
-+    0x36, 0x36, 0x36, 0x30, 0x36, 0x36, 0x36, 0x36,
-+    0x21, 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x28, 0x32, 0x2f, 0x28, 0x36, 0x27, 0x22, 0x21,
-+    0x43, 0x48, 0x4b, 0xa2, 0x9f, 0x48, 0xa2, 0xa1,
-+    0xb8, 0x6e, 0x6e, 0xb5, 0x78, 0x6f, 0x78, 0x78,
-+    0x6e, 0x6f, 0x78, 0xb5, 0xa6, 0xa1, 0xa0, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4b, 0x21,
-+    0x36, 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
-+    0x25, 0x2c, 0x39, 0x36, 0x36, 0x30, 0x22, 0x25,
-+    0x52, 0x48, 0xa3, 0xb1, 0xb6, 0xb3, 0xaa, 0xac,
-+    0x68, 0x68, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f,
-+    0x78, 0x6f, 0x6f, 0xb5, 0xa6, 0xb4, 0x48, 0x9f,
-+    0xb4, 0xb4, 0xa2, 0x9f, 0x48, 0x48, 0x4f, 0x21,
-+    0x36, 0x36, 0x22, 0x26, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
-+    0x30, 0x2d, 0x21, 0x36, 0x36, 0x32, 0x23, 0x2a,
-+    0x47, 0x48, 0xa2, 0xb6, 0xaf, 0xb9, 0xba, 0x68,
-+    0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x78,
-+    0x6f, 0x6f, 0xa6, 0x6f, 0xb5, 0xa0, 0xaa, 0xa6,
-+    0xa6, 0xa9, 0xb2, 0xb3, 0x48, 0x48, 0x4c, 0x22,
-+    0x36, 0x36, 0x24, 0x23, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28,
-+    0x33, 0x2e, 0x36, 0x36, 0x23, 0x31, 0x27, 0x39,
-+    0x9b, 0x48, 0x48, 0x48, 0xb0, 0xb0, 0xba, 0xb8,
-+    0x68, 0x68, 0x69, 0x78, 0x6f, 0xb5, 0x6f, 0xb5,
-+    0x78, 0x78, 0x78, 0x78, 0x78, 0xa5, 0xbb, 0xa9,
-+    0xa5, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4c, 0x23,
-+    0x36, 0x36, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28,
-+    0x2b, 0x39, 0x36, 0x36, 0x36, 0x26, 0x32, 0x31,
-+    0x9b, 0x48, 0x48, 0x48, 0x48, 0x9f, 0xac, 0x68,
-+    0xbc, 0x6e, 0x6e, 0x6e, 0xb5, 0x6f, 0x6e, 0x6f,
-+    0x6f, 0x78, 0x78, 0xb5, 0xb5, 0xa5, 0x9f, 0x9f,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x46, 0x22,
-+    0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24,
-+    0x35, 0x39, 0x36, 0x36, 0x36, 0x36, 0x26, 0x2d,
-+    0x9b, 0x48, 0x48, 0xb0, 0xaa, 0xb3, 0xbd, 0xb8,
-+    0xb8, 0x68, 0x6e, 0x6e, 0xb5, 0x6f, 0x78, 0x6e,
-+    0x78, 0x6f, 0x78, 0x78, 0xb5, 0xa9, 0xa2, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36,
-+    0x24, 0x27, 0xbe, 0x24, 0x25, 0x28, 0x21, 0x36,
-+    0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x25,
-+    0x39, 0x4d, 0xbf, 0x84, 0x81, 0x57, 0x21, 0x39,
-+    0x52, 0x48, 0x48, 0x62, 0xb1, 0xc0, 0xc1, 0xc1,
-+    0xb8, 0xb8, 0x68, 0xbc, 0x6e, 0x6e, 0x6e, 0x78,
-+    0x78, 0x78, 0x78, 0x6e, 0x78, 0xa9, 0xa0, 0xab,
-+    0xb3, 0xa2, 0x48, 0x48, 0x48, 0x48, 0x53, 0x28,
-+    0x23, 0x36, 0x36, 0x36, 0x21, 0x28, 0x2c, 0x30,
-+    0x21, 0x38, 0x33, 0x28, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x28, 0x30,
-+    0x2d, 0xc2, 0x7a, 0xc3, 0xc4, 0xc4, 0x7f, 0x22,
-+    0x51, 0x52, 0x48, 0x48, 0xb0, 0xaa, 0xa8, 0xbd,
-+    0x68, 0xb8, 0xb8, 0x68, 0x68, 0x6e, 0x6e, 0x6f,
-+    0x6e, 0x6e, 0xb5, 0x6e, 0x78, 0xab, 0xab, 0xb5,
-+    0x78, 0xa6, 0xb3, 0xc5, 0xac, 0xac, 0xc6, 0x61,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x30, 0x32,
-+    0x25, 0x4d, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x21, 0x23, 0x24, 0x26, 0x30, 0x33, 0x31,
-+    0x4d, 0x91, 0x5b, 0xc3, 0xc4, 0xc4, 0xc4, 0x5a,
-+    0x21, 0x2e, 0x46, 0x48, 0x48, 0x48, 0xb0, 0x64,
-+    0xc1, 0xb8, 0xb8, 0xb8, 0x68, 0x71, 0x6e, 0x6e,
-+    0x6f, 0x71, 0x6f, 0x6f, 0xa6, 0xa0, 0x9f, 0xb4,
-+    0xb4, 0xa0, 0xa1, 0xb7, 0xc7, 0x69, 0x66, 0xc8,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x26, 0x25,
-+    0x83, 0xc9, 0x2c, 0x25, 0x21, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x21, 0x28, 0x30, 0x35, 0x2d, 0x2f, 0x37, 0x4a,
-+    0x60, 0x85, 0xca, 0xcb, 0xc4, 0xc4, 0xc4, 0x82,
-+    0x86, 0x36, 0x32, 0x3f, 0xa2, 0xa4, 0xa8, 0xa9,
-+    0xb8, 0xb8, 0xb8, 0xb8, 0x68, 0x6e, 0x6e, 0x6e,
-+    0x6e, 0x71, 0x6f, 0x71, 0xa6, 0xb4, 0x9f, 0x9f,
-+    0x48, 0x48, 0x48, 0xcc, 0xc3, 0xc7, 0xcd, 0xce,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x57,
-+    0x77, 0x66, 0x34, 0x27, 0x22, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x23, 0x30, 0x31, 0xcf, 0x91, 0x7e, 0x90, 0x90,
-+    0x8b, 0x5b, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0x5d, 0xd0, 0x36, 0x24, 0xd1, 0xb1, 0xaf, 0xaa,
-+    0xba, 0xb8, 0x68, 0x68, 0x68, 0x71, 0x6e, 0x6e,
-+    0x6e, 0x6f, 0x6e, 0x78, 0xa1, 0xa9, 0xa1, 0xb0,
-+    0x9f, 0x9b, 0x99, 0xcc, 0x64, 0x5c, 0x8b, 0xd0,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x73, 0x5d,
-+    0x82, 0x5c, 0xd2, 0x2a, 0x23, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x24, 0x2b, 0xcf, 0x8b, 0x5b, 0x76, 0x5b, 0x5b,
-+    0x7b, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc7, 0x5e, 0x22, 0x36, 0x21, 0x3a, 0x99, 0x48,
-+    0xa2, 0xa8, 0xb7, 0xc1, 0xb8, 0x68, 0x68, 0xbc,
-+    0x68, 0x6e, 0xb5, 0xb4, 0xb4, 0xab, 0xb5, 0xa1,
-+    0xb0, 0x4f, 0x3f, 0xd3, 0x7b, 0x7b, 0x85, 0x80,
-+    0xbe, 0x36, 0x36, 0x36, 0x21, 0xd4, 0x7e, 0x7b,
-+    0x64, 0x64, 0xd5, 0x35, 0x24, 0x21, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
-+    0x26, 0x31, 0xd6, 0x5b, 0x64, 0xc3, 0xc3, 0xcb,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0x66, 0xd7, 0x36, 0x36, 0x36, 0x2c, 0x4b,
-+    0xd8, 0xd9, 0xb3, 0xa8, 0xbd, 0xbd, 0xbd, 0xbd,
-+    0xa9, 0xab, 0xb3, 0xa5, 0xa2, 0x9f, 0xa2, 0xa1,
-+    0x6a, 0x9a, 0x3f, 0xda, 0x76, 0x76, 0x7a, 0x63,
-+    0xdb, 0xdc, 0x86, 0xdc, 0xdd, 0x90, 0x5b, 0x64,
-+    0xc3, 0xc3, 0xde, 0x2d, 0x27, 0x23, 0x21, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x26, 0x2d, 0x91, 0x5b, 0x64, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc7, 0x83, 0xce, 0x36, 0x36, 0x36, 0x30,
-+    0xb1, 0xd9, 0x48, 0xa1, 0xb2, 0xb0, 0xb0, 0xb3,
-+    0xa2, 0x48, 0xa7, 0xbd, 0xa9, 0xa2, 0x48, 0x9f,
-+    0xaa, 0x9a, 0x3f, 0xb1, 0x5b, 0x7b, 0xdf, 0x85,
-+    0x7e, 0x90, 0x63, 0x90, 0x85, 0x5b, 0xc3, 0xc4,
-+    0xc4, 0xcb, 0x5d, 0xd5, 0x39, 0x26, 0x23, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
-+    0x26, 0x2d, 0xe0, 0xdf, 0x64, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc7, 0x88, 0x36, 0x36, 0x36, 0x36,
-+    0x2d, 0x9b, 0x48, 0xb9, 0xaf, 0xa2, 0xa2, 0xb9,
-+    0xa8, 0x9f, 0x48, 0xa7, 0xb7, 0xd9, 0x48, 0x48,
-+    0x9b, 0x45, 0x3f, 0xe1, 0x6d, 0x7b, 0xca, 0xdf,
-+    0x7a, 0x8b, 0x8b, 0x7a, 0x5b, 0x64, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc3, 0xe2, 0x37, 0x35, 0x26, 0x23,
-+    0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
-+    0x26, 0x2e, 0xe0, 0x7a, 0x7b, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc7, 0x72, 0x73, 0x36, 0x36, 0x36,
-+    0x24, 0x52, 0x48, 0xa3, 0xaf, 0x9f, 0x48, 0xb6,
-+    0xaf, 0xa2, 0x48, 0x9f, 0xe3, 0xd8, 0x48, 0x48,
-+    0x48, 0x46, 0x42, 0xd6, 0x7a, 0x7b, 0x64, 0x7b,
-+    0x76, 0x5b, 0x5b, 0x76, 0x7b, 0xc3, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xcb, 0x64, 0xe2, 0x4d, 0x2c, 0x27,
-+    0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x25, 0x31, 0xe4, 0x8b, 0x7b, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc7, 0x89, 0xbe, 0x36, 0x36,
-+    0x32, 0x47, 0x48, 0x4f, 0xa0, 0x48, 0x48, 0xe3,
-+    0x92, 0x9f, 0x48, 0x9f, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x4b, 0x2f, 0x8f, 0x7a, 0x7b, 0xc3, 0xcb,
-+    0xc3, 0x64, 0x64, 0xc3, 0xc3, 0xcb, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x5d, 0xe5, 0x2c,
-+    0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x25, 0x31, 0xe4, 0x85, 0x7b, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0x66, 0x57, 0x27, 0x4d,
-+    0x4b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x99, 0x34, 0xbe, 0xdb, 0x7a, 0x7b, 0xc3, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xe4,
-+    0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
-+    0x26, 0x2d, 0xe4, 0x85, 0x7b, 0xcb, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc7, 0x5f, 0x92, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x44,
-+    0x35, 0x36, 0xce, 0xdd, 0x7a, 0x7b, 0xcb, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0xc3, 0xe1,
-+    0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23,
-+    0x30, 0x2f, 0xd6, 0x8b, 0x7b, 0xcb, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0x66, 0x89, 0x45,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x4e, 0x25,
-+    0x36, 0x36, 0x61, 0xdb, 0x6d, 0x64, 0xcb, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x7b, 0xdf, 0xe5,
-+    0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28,
-+    0x33, 0xe6, 0x63, 0xdf, 0xc3, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x72, 0x81, 0xe7,
-+    0x46, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48,
-+    0x48, 0x48, 0x48, 0x48, 0x3f, 0x2c, 0x36, 0x36,
-+    0x36, 0x36, 0xe8, 0x8f, 0x6d, 0x64, 0xcb, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc3, 0xca, 0x8b, 0xcf, 0x2c,
-+    0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24,
-+    0x35, 0x96, 0x75, 0xca, 0xc3, 0xcb, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x7b, 0x81, 0xdb,
-+    0x73, 0x3b, 0x44, 0x9b, 0x48, 0x48, 0x48, 0x9b,
-+    0x99, 0x43, 0x94, 0x2c, 0x21, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x73, 0xdb, 0x7a, 0x7b, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0x64, 0x76, 0x7a, 0x91, 0xd5, 0x31, 0x30,
-+    0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24,
-+    0x39, 0x97, 0x75, 0xdf, 0x7b, 0x64, 0xc3, 0xc3,
-+    0xcb, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0x7b, 0x7a, 0xe9,
-+    0xea, 0x36, 0x21, 0x26, 0x2b, 0x39, 0x33, 0x30,
-+    0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x21, 0xea, 0xdd, 0x8b, 0x7b, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x64, 0x64,
-+    0x76, 0x85, 0xe0, 0xd5, 0x34, 0x2b, 0x27, 0x28,
-+    0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28,
-+    0x33, 0xeb, 0x63, 0x7e, 0x7a, 0x6d, 0xdf, 0x5b,
-+    0x76, 0x7b, 0x64, 0x64, 0xc3, 0xcb, 0xc4, 0xc4,
-+    0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x76, 0x85, 0xdb,
-+    0x79, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x21, 0xec, 0xdd, 0x75, 0x76, 0xc3, 0xc4,
-+    0xc4, 0xc4, 0xcb, 0xc3, 0x64, 0x76, 0xdf, 0x8b,
-+    0xd6, 0xd5, 0x2f, 0x35, 0x30, 0x24, 0x22, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23,
-+    0x27, 0x31, 0xed, 0xeb, 0xdd, 0x74, 0x63, 0x90,
-+    0x7e, 0x75, 0x8b, 0x6d, 0xdf, 0x76, 0x64, 0xc3,
-+    0xcb, 0xcb, 0xcb, 0xcb, 0x64, 0x7a, 0x84, 0xee,
-+    0x79, 0xbe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-+    0x36, 0x21, 0xea, 0xee, 0x63, 0x6d, 0x7b, 0x64,
-+    0xcb, 0xc3, 0x64, 0x7b, 0xdf, 0x75, 0x63, 0x96,
-+    0x38, 0x39, 0x2a, 0x24, 0x23, 0x21, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x28, 0x27, 0x35, 0x2d, 0x41, 0xd5, 0xe7, 0x8f,
-+    0xdb, 0xdd, 0xe9, 0x74, 0x84, 0x90, 0x85, 0x6d,
-+    0x5b, 0x7b, 0x7b, 0xca, 0x6d, 0x90, 0xdb, 0xef,
-+    0xec, 0x22, 0x36, 0x36, 0x28, 0x30, 0x30, 0x30,
-+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x25, 0x36,
-+    0x36, 0x21, 0xd4, 0x80, 0xe9, 0x7e, 0x6d, 0x76,
-+    0xca, 0x76, 0x6d, 0x85, 0x63, 0xdb, 0xd5, 0x34,
-+    0x33, 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x21, 0x23, 0x24, 0x27, 0x2a, 0x35, 0x2e, 0x2f,
-+    0x41, 0xf0, 0xf1, 0x6c, 0x80, 0xee, 0xdb, 0x74,
-+    0x84, 0x90, 0x75, 0x7e, 0x74, 0x8f, 0xef, 0x79,
-+    0xe8, 0x2b, 0x9d, 0x41, 0x2f, 0x34, 0x2d, 0x2d,
-+    0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x34, 0x2f, 0x38,
-+    0x4d, 0x37, 0xf2, 0xf3, 0x8f, 0x74, 0x63, 0x7e,
-+    0x75, 0x7e, 0x63, 0xe9, 0x88, 0xe6, 0x31, 0x2a,
-+    0x24, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x30,
-+    0x33, 0x39, 0x2e, 0x51, 0x41, 0xd2, 0x6c, 0xf3,
-+    0x80, 0xee, 0xee, 0xee, 0xf4, 0xf3, 0xd7, 0xf5,
-+    0x41, 0x34, 0x35, 0x32, 0x30, 0x27, 0x27, 0x27,
-+    0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x30, 0x2a,
-+    0x2b, 0x34, 0xf6, 0xec, 0xf7, 0x8f, 0xdd, 0xe9,
-+    0xe9, 0xdd, 0xee, 0x6c, 0x41, 0x39, 0x27, 0x28,
-+    0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22,
-+    0x28, 0x24, 0x26, 0x2a, 0x33, 0x2c, 0x2f, 0x41,
-+    0xf8, 0xd7, 0x79, 0x79, 0x79, 0xec, 0xf9, 0x51,
-+    0x39, 0x30, 0x24, 0x23, 0x22, 0x22, 0x22, 0x22,
-+    0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23,
-+    0x24, 0x2a, 0x31, 0xfa, 0xea, 0x79, 0xf3, 0x80,
-+    0xf7, 0xdc, 0xfb, 0x2f, 0x35, 0x26, 0x23, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x21, 0x22, 0x23, 0x28, 0x25, 0x30, 0x2b,
-+    0x31, 0x2f, 0xf6, 0xfa, 0xfa, 0x2f, 0x2e, 0x33,
-+    0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x21, 0x28, 0x27, 0x35, 0x34, 0xfa, 0xfa, 0xfa,
-+    0xfc, 0xf6, 0x2e, 0x33, 0x25, 0x23, 0x21, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x23, 0x28,
-+    0x26, 0x30, 0x32, 0x2b, 0x33, 0x2a, 0x26, 0x28,
-+    0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x21, 0x23, 0x25, 0x30, 0x33, 0x35, 0x35,
-+    0x2b, 0x2a, 0x26, 0x28, 0x22, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21,
-+    0x21, 0x22, 0x23, 0x28, 0x28, 0x23, 0x22, 0x21,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x21, 0x23, 0x28, 0x24, 0x24,
-+    0x28, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-+};
-+
-+unsigned char linux_logo16[1];
-+
-+#endif /* INCLUDE_LINUX_LOGO_DATA */
-+
-+#include <linux/linux_logo.h>
-+
-diff --git a/include/asm-nios2nommu/local.h b/include/asm-nios2nommu/local.h
-new file mode 100644
-index 0000000..5ed7d1c
---- /dev/null
-+++ b/include/asm-nios2nommu/local.h
-@@ -0,0 +1,28 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2NOMMU_LOCAL_H
-+#define __NIOS2NOMMU_LOCAL_H
-+
-+#include <asm-generic/local.h>
-+
-+#endif /* __NIOS2NOMMU_LOCAL_H */
-diff --git a/include/asm-nios2nommu/mc146818rtc.h b/include/asm-nios2nommu/mc146818rtc.h
-new file mode 100644
-index 0000000..3492fc0
---- /dev/null
-+++ b/include/asm-nios2nommu/mc146818rtc.h
-@@ -0,0 +1,29 @@
-+/*
-+ * Machine dependent access functions for RTC registers.
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#ifndef _NIOS2_MC146818RTC_H
-+#define _NIOS2_MC146818RTC_H
-+
-+/* empty include file to satisfy the include in genrtc.c/ide-geometry.c */
-+
-+#endif /* _NIOS2_MC146818RTC_H */
-diff --git a/include/asm-nios2nommu/mman.h b/include/asm-nios2nommu/mman.h
-new file mode 100644
-index 0000000..516ab26
---- /dev/null
-+++ b/include/asm-nios2nommu/mman.h
-@@ -0,0 +1,68 @@
-+/*
-+ * Copied from the m68k port.
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2_MMAN_H__
-+#define __NIOS2_MMAN_H__
-+
-+#define PROT_READ     0x1             /* page can be read */
-+#define PROT_WRITE    0x2             /* page can be written */
-+#define PROT_EXEC     0x4             /* page can be executed */
-+#define PROT_SEM      0x8             /* page may be used for atomic ops */
-+#define PROT_NONE     0x0             /* page can not be accessed */
-+#define PROT_GROWSDOWN        0x01000000      /* mprotect flag: extend change to start of growsdown vma */
-+#define PROT_GROWSUP  0x02000000      /* mprotect flag: extend change to end of growsup vma */
-+
-+#define MAP_SHARED    0x01            /* Share changes */
-+#define MAP_PRIVATE   0x02            /* Changes are private */
-+#define MAP_TYPE      0x0f            /* Mask for type of mapping */
-+#define MAP_FIXED     0x10            /* Interpret addr exactly */
-+#define MAP_ANONYMOUS 0x20            /* don't use a file */
-+
-+#define MAP_GROWSDOWN 0x0100          /* stack-like segment */
-+#define MAP_DENYWRITE 0x0800          /* ETXTBSY */
-+#define MAP_EXECUTABLE        0x1000          /* mark it as an executable */
-+#define MAP_LOCKED    0x2000          /* pages are locked */
-+#define MAP_NORESERVE 0x4000          /* don't check for reservations */
-+#define MAP_POPULATE  0x8000          /* populate (prefault) pagetables */
-+#define MAP_NONBLOCK  0x10000         /* do not block on IO */
-+
-+#define MS_ASYNC      1               /* sync memory asynchronously */
-+#define MS_INVALIDATE 2               /* invalidate the caches */
-+#define MS_SYNC               4               /* synchronous memory sync */
-+
-+#define MCL_CURRENT   1               /* lock all current mappings */
-+#define MCL_FUTURE    2               /* lock all future mappings */
-+
-+#define MADV_NORMAL   0x0             /* default page-in behavior */
-+#define MADV_RANDOM   0x1             /* page-in minimum required */
-+#define MADV_SEQUENTIAL       0x2             /* read-ahead aggressively */
-+#define MADV_WILLNEED 0x3             /* pre-fault pages */
-+#define MADV_DONTNEED 0x4             /* discard these pages */
-+
-+/* compatibility flags */
-+#define MAP_ANON      MAP_ANONYMOUS
-+#define MAP_FILE      0
-+
-+#endif /* __NIOS2_MMAN_H__ */
-+
-diff --git a/include/asm-nios2nommu/mmu.h b/include/asm-nios2nommu/mmu.h
-new file mode 100644
-index 0000000..b6e579d
---- /dev/null
-+++ b/include/asm-nios2nommu/mmu.h
-@@ -0,0 +1,36 @@
-+/*
-+ *
-+ * Taken from the m68knommu.
-+ * 
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2NOMMU_MMU_H
-+#define __NIOS2NOMMU_MMU_H
-+
-+/* Copyright (C) 2002, David McCullough <davidm@snapgear.com> */
-+
-+typedef struct {
-+      struct vm_list_struct   *vmlist;
-+      unsigned long           end_brk;
-+} mm_context_t;
-+
-+#endif /* __NIOS2NOMMU_MMU_H */
-diff --git a/include/asm-nios2nommu/mmu_context.h b/include/asm-nios2nommu/mmu_context.h
-new file mode 100644
-index 0000000..795cd09
---- /dev/null
-+++ b/include/asm-nios2nommu/mmu_context.h
-@@ -0,0 +1,57 @@
-+/*
-+ *
-+ * Taken from the m68knommu.
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2NOMMU_MMU_CONTEXT_H
-+#define __NIOS2NOMMU_MMU_CONTEXT_H
-+
-+#include <asm/setup.h>
-+#include <asm/page.h>
-+#include <asm/pgalloc.h>
-+
-+static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
-+{
-+}
-+
-+extern inline int
-+init_new_context(struct task_struct *tsk, struct mm_struct *mm)
-+{
-+      // mm->context = virt_to_phys(mm->pgd);
-+      return(0);
-+}
-+
-+#define destroy_context(mm)           do { } while(0)
-+
-+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk)
-+{
-+}
-+
-+#define deactivate_mm(tsk,mm) do { } while (0)
-+
-+extern inline void activate_mm(struct mm_struct *prev_mm,
-+                             struct mm_struct *next_mm)
-+{
-+}
-+
-+#endif
-diff --git a/include/asm-nios2nommu/module.h b/include/asm-nios2nommu/module.h
-new file mode 100644
-index 0000000..864f335
---- /dev/null
-+++ b/include/asm-nios2nommu/module.h
-@@ -0,0 +1,36 @@
-+#ifndef _NIOS2_MODULE_H
-+#define _NIOS2_MODULE_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/module.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+struct mod_arch_specific
-+{
-+};
-+
-+#define Elf_Shdr Elf32_Shdr
-+#define Elf_Sym Elf32_Sym
-+#define Elf_Ehdr Elf32_Ehdr
-+
-+#endif /* _NIOS_MODULE_H */
-diff --git a/include/asm-nios2nommu/msgbuf.h b/include/asm-nios2nommu/msgbuf.h
-new file mode 100644
-index 0000000..4d090f7
---- /dev/null
-+++ b/include/asm-nios2nommu/msgbuf.h
-@@ -0,0 +1,56 @@
-+/*
-+ * Taken from the m68k.
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2_MSGBUF_H
-+#define _NIOS2_MSGBUF_H
-+
-+/* 
-+ * The msqid64_ds structure for nios2 architecture.
-+ * Note extra padding because this structure is passed back and forth
-+ * between kernel and user space.
-+ *
-+ * Pad space is left for:
-+ * - 64-bit time_t to solve y2038 problem
-+ * - 2 miscellaneous 32-bit values
-+ */
-+
-+struct msqid64_ds {
-+      struct ipc64_perm msg_perm;
-+      __kernel_time_t msg_stime;      /* last msgsnd time */
-+      unsigned long   __unused1;
-+      __kernel_time_t msg_rtime;      /* last msgrcv time */
-+      unsigned long   __unused2;
-+      __kernel_time_t msg_ctime;      /* last change time */
-+      unsigned long   __unused3;
-+      unsigned long  msg_cbytes;      /* current number of bytes on queue */
-+      unsigned long  msg_qnum;        /* number of messages in queue */
-+      unsigned long  msg_qbytes;      /* max number of bytes on queue */
-+      __kernel_pid_t msg_lspid;       /* pid of last msgsnd */
-+      __kernel_pid_t msg_lrpid;       /* last receive pid */
-+      unsigned long  __unused4;
-+      unsigned long  __unused5;
-+};
-+
-+#endif /* _NIOS2_MSGBUF_H */
-+
-diff --git a/include/asm-nios2nommu/mutex.h b/include/asm-nios2nommu/mutex.h
-new file mode 100644
-index 0000000..458c1f7
---- /dev/null
-+++ b/include/asm-nios2nommu/mutex.h
-@@ -0,0 +1,9 @@
-+/*
-+ * 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>
-diff --git a/include/asm-nios2nommu/namei.h b/include/asm-nios2nommu/namei.h
-new file mode 100644
-index 0000000..d925c4e
---- /dev/null
-+++ b/include/asm-nios2nommu/namei.h
-@@ -0,0 +1,36 @@
-+/*
-+ * linux/include/asm-nios/namei.h
-+ * Moved from m68k version
-+ * Included from linux/fs/namei.c
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef __NIOS2_NAMEI_H
-+#define __NIOS2_NAMEI_H
-+
-+/* This dummy routine maybe changed to something useful
-+ * for /usr/gnemul/ emulation stuff.
-+ * Look at asm-sparc/namei.h for details.
-+ */
-+
-+#define __emul_prefix() NULL
-+
-+#endif
-diff --git a/include/asm-nios2nommu/ndma.h b/include/asm-nios2nommu/ndma.h
-new file mode 100644
-index 0000000..6b4604d
---- /dev/null
-+++ b/include/asm-nios2nommu/ndma.h
-@@ -0,0 +1,64 @@
-+#ifndef __NDMA_H__
-+  #define __NDMA_H__
-+
-+    #ifndef __ASSEMBLY__
-+
-+// DMA Registers
-+typedef volatile struct
-+{
-+  int np_dmastatus;        // status register
-+  int np_dmareadaddress;   // read address
-+  int np_dmawriteaddress;  // write address
-+  int np_dmalength;        // length in bytes
-+  int np_dmareserved1;     // reserved
-+  int np_dmareserved2;     // reserved
-+  int np_dmacontrol;       // control register
-+  int np_dmareserved3;     // control register alternate
-+} np_dma;
-+
-+// DMA Register Bits
-+enum
-+{
-+  np_dmacontrol_byte_bit  = 0, // Byte transaction
-+  np_dmacontrol_hw_bit    = 1, // Half-word transaction
-+  np_dmacontrol_word_bit  = 2, // Word transaction
-+  np_dmacontrol_go_bit    = 3, // enable execution
-+  np_dmacontrol_i_en_bit  = 4, // enable interrupt
-+  np_dmacontrol_reen_bit  = 5, // Enable read end-of-packet
-+  np_dmacontrol_ween_bit  = 6, // Enable write end-of-packet
-+  np_dmacontrol_leen_bit  = 7, // Enable length=0 transaction end
-+  np_dmacontrol_rcon_bit  = 8, // Read from a fixed address
-+  np_dmacontrol_wcon_bit  = 9, // Write to a fixed address
-+  np_dmacontrol_doubleword_bit = 10, // Double-word transaction
-+  np_dmacontrol_quadword_bit = 11, // Quad-word transaction
-+ 
-+  np_dmastatus_done_bit   = 0, // 1 when done.  Status write clears.
-+  np_dmastatus_busy_bit   = 1, // 1 when busy.
-+  np_dmastatus_reop_bit   = 2, // read-eop received
-+  np_dmastatus_weop_bit   = 3, // write-eop received
-+  np_dmastatus_len_bit    = 4, // requested length transacted
-+ 
-+  np_dmacontrol_byte_mask = (1 << 0), // Byte transaction
-+  np_dmacontrol_hw_mask   = (1 << 1), // Half-word transaction
-+  np_dmacontrol_word_mask = (1 << 2), // Word transaction
-+  np_dmacontrol_go_mask   = (1 << 3), // enable execution
-+  np_dmacontrol_i_en_mask = (1 << 4), // enable interrupt
-+  np_dmacontrol_reen_mask = (1 << 5), // Enable read end-of-packet
-+  np_dmacontrol_ween_mask = (1 << 6), // Enable write end-of-packet
-+  np_dmacontrol_leen_mask = (1 << 7), // Enable length=0 transaction end
-+  np_dmacontrol_rcon_mask = (1 << 8), // Read from a fixed address
-+  np_dmacontrol_wcon_mask = (1 << 9), // Write to a fixed address
-+  np_dmacontrol_doubleword_mask = (1 << 10), // Double-word transaction
-+  np_dmacontrol_quadword_mask = (1 << 11), // Quad-word transaction
-+ 
-+  np_dmastatus_done_mask  = (1 << 0), // 1 when done.  Status write clears.
-+  np_dmastatus_busy_mask  = (1 << 1), // 1 when busy.
-+  np_dmastatus_reop_mask  = (1 << 2), // read-eop received
-+  np_dmastatus_weop_mask  = (1 << 3), // write-eop received
-+  np_dmastatus_len_mask   = (1 << 4), // requested length transacted
-+};
-+
-+    #endif /* __ASSEMBLY__ */
-+
-+#endif
-+/* End of File */
-diff --git a/include/asm-nios2nommu/nios.h b/include/asm-nios2nommu/nios.h
-new file mode 100644
-index 0000000..df17672
---- /dev/null
-+++ b/include/asm-nios2nommu/nios.h
-@@ -0,0 +1,7 @@
-+#ifndef __NIOS_H__
-+#define __NIOS_H__
-+
-+#include <nios2_system.h>
-+
-+#endif
-+
-diff --git a/include/asm-nios2nommu/page.h b/include/asm-nios2nommu/page.h
-new file mode 100644
-index 0000000..764e73c
---- /dev/null
-+++ b/include/asm-nios2nommu/page.h
-@@ -0,0 +1,124 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2_PAGE_H
-+#define _NIOS2_PAGE_H
-+
-+/* copied from m68knommu arch */
-+
-+/* PAGE_SHIFT determines the page size */
-+
-+#define PAGE_SHIFT    (12)
-+#define PAGE_SIZE     (1UL << PAGE_SHIFT)
-+#define PAGE_MASK     (~(PAGE_SIZE-1))
-+
-+#ifdef __KERNEL__
-+
-+#include <asm/setup.h>
-+
-+#if PAGE_SHIFT < 13
-+#define THREAD_SIZE (8192)
-+#else
-+#define THREAD_SIZE PAGE_SIZE
-+#endif
-+ 
-+#ifndef __ASSEMBLY__
-+ 
-+#define get_user_page(vaddr)          __get_free_page(GFP_KERNEL)
-+#define free_user_page(page, addr)    free_page(addr)
-+
-+#define clear_page(page)      memset((page), 0, PAGE_SIZE)
-+#define copy_page(to,from)    memcpy((to), (from), PAGE_SIZE)
-+
-+#define clear_user_page(page, vaddr, pg)      clear_page(page)
-+#define copy_user_page(to, from, vaddr, pg)   copy_page(to, from)
-+
-+/*
-+ * These are used to make use of C type-checking..
-+ */
-+typedef struct { unsigned long pte; } pte_t;
-+typedef struct { unsigned long pmd[16]; } pmd_t;
-+typedef struct { unsigned long pgd; } pgd_t;
-+typedef struct { unsigned long pgprot; } pgprot_t;
-+
-+#define pte_val(x)    ((x).pte)
-+#define pmd_val(x)    ((&x)->pmd[0])
-+#define pgd_val(x)    ((x).pgd)
-+#define pgprot_val(x) ((x).pgprot)
-+
-+#define __pte(x)      ((pte_t) { (x) } )
-+#define __pmd(x)      ((pmd_t) { (x) } )
-+#define __pgd(x)      ((pgd_t) { (x) } )
-+#define __pgprot(x)   ((pgprot_t) { (x) } )
-+
-+/* to align the pointer to the (next) page boundary */
-+#define PAGE_ALIGN(addr)      (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-+
-+extern unsigned long memory_start;
-+extern unsigned long memory_end;
-+
-+#endif /* !__ASSEMBLY__ */
-+#include <asm/nios.h>
-+#define PAGE_OFFSET           ((int)(nasys_program_mem))
-+
-+#ifndef __ASSEMBLY__
-+
-+#define __pa(vaddr)           virt_to_phys((void *)(vaddr))
-+#define __va(paddr)           phys_to_virt((unsigned long)(paddr))
-+
-+#define MAP_NR(addr)          (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)
-+
-+#define virt_to_pfn(kaddr)    (__pa(kaddr) >> PAGE_SHIFT)
-+#define pfn_to_virt(pfn)      __va((pfn) << PAGE_SHIFT)
-+
-+#define virt_to_page(addr)    ((void*) addr < (void*) memory_end ? mem_map + \
-+                              (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT) : 0UL)
-+#define page_to_virt(page)    ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET)
-+#define VALID_PAGE(page)      (((page) - mem_map) < max_mapnr)
-+
-+#define pfn_to_page(pfn)      virt_to_page(pfn_to_virt(pfn))
-+#define page_to_pfn(page)     virt_to_pfn(page_to_virt(page))
-+#define pfn_valid(pfn)                ((pfn) < max_mapnr)
-+
-+#define       virt_addr_valid(kaddr)  (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
-+                              ((void *)(kaddr) < (void *)memory_end))
-+
-+#ifdef CONFIG_NO_KERNEL_MSG
-+#define       BUG_PRINT()
-+#else
-+#define       BUG_PRINT() printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__)
-+#endif
-+
-+#ifdef na_cpu_oci_core
-+#define BUG_PANIC()   asm volatile ("break") /* drop to debugger */
-+#else
-+// #define BUG_PANIC()        while(1)
-+#define BUG_PANIC()   panic("BUG!")
-+#endif
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#include <asm-generic/page.h>
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NIOS2_PAGE_H */
-diff --git a/include/asm-nios2nommu/param.h b/include/asm-nios2nommu/param.h
-new file mode 100644
-index 0000000..e75a355
---- /dev/null
-+++ b/include/asm-nios2nommu/param.h
-@@ -0,0 +1,49 @@
-+#ifndef _NIOS_PARAM_H
-+#define _NIOS_PARAM_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/param.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#ifndef HZ
-+#define HZ 100
-+#endif
-+
-+#ifdef __KERNEL__
-+#define       USER_HZ         HZ
-+#define       CLOCKS_PER_SEC  (USER_HZ)
-+#endif
-+
-+#define EXEC_PAGESIZE 4096
-+
-+#ifndef NGROUPS
-+#define NGROUPS               32
-+#endif
-+
-+#ifndef NOGROUP
-+#define NOGROUP               (-1)
-+#endif
-+
-+#define MAXHOSTNAMELEN        64      /* max length of hostname */
-+
-+#endif
-diff --git a/include/asm-nios2nommu/pci.h b/include/asm-nios2nommu/pci.h
-new file mode 100644
-index 0000000..be3b3b2
---- /dev/null
-+++ b/include/asm-nios2nommu/pci.h
-@@ -0,0 +1,126 @@
-+#ifndef __ASM_SH_PCI_H
-+#define __ASM_SH_PCI_H
-+
-+#ifdef __KERNEL__
-+
-+#include <linux/dma-mapping.h>
-+
-+/* Can be used to override the logic in pci_scan_bus for skipping
-+   already-configured bus numbers - to be used for buggy BIOSes
-+   or architectures with incomplete PCI setup by the loader */
-+
-+#define pcibios_assign_all_busses()   1
-+#define pcibios_scan_all_fns(a, b)    0
-+
-+/*
-+ * A board can define one or more PCI channels that represent built-in (or
-+ * external) PCI controllers.
-+ */
-+struct pci_channel {
-+      struct pci_ops *pci_ops;
-+      struct resource *io_resource;
-+      struct resource *mem_resource;
-+      int first_devfn;
-+      int last_devfn;
-+};
-+
-+/*
-+ * Each board initializes this array and terminates it with a NULL entry.
-+ */
-+extern struct pci_channel board_pci_channels[];
-+
-+#define PCIBIOS_MIN_IO                board_pci_channels->io_resource->start
-+#define PCIBIOS_MIN_MEM               board_pci_channels->mem_resource->start
-+
-+struct pci_dev;
-+
-+extern void pcibios_set_master(struct pci_dev *dev);
-+
-+static inline void pcibios_penalize_isa_irq(int irq, int active)
-+{
-+      /* We don't do dynamic PCI IRQ allocation */
-+}
-+
-+/* Dynamic DMA mapping stuff.
-+ * SuperH has everything mapped statically like x86.
-+ */
-+
-+/* The PCI address space does equal the physical memory
-+ * address space.  The networking and block device layers use
-+ * this boolean for bounce buffer decisions.
-+ */
-+#define PCI_DMA_BUS_IS_PHYS   (1)
-+
-+#include <linux/types.h>
-+#include <linux/slab.h>
-+#include <asm/scatterlist.h>
-+#include <linux/string.h>
-+#include <asm/io.h>
-+
-+/* pci_unmap_{single,page} being a nop depends upon the
-+ * configuration.
-+ */
-+#ifdef CONFIG_SH_PCIDMA_NONCOHERENT
-+#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)     \
-+      dma_addr_t ADDR_NAME;
-+#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)               \
-+      __u32 LEN_NAME;
-+#define pci_unmap_addr(PTR, ADDR_NAME)                        \
-+      ((PTR)->ADDR_NAME)
-+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)               \
-+      (((PTR)->ADDR_NAME) = (VAL))
-+#define pci_unmap_len(PTR, LEN_NAME)                  \
-+      ((PTR)->LEN_NAME)
-+#define pci_unmap_len_set(PTR, LEN_NAME, VAL)         \
-+      (((PTR)->LEN_NAME) = (VAL))
-+#else
-+#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
-+#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
-+#define pci_unmap_addr(PTR, ADDR_NAME)                (0)
-+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)       do { } while (0)
-+#define pci_unmap_len(PTR, LEN_NAME)          (0)
-+#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
-+#endif
-+
-+/* Not supporting more than 32-bit PCI bus addresses now, but
-+ * must satisfy references to this function.  Change if needed.
-+ */
-+#define pci_dac_dma_supported(pci_dev, mask) (0)
-+
-+/* These macros should be used after a pci_map_sg call has been done
-+ * to get bus addresses of each of the SG entries and their lengths.
-+ * You should only work with the number of sg entries pci_map_sg
-+ * returns, or alternatively stop on the first sg_dma_len(sg) which
-+ * is 0.
-+ */
-+#define sg_dma_address(sg)    (virt_to_bus((sg)->dma_address))
-+#define sg_dma_len(sg)                ((sg)->length)
-+
-+#ifdef CONFIG_PCI
-+static inline void pci_dma_burst_advice(struct pci_dev *pdev,
-+                                      enum pci_dma_burst_strategy *strat,
-+                                      unsigned long *strategy_parameter)
-+{
-+      *strat = PCI_DMA_BURST_INFINITY;
-+      *strategy_parameter = ~0UL;
-+}
-+#endif
-+
-+/* Board-specific fixup routines. */
-+extern void pcibios_fixup(void);
-+extern void pcibios_fixup_irqs(void);
-+
-+#ifdef CONFIG_PCI_AUTO
-+extern int pciauto_assign_resources(int busno, struct pci_channel *hose);
-+#endif
-+
-+#endif /* __KERNEL__ */
-+
-+/* generic pci stuff */
-+#include <asm-generic/pci.h>
-+
-+/* generic DMA-mapping stuff */
-+#include <asm-generic/pci-dma-compat.h>
-+
-+#endif /* __ASM_SH_PCI_H */
-+
-diff --git a/include/asm-nios2nommu/percpu.h b/include/asm-nios2nommu/percpu.h
-new file mode 100644
-index 0000000..cd6d4a3
---- /dev/null
-+++ b/include/asm-nios2nommu/percpu.h
-@@ -0,0 +1,30 @@
-+#ifndef __ARCH_NIOS2NOMMU_PERCPU__
-+#define __ARCH_NIOS2NOMMU_PERCPU__
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/percpu.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm-generic/percpu.h>
-+
-+#endif /* __ARCH_NIOS2NOMMU_PERCPU__ */
-diff --git a/include/asm-nios2nommu/pgalloc.h b/include/asm-nios2nommu/pgalloc.h
-new file mode 100644
-index 0000000..a997ada
---- /dev/null
-+++ b/include/asm-nios2nommu/pgalloc.h
-@@ -0,0 +1,32 @@
-+#ifndef _NIOS2NOMMU_PGALLOC_H
-+#define _NIOS2NOMMU_PGALLOC_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/pgalloc.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/setup.h>
-+
-+#define check_pgt_cache()     do { } while (0)
-+
-+#endif /* _NIOS2NOMMU_PGALLOC_H */
-diff --git a/include/asm-nios2nommu/pgtable.h b/include/asm-nios2nommu/pgtable.h
-new file mode 100644
-index 0000000..4124a33
---- /dev/null
-+++ b/include/asm-nios2nommu/pgtable.h
-@@ -0,0 +1,112 @@
-+#ifndef _NIOS_PGTABLE_H
-+#define _NIOS_PGTABLE_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/pgtable.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <asm-generic/4level-fixup.h>
-+
-+//vic - this bit copied from m68knommu version
-+#include <asm/setup.h>
-+#include <asm/io.h>
-+#include <linux/sched.h>
-+
-+typedef pte_t *pte_addr_t;
-+
-+#define pgd_present(pgd)      (1)       /* pages are always present on NO_MM */
-+#define pgd_none(pgd)         (0)
-+#define pgd_bad(pgd)          (0)
-+#define pgd_clear(pgdp)
-+#define kern_addr_valid(addr)         (1)
-+#define       pmd_offset(a, b)        ((void *)0)
-+
-+#define PAGE_NONE             __pgprot(0)    /* these mean nothing to NO_MM */
-+#define PAGE_SHARED           __pgprot(0)    /* these mean nothing to NO_MM */
-+#define PAGE_COPY             __pgprot(0)    /* these mean nothing to NO_MM */
-+#define PAGE_READONLY         __pgprot(0)    /* these mean nothing to NO_MM */
-+#define PAGE_KERNEL           __pgprot(0)    /* these mean nothing to NO_MM */
-+//vic - this bit copied from m68knommu version
-+
-+extern void paging_init(void);
-+#define swapper_pg_dir ((pgd_t *) 0)
-+
-+#define __swp_type(x)         (0)
-+#define __swp_offset(x)               (0)
-+#define __swp_entry(typ,off)  ((swp_entry_t) { ((typ) | ((off) << 7)) })
-+#define __pte_to_swp_entry(pte)       ((swp_entry_t) { pte_val(pte) })
-+#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
-+
-+static inline int pte_file(pte_t pte) { return 0; }
-+
-+/*
-+ * ZERO_PAGE is a global shared page that is always zero: used
-+ * for zero-mapped memory areas etc..
-+ */
-+#define ZERO_PAGE(vaddr)      (virt_to_page(0))
-+
-+extern unsigned int kobjsize(const void *objp);
-+extern int is_in_rom(unsigned long);
-+
-+/*
-+ * No page table caches to initialise
-+ */
-+#define pgtable_cache_init()   do { } while (0)
-+
-+#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)               \
-+              remap_pfn_range(vma, vaddr, pfn, size, prot)
-+
-+extern inline void flush_cache_mm(struct mm_struct *mm)
-+{
-+}
-+
-+extern inline void flush_cache_range(struct mm_struct *mm,
-+                                   unsigned long start,
-+                                   unsigned long end)
-+{
-+}
-+
-+/* Push the page at kernel virtual address and clear the icache */
-+extern inline void flush_page_to_ram (unsigned long address)
-+{
-+}
-+
-+/* Push n pages at kernel virtual address and clear the icache */
-+extern inline void flush_pages_to_ram (unsigned long address, int n)
-+{
-+}
-+
-+/*
-+ * All 32bit addresses are effectively valid for vmalloc...
-+ * Sort of meaningless for non-VM targets.
-+ */
-+#define       VMALLOC_START   0
-+#define       VMALLOC_END     0xffffffff
-+
-+#define arch_enter_lazy_mmu_mode()    do {} while (0)
-+#define arch_leave_lazy_mmu_mode()    do {} while (0)
-+#define arch_flush_lazy_mmu_mode()    do {} while (0)
-+#define arch_enter_lazy_cpu_mode()    do {} while (0)
-+#define arch_leave_lazy_cpu_mode()    do {} while (0)
-+#define arch_flush_lazy_cpu_mode()    do {} while (0)
-+
-+#endif /* _NIOS_PGTABLE_H */
-diff --git a/include/asm-nios2nommu/pio_struct.h b/include/asm-nios2nommu/pio_struct.h
-new file mode 100644
-index 0000000..8ce5176
---- /dev/null
-+++ b/include/asm-nios2nommu/pio_struct.h
-@@ -0,0 +1,14 @@
-+// PIO Peripheral
-+
-+// PIO Registers
-+typedef volatile struct
-+      {
-+      int np_piodata;          // read/write, up to 32 bits
-+      int np_piodirection;     // write/readable, up to 32 bits, 1->output bit
-+      int np_piointerruptmask; // write/readable, up to 32 bits, 1->enable interrupt
-+      int np_pioedgecapture;   // read, up to 32 bits, cleared by any write
-+      } np_pio;
-+
-+// PIO Routines
-+void nr_pio_showhex(int value); // shows low byte on pio named na_seven_seg_pio
-+
-diff --git a/include/asm-nios2nommu/poll.h b/include/asm-nios2nommu/poll.h
-new file mode 100644
-index 0000000..f6b9ab8
---- /dev/null
-+++ b/include/asm-nios2nommu/poll.h
-@@ -0,0 +1,48 @@
-+#ifndef __NIOS2_POLL_H
-+#define __NIOS2_POLL_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/poll.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#define POLLIN                  1
-+#define POLLPRI                 2
-+#define POLLOUT                 4
-+#define POLLERR                 8
-+#define POLLHUP                16
-+#define POLLNVAL       32
-+#define POLLRDNORM     64
-+#define POLLWRNORM    POLLOUT
-+#define POLLRDBAND    128
-+#define POLLWRBAND    256
-+#define POLLMSG               0x0400
-+#define POLLREMOVE    0x1000
-+#define POLLRDHUP       0x2000
-+
-+struct pollfd {
-+      int fd;
-+      short events;
-+      short revents;
-+};
-+
-+#endif
-diff --git a/include/asm-nios2nommu/posix_types.h b/include/asm-nios2nommu/posix_types.h
-new file mode 100644
-index 0000000..0b019b5
---- /dev/null
-+++ b/include/asm-nios2nommu/posix_types.h
-@@ -0,0 +1,89 @@
-+#ifndef __ARCH_NIOS2_POSIX_TYPES_H
-+#define __ARCH_NIOS2_POSIX_TYPES_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/posix_types.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/*
-+ * This file is generally used by user-level software, so you need to
-+ * be a little careful about namespace pollution etc.  Also, we cannot
-+ * assume GCC is being used.
-+ */
-+
-+typedef unsigned long __kernel_ino_t;
-+typedef unsigned short        __kernel_mode_t;
-+typedef unsigned short        __kernel_nlink_t;
-+typedef long          __kernel_off_t;
-+typedef int           __kernel_pid_t;
-+typedef unsigned short        __kernel_ipc_pid_t;
-+typedef unsigned short        __kernel_uid_t;
-+typedef unsigned short        __kernel_gid_t;
-+typedef unsigned int  __kernel_size_t;
-+typedef int           __kernel_ssize_t;
-+typedef int           __kernel_ptrdiff_t;
-+typedef long          __kernel_time_t;
-+typedef long          __kernel_suseconds_t;
-+typedef long          __kernel_clock_t;
-+typedef int           __kernel_timer_t;
-+typedef int           __kernel_clockid_t;
-+typedef int           __kernel_daddr_t;
-+typedef char *                __kernel_caddr_t;
-+typedef unsigned short        __kernel_uid16_t;
-+typedef unsigned short        __kernel_gid16_t;
-+typedef unsigned int  __kernel_uid32_t;
-+typedef unsigned int  __kernel_gid32_t;
-+
-+typedef unsigned short        __kernel_old_uid_t;
-+typedef unsigned short        __kernel_old_gid_t;
-+typedef unsigned short        __kernel_old_dev_t;
-+
-+#ifdef __GNUC__
-+typedef long long     __kernel_loff_t;
-+#endif
-+
-+typedef struct {
-+#if defined(__KERNEL__) || defined(__USE_ALL)
-+      int     val[2];
-+#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
-+      int     __val[2];
-+#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
-+} __kernel_fsid_t;
-+
-+#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
-+
-+#undef        __FD_SET
-+#define       __FD_SET(d, set)        ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d))
-+
-+#undef        __FD_CLR
-+#define       __FD_CLR(d, set)        ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d))
-+
-+#undef        __FD_ISSET
-+#define       __FD_ISSET(d, set)      ((set)->fds_bits[__FDELT(d)] & __FDMASK(d))
-+
-+#undef        __FD_ZERO
-+#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp)))
-+
-+#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */
-+
-+#endif
-diff --git a/include/asm-nios2nommu/preem_latency.h b/include/asm-nios2nommu/preem_latency.h
-new file mode 100644
-index 0000000..6defb5c
---- /dev/null
-+++ b/include/asm-nios2nommu/preem_latency.h
-@@ -0,0 +1,39 @@
-+#ifndef _ASM_PREEM_LATENCY_H
-+#define _ASM_PREEM_LATENCY_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/preem_latency.h
-+ *
-+ * timing support for preempt-stats patch
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/nios.h>
-+
-+#define readclock(low) \
-+do {\
-+      *(volatile unsigned long *)na_Counter_64_bit=1; \
-+      low=*(volatile unsigned long *)na_Counter_64_bit; \
-+} while (0)
-+#define readclock_init()
-+
-+#endif /* _ASM_PREEM_LATENCY_H */
-diff --git a/include/asm-nios2nommu/processor.h b/include/asm-nios2nommu/processor.h
-new file mode 100644
-index 0000000..5332f94
---- /dev/null
-+++ b/include/asm-nios2nommu/processor.h
-@@ -0,0 +1,148 @@
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/processor.h
-+ *
-+ * Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
-+ * Copyright (C) 2001  Ken Hill (khill@microtronix.com)    
-+ *                     Vic Phillips (vic@microtronix.com)
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * hacked from:
-+ *      include/asm-sparc/processor.h
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ * Nov/02/2003      dgt     Fix task_size
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#ifndef __ASM_NIOS_PROCESSOR_H
-+#define __ASM_NIOS_PROCESSOR_H
-+
-+#define NIOS2_FLAG_KTHREAD    0x00000001      /* task is a kernel thread */
-+#define NIOS2_FLAG_COPROC     0x00000002      /* Thread used coprocess */
-+#define NIOS2_FLAG_DEBUG      0x00000004      /* task is being debugged */
-+
-+#define NIOS2_OP_NOP 0x1883a
-+#define NIOS2_OP_BREAK        0x3da03a
-+
-+#ifndef __ASSEMBLY__
-+
-+/*
-+ * Default implementation of macro that returns current
-+ * instruction pointer ("program counter").
-+ */
-+#define current_text_addr() ({ __label__ _l; _l: &&_l;})
-+
-+#include <linux/a.out.h>
-+#include <linux/string.h>
-+
-+#include <asm/ptrace.h>
-+#include <asm/signal.h>
-+#include <asm/segment.h>
-+#include <asm/current.h>
-+#include <asm/system.h> /* for get_hi_limit */
-+
-+/*
-+ * Bus types
-+ */
-+#define EISA_bus 0
-+#define EISA_bus__is_a_macro /* for versions in ksyms.c */
-+#define MCA_bus 0
-+#define MCA_bus__is_a_macro /* for versions in ksyms.c */
-+
-+/*
-+ * The nios has no problems with write protection
-+ */
-+#define wp_works_ok 1
-+#define wp_works_ok__is_a_macro /* for versions in ksyms.c */
-+
-+/* Whee, this is STACK_TOP and the lowest kernel address too... */
-+#if 0
-+#define KERNBASE        0x00000000  /* First address the kernel will eventually be */
-+#define TASK_SIZE     (KERNBASE)
-+#define MAX_USER_ADDR TASK_SIZE
-+#define MMAP_SEARCH_START (TASK_SIZE/3)
-+#endif
-+
-+#define TASK_SIZE     ((unsigned int) nasys_program_mem_end)   //...this is better...
-+
-+/*
-+ * This decides where the kernel will search for a free chunk of vm
-+ * space during mmap's. We won't be using it
-+ */
-+#define TASK_UNMAPPED_BASE    0
-+
-+/* The Nios processor specific thread struct. */
-+struct thread_struct {
-+      struct pt_regs *kregs;
-+
-+      /* For signal handling */
-+      unsigned long sig_address;
-+      unsigned long sig_desc;
-+
-+      /* Context switch saved kernel state. */
-+      unsigned long ksp;
-+      unsigned long kpsr;
-+      unsigned long kesr;
-+
-+      /* Flags are defined below */
-+
-+      unsigned long flags;
-+      int current_ds;
-+      struct exec core_exec;     /* just what it says. */
-+};
-+
-+#define INIT_MMAP { &init_mm, (0), (0), \
-+                  __pgprot(0x0) , VM_READ | VM_WRITE | VM_EXEC }
-+
-+#define INIT_THREAD  { \
-+      .kregs          = 0,                    \
-+      .sig_address    = 0,                    \
-+      .sig_desc       = 0,                    \
-+      .ksp            = 0,                    \
-+      .kpsr           = 0,                    \
-+      .kesr           = PS_S,                 \
-+      .flags          = NIOS2_FLAG_KTHREAD,   \
-+      .current_ds     = __KERNEL_DS,          \
-+      .core_exec      = INIT_EXEC             \
-+}
-+
-+/* Free all resources held by a thread. */
-+extern void release_thread(struct task_struct *);
-+
-+extern unsigned long thread_saved_pc(struct task_struct *t);
-+
-+extern void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp);
-+
-+/* Prepare to copy thread state - unlazy all lazy status */
-+#define prepare_to_copy(tsk)  do { } while (0)
-+
-+extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-+
-+unsigned long get_wchan(struct task_struct *p);
-+
-+#define KSTK_EIP(tsk)  ((tsk)->thread.kregs->ea)
-+#define KSTK_ESP(tsk)  ((tsk)->thread.kregs->sp)
-+
-+#ifdef __KERNEL__
-+/* Allocation and freeing of basic task resources. */
-+
-+//;dgt2;#define alloc_task_struct() ((struct task_struct *) xx..see..linux..fork..xx __get_free_pages(GFP_KERNEL,1))
-+//;dgt2;#define get_task_struct(tsk) xx..see..linux..sched.h...atomic_inc(&mem_map[MAP_NR(tsk)].count)
-+
-+#endif
-+
-+#define cpu_relax()    do { } while (0)
-+#endif /* __ASSEMBLY__ */
-+#endif /* __ASM_NIOS_PROCESSOR_H */
-diff --git a/include/asm-nios2nommu/ptrace.h b/include/asm-nios2nommu/ptrace.h
-new file mode 100644
-index 0000000..d669e08
---- /dev/null
-+++ b/include/asm-nios2nommu/ptrace.h
-@@ -0,0 +1,140 @@
-+/*
-+ * Taken from the m68k port.
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#ifndef _NIOS2NOMMU_PTRACE_H
-+#define _NIOS2NOMMU_PTRACE_H
-+
-+#ifndef __ASSEMBLY__
-+
-+#define PTR_R0                0
-+#define PTR_R1                1
-+#define PTR_R2                2
-+#define PTR_R3                3
-+#define PTR_R4                4
-+#define PTR_R5                5
-+#define PTR_R6                6
-+#define PTR_R7                7
-+#define PTR_R8                8
-+#define PTR_R9                9
-+#define PTR_R10               10
-+#define PTR_R11               11
-+#define PTR_R12               12
-+#define PTR_R13               13
-+#define PTR_R14               14
-+#define PTR_R15               15
-+#define PTR_R16               16
-+#define PTR_R17               17
-+#define PTR_R18               18
-+#define PTR_R19               19
-+#define PTR_R20               20
-+#define PTR_R21               21
-+#define PTR_R22               22
-+#define PTR_R23               23
-+#define PTR_R24               24
-+#define PTR_R25               25
-+#define PTR_GP                26
-+#define PTR_SP                27
-+#define PTR_FP                28
-+#define PTR_EA                29
-+#define PTR_BA                30
-+#define PTR_RA                31
-+#define PTR_STATUS    32
-+#define PTR_ESTATUS   33
-+#define PTR_BSTATUS   34
-+#define PTR_IENABLE   35
-+#define PTR_IPENDING  36
-+
-+/* this struct defines the way the registers are stored on the
-+   stack during a system call. 
-+
-+   There is a fake_regs in setup.c that has to match pt_regs.*/
-+
-+struct pt_regs {
-+      unsigned long  r8;
-+      unsigned long  r9;
-+      unsigned long  r10;
-+      unsigned long  r11;
-+      unsigned long  r12;
-+      unsigned long  r13;
-+      unsigned long  r14;
-+      unsigned long  r15;
-+      unsigned long  r1;
-+      unsigned long  r2;
-+      unsigned long  r3;
-+      unsigned long  r4;
-+      unsigned long  r5;
-+      unsigned long  r6;
-+      unsigned long  r7;
-+      unsigned long  orig_r2;
-+      unsigned long  ra;
-+      unsigned long  fp;
-+      unsigned long  sp;
-+      unsigned long  gp;
-+      unsigned long  estatus;
-+      unsigned long  status_extension;
-+      unsigned long  ea;
-+};
-+
-+
-+/*
-+ * This is the extended stack used by signal handlers and the context
-+ * switcher: it's pushed after the normal "struct pt_regs".
-+ */
-+struct switch_stack {
-+      unsigned long  r16;
-+      unsigned long  r17;
-+      unsigned long  r18;
-+      unsigned long  r19;
-+      unsigned long  r20;
-+      unsigned long  r21;
-+      unsigned long  r22;
-+      unsigned long  r23;
-+      unsigned long  fp;
-+      unsigned long  gp;
-+      unsigned long  ra;
-+};
-+
-+#ifdef __KERNEL__
-+/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
-+#define PTRACE_GETREGS            12
-+#define PTRACE_SETREGS            13
-+#ifdef CONFIG_FPU
-+#define PTRACE_GETFPREGS          14
-+#define PTRACE_SETFPREGS          15
-+#endif
-+
-+#ifndef PS_S
-+#define PS_S  (0x00000001)
-+#endif
-+#ifndef PS_T
-+#define PS_T  (0x00000002)
-+#endif
-+
-+#define user_mode(regs) (!((regs)->status_extension & PS_S))
-+#define instruction_pointer(regs) ((regs)->ra)
-+#define profile_pc(regs) instruction_pointer(regs)
-+extern void show_regs(struct pt_regs *);
-+
-+#endif /* __KERNEL__ */
-+#endif /* __ASSEMBLY__ */
-+#endif /* _NIOS2NOMMU_PTRACE_H */
-diff --git a/include/asm-nios2nommu/resource.h b/include/asm-nios2nommu/resource.h
-new file mode 100644
-index 0000000..9c2499a
---- /dev/null
-+++ b/include/asm-nios2nommu/resource.h
-@@ -0,0 +1,6 @@
-+#ifndef __ASM_SH_RESOURCE_H
-+#define __ASM_SH_RESOURCE_H
-+
-+#include <asm-generic/resource.h>
-+
-+#endif /* __ASM_SH_RESOURCE_H */
-diff --git a/include/asm-nios2nommu/rmap.h b/include/asm-nios2nommu/rmap.h
-new file mode 100644
-index 0000000..b3664cc
---- /dev/null
-+++ b/include/asm-nios2nommu/rmap.h
-@@ -0,0 +1,2 @@
-+/* Do not need anything here */
-+
-diff --git a/include/asm-nios2nommu/scatterlist.h b/include/asm-nios2nommu/scatterlist.h
-new file mode 100644
-index 0000000..20898e2
---- /dev/null
-+++ b/include/asm-nios2nommu/scatterlist.h
-@@ -0,0 +1,13 @@
-+#ifndef __ASM_SH_SCATTERLIST_H
-+#define __ASM_SH_SCATTERLIST_H
-+
-+struct scatterlist {
-+    struct page * page; /* Location for highmem page, if any */
-+    unsigned int offset;/* for highmem, page offset */
-+    dma_addr_t dma_address;
-+    unsigned int length;
-+};
-+
-+#define ISA_DMA_THRESHOLD (0xffffffff)
-+
-+#endif /* !(__ASM_SH_SCATTERLIST_H) */
-diff --git a/include/asm-nios2nommu/sections.h b/include/asm-nios2nommu/sections.h
-new file mode 100644
-index 0000000..61b3f71
---- /dev/null
-+++ b/include/asm-nios2nommu/sections.h
-@@ -0,0 +1,30 @@
-+#ifndef _NIOS2NOMMU_SECTIONS_H
-+#define _NIOS2NOMMU_SECTIONS_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/sections.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm-generic/sections.h>
-+
-+#endif /* _NIOS2NOMMU_SECTIONS_H */
-diff --git a/include/asm-nios2nommu/segment.h b/include/asm-nios2nommu/segment.h
-new file mode 100644
-index 0000000..25871b3
---- /dev/null
-+++ b/include/asm-nios2nommu/segment.h
-@@ -0,0 +1,75 @@
-+#ifndef _NIOS2NOMMU_SEGMENT_H
-+#define _NIOS2NOMMU_SEGMENT_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/segment.h
-+ *
-+ * Derived from M68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/* define constants */
-+/* Address spaces (FC0-FC2) */
-+#define USER_DATA     (1)
-+#ifndef __USER_DS
-+#define __USER_DS     (USER_DATA)
-+#endif
-+#define USER_PROGRAM  (2)
-+#define SUPER_DATA    (5)
-+#ifndef __KERNEL_DS
-+#define __KERNEL_DS   (SUPER_DATA)
-+#endif
-+#define SUPER_PROGRAM (6)
-+#define CPU_SPACE     (7)
-+
-+#ifndef __ASSEMBLY__
-+
-+typedef struct {
-+      unsigned long seg;
-+} mm_segment_t;
-+
-+#define MAKE_MM_SEG(s)        ((mm_segment_t) { (s) })
-+#define USER_DS               MAKE_MM_SEG(__USER_DS)
-+#define KERNEL_DS     MAKE_MM_SEG(__KERNEL_DS)
-+
-+/*
-+ * Get/set the SFC/DFC registers for MOVES instructions
-+ */
-+
-+static inline mm_segment_t get_fs(void)
-+{
-+    return USER_DS;
-+}
-+
-+static inline mm_segment_t get_ds(void)
-+{
-+    /* return the supervisor data space code */
-+    return KERNEL_DS;
-+}
-+
-+static inline void set_fs(mm_segment_t val)
-+{
-+}
-+
-+#define segment_eq(a,b)       ((a).seg == (b).seg)
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#endif /* _NIOS2NOMMU_SEGMENT_H */
-diff --git a/include/asm-nios2nommu/semaphore-helper.h b/include/asm-nios2nommu/semaphore-helper.h
-new file mode 100644
-index 0000000..a8905d1
---- /dev/null
-+++ b/include/asm-nios2nommu/semaphore-helper.h
-@@ -0,0 +1,99 @@
-+#ifndef _NIOS2NOMMU_SEMAPHORE_HELPER_H
-+#define _NIOS2NOMMU_SEMAPHORE_HELPER_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/semaphore.h
-+ *
-+ * SMP- and interrupt-safe semaphores helper functions.
-+ *
-+ * Derived from M68knommu
-+ *
-+ * (C) Copyright 1996 Linus Torvalds
-+ * m68k version by Andreas Schwab
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+/*
-+ * These two _must_ execute atomically wrt each other.
-+ */
-+static inline void wake_one_more(struct semaphore * sem)
-+{
-+      atomic_inc(&sem->waking);
-+}
-+
-+static inline int waking_non_zero(struct semaphore *sem)
-+{
-+      int ret;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&semaphore_wake_lock, flags);
-+      ret = 0;
-+      if (atomic_read(&sem->waking) > 0) {
-+              atomic_dec(&sem->waking);
-+              ret = 1;
-+      }
-+      spin_unlock_irqrestore(&semaphore_wake_lock, flags);
-+      return ret;
-+}
-+
-+/*
-+ * waking_non_zero_interruptible:
-+ *    1       got the lock
-+ *    0       go to sleep
-+ *    -EINTR  interrupted
-+ */
-+static inline int waking_non_zero_interruptible(struct semaphore *sem,
-+                                              struct task_struct *tsk)
-+{
-+      int ret;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&semaphore_wake_lock, flags);
-+      ret = 0;
-+      if (atomic_read(&sem->waking) > 0) {
-+              atomic_dec(&sem->waking);
-+              ret = 1;
-+      } else if (signal_pending(tsk)) {
-+              atomic_inc(&sem->count);
-+              ret = -EINTR;
-+      }
-+      spin_unlock_irqrestore(&semaphore_wake_lock, flags);
-+      return ret;
-+}
-+
-+/*
-+ * waking_non_zero_trylock:
-+ *    1       failed to lock
-+ *    0       got the lock
-+ */
-+static inline int waking_non_zero_trylock(struct semaphore *sem)
-+{
-+      int ret;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&semaphore_wake_lock, flags);
-+      ret = 1;
-+      if (atomic_read(&sem->waking) > 0) {
-+              atomic_dec(&sem->waking);
-+              ret = 0;
-+      } else
-+              atomic_inc(&sem->count);
-+      spin_unlock_irqrestore(&semaphore_wake_lock, flags);
-+      return ret;
-+}
-+
-+#endif
-diff --git a/include/asm-nios2nommu/semaphore.h b/include/asm-nios2nommu/semaphore.h
-new file mode 100644
-index 0000000..8d66c77
---- /dev/null
-+++ b/include/asm-nios2nommu/semaphore.h
-@@ -0,0 +1,152 @@
-+#ifndef _NIOS2NOMMU_SEMAPHORE_H
-+#define _NIOS2NOMMU_SEMAPHORE_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/semaphore.h
-+ *
-+ * Interrupt-safe semaphores..
-+ *
-+ * Derived from M68knommu
-+ *
-+ * (C) Copyright 1996 Linus Torvalds
-+ * m68k version by Andreas Schwab
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#define RW_LOCK_BIAS           0x01000000
-+
-+#ifndef __ASSEMBLY__
-+
-+#include <linux/linkage.h>
-+#include <linux/wait.h>
-+#include <linux/spinlock.h>
-+#include <linux/rwsem.h>
-+
-+#include <asm/system.h>
-+#include <asm/atomic.h>
-+
-+struct semaphore {
-+      atomic_t count;
-+      atomic_t waking;
-+      wait_queue_head_t wait;
-+};
-+
-+#define __SEMAPHORE_INITIALIZER(name, n)                              \
-+{                                                                     \
-+      .count          = ATOMIC_INIT(n),                               \
-+      .waking         = ATOMIC_INIT(0),                               \
-+      .wait           = __WAIT_QUEUE_HEAD_INITIALIZER((name).wait)    \
-+}
-+
-+#define __DECLARE_SEMAPHORE_GENERIC(name,count) \
-+      struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
-+
-+#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
-+#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
-+
-+static inline void sema_init (struct semaphore *sem, int val)
-+{
-+      *sem = (struct semaphore)__SEMAPHORE_INITIALIZER(*sem, val);
-+}
-+
-+static inline void init_MUTEX (struct semaphore *sem)
-+{
-+      sema_init(sem, 1);
-+}
-+
-+static inline void init_MUTEX_LOCKED (struct semaphore *sem)
-+{
-+      sema_init(sem, 0);
-+}
-+
-+asmlinkage void __down_failed(void /* special register calling convention */);
-+asmlinkage int  __down_failed_interruptible(void  /* params in registers */);
-+asmlinkage int  __down_failed_trylock(void  /* params in registers */);
-+asmlinkage void __up_wakeup(void /* special register calling convention */);
-+
-+asmlinkage void __down(struct semaphore * sem);
-+asmlinkage int  __down_interruptible(struct semaphore * sem);
-+asmlinkage int  __down_trylock(struct semaphore * sem);
-+asmlinkage void __up(struct semaphore * sem);
-+
-+extern spinlock_t semaphore_wake_lock;
-+
-+/*
-+ * This is ugly, but we want the default case to fall through.
-+ * "down_failed" is a special asm handler that calls the C
-+ * routine that actually waits.
-+ */
-+static inline void down(struct semaphore * sem)
-+{
-+      might_sleep();
-+
-+  #if 0
-+    ...Nios2 has no atomic "decrement memory"....
-+  #else
-+      if (atomic_dec_return(&sem->count) < 0)
-+              __down(sem);
-+  #endif
-+}
-+
-+static inline int down_interruptible(struct semaphore * sem)
-+{
-+      int ret = 0;
-+
-+
-+      might_sleep();
-+
-+  #if 0
-+    ...Nios2 has no atomic "decrement memory"....
-+  #else
-+      if(atomic_dec_return(&sem->count) < 0)
-+              ret = __down_interruptible(sem);
-+      return ret;
-+  #endif
-+}
-+
-+static inline int down_trylock(struct semaphore * sem)
-+{
-+  #if 0
-+    ...Nios2 has no atomic "decrement memory"....
-+  #else
-+      int ret = 0;
-+
-+      if (atomic_dec_return (&sem->count) < 0)
-+              ret = __down_trylock(sem);
-+      return ret;
-+  #endif
-+}
-+
-+/*
-+ * Note! This is subtle. We jump to wake people up only if
-+ * the semaphore was negative (== somebody was waiting on it).
-+ * The default case (no contention) will result in NO
-+ * jumps for both down() and up().
-+ */
-+static inline void up(struct semaphore * sem)
-+{
-+  #if 0
-+    ...Nios2 has no atomic "increment memory"....
-+  #else
-+      if (atomic_inc_return(&sem->count) <= 0)
-+              __up(sem);
-+  #endif
-+}
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#endif
-diff --git a/include/asm-nios2nommu/sembuf.h b/include/asm-nios2nommu/sembuf.h
-new file mode 100644
-index 0000000..e530cab
---- /dev/null
-+++ b/include/asm-nios2nommu/sembuf.h
-@@ -0,0 +1,48 @@
-+#ifndef _NIOS_SEMBUF_H
-+#define _NIOS_SEMBUF_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/sembuf.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/* 
-+ * Note extra padding because this structure is passed back and forth
-+ * between kernel and user space.
-+ *
-+ * Pad space is left for:
-+ * - 64-bit time_t to solve y2038 problem
-+ * - 2 miscellaneous 32-bit values
-+ */
-+
-+struct semid64_ds {
-+      struct ipc64_perm sem_perm;             /* permissions .. see ipc.h */
-+      __kernel_time_t sem_otime;              /* last semop time */
-+      unsigned long   __unused1;
-+      __kernel_time_t sem_ctime;              /* last change time */
-+      unsigned long   __unused2;
-+      unsigned long   sem_nsems;              /* no. of semaphores in array */
-+      unsigned long   __unused3;
-+      unsigned long   __unused4;
-+};
-+
-+#endif /* _NIOS_SEMBUF_H */
-diff --git a/include/asm-nios2nommu/setup.h b/include/asm-nios2nommu/setup.h
-new file mode 100644
-index 0000000..c5a655a
---- /dev/null
-+++ b/include/asm-nios2nommu/setup.h
-@@ -0,0 +1,31 @@
-+/*    Copied from i386 port.
-+ *    Just a place holder. We don't want to have to test x86 before
-+ *    we include stuff
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2_SETUP_H
-+#define _NIOS2_SETUP_H
-+
-+#define COMMAND_LINE_SIZE 512
-+
-+#endif /* _NIOS2_SETUP_H */
-diff --git a/include/asm-nios2nommu/shmbuf.h b/include/asm-nios2nommu/shmbuf.h
-new file mode 100644
-index 0000000..f6e6e7d
---- /dev/null
-+++ b/include/asm-nios2nommu/shmbuf.h
-@@ -0,0 +1,64 @@
-+#ifndef _NIOS_SHMBUF_H
-+#define _NIOS_SHMBUF_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/shmbuf.h
-+ *
-+ * Derived from m68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/* Note extra padding because this structure is passed back and forth
-+ * between kernel and user space.
-+ *
-+ * Pad space is left for:
-+ * - 64-bit time_t to solve y2038 problem
-+ * - 2 miscellaneous 32-bit values
-+ */
-+
-+struct shmid64_ds {
-+      struct ipc64_perm       shm_perm;       /* operation perms */
-+      size_t                  shm_segsz;      /* size of segment (bytes) */
-+      __kernel_time_t         shm_atime;      /* last attach time */
-+      unsigned long           __unused1;
-+      __kernel_time_t         shm_dtime;      /* last detach time */
-+      unsigned long           __unused2;
-+      __kernel_time_t         shm_ctime;      /* last change time */
-+      unsigned long           __unused3;
-+      __kernel_pid_t          shm_cpid;       /* pid of creator */
-+      __kernel_pid_t          shm_lpid;       /* pid of last operator */
-+      unsigned long           shm_nattch;     /* no. of current attaches */
-+      unsigned long           __unused4;
-+      unsigned long           __unused5;
-+};
-+
-+struct shminfo64 {
-+      unsigned long   shmmax;
-+      unsigned long   shmmin;
-+      unsigned long   shmmni;
-+      unsigned long   shmseg;
-+      unsigned long   shmall;
-+      unsigned long   __unused1;
-+      unsigned long   __unused2;
-+      unsigned long   __unused3;
-+      unsigned long   __unused4;
-+};
-+
-+#endif /* _NIOS_SHMBUF_H */
-diff --git a/include/asm-nios2nommu/shmparam.h b/include/asm-nios2nommu/shmparam.h
-new file mode 100644
-index 0000000..94efe2d
---- /dev/null
-+++ b/include/asm-nios2nommu/shmparam.h
-@@ -0,0 +1,30 @@
-+#ifndef __NIOS2NOMMU_SHMPARAM_H__
-+#define __NIOS2NOMMU_SHMPARAM_H__
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/shmparam.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#define       SHMLBA          PAGE_SIZE       /* attach addr a multiple of this */
-+
-+#endif /* __NIOS2NOMMU_SHMPARAM_H__ */
-diff --git a/include/asm-nios2nommu/sigcontext.h b/include/asm-nios2nommu/sigcontext.h
-new file mode 100644
-index 0000000..7321e7d
---- /dev/null
-+++ b/include/asm-nios2nommu/sigcontext.h
-@@ -0,0 +1,35 @@
-+/*
-+ * Taken from the m68knommu.
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ * 
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _ASM_NIOS2NOMMU_SIGCONTEXT_H
-+#define _ASM_NIOS2NOMMU_SIGCONTEXT_H
-+
-+#include <asm/ptrace.h>
-+
-+struct sigcontext {
-+      struct pt_regs regs;
-+      unsigned long  sc_mask;         /* old sigmask */
-+};
-+
-+#endif
-diff --git a/include/asm-nios2nommu/siginfo.h b/include/asm-nios2nommu/siginfo.h
-new file mode 100644
-index 0000000..c047c0b
---- /dev/null
-+++ b/include/asm-nios2nommu/siginfo.h
-@@ -0,0 +1,28 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2NOMMU_SIGINFO_H
-+#define _NIOS2NOMMU_SIGINFO_H
-+
-+#include <asm-generic/siginfo.h>
-+
-+#endif
-diff --git a/include/asm-nios2nommu/signal.h b/include/asm-nios2nommu/signal.h
-new file mode 100644
-index 0000000..c86a20c
---- /dev/null
-+++ b/include/asm-nios2nommu/signal.h
-@@ -0,0 +1,181 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2_SIGNAL_H
-+#define _NIOS2_SIGNAL_H
-+
-+#include <linux/types.h>
-+
-+/* Avoid too many header ordering problems.  */
-+struct siginfo;
-+
-+#ifdef __KERNEL__
-+/* Most things should be clean enough to redefine this at will, if care
-+   is taken to make libc match.  */
-+
-+#define _NSIG         64
-+#define _NSIG_BPW     32
-+#define _NSIG_WORDS   (_NSIG / _NSIG_BPW)
-+
-+typedef unsigned long old_sigset_t;           /* at least 32 bits */
-+
-+typedef struct {
-+      unsigned long sig[_NSIG_WORDS];
-+} sigset_t;
-+
-+#else
-+/* Here we must cater to libcs that poke about in kernel headers.  */
-+
-+#define NSIG          32
-+typedef unsigned long sigset_t;
-+
-+#endif /* __KERNEL__ */
-+
-+#define SIGHUP                 1
-+#define SIGINT                 2
-+#define SIGQUIT                3
-+#define SIGILL                 4
-+#define SIGTRAP                5
-+#define SIGABRT                6
-+#define SIGIOT                 6
-+#define SIGBUS                 7
-+#define SIGFPE                 8
-+#define SIGKILL                9
-+#define SIGUSR1               10
-+#define SIGSEGV               11
-+#define SIGUSR2               12
-+#define SIGPIPE               13
-+#define SIGALRM               14
-+#define SIGTERM               15
-+#define SIGSTKFLT     16
-+#define SIGCHLD               17
-+#define SIGCONT               18
-+#define SIGSTOP               19
-+#define SIGTSTP               20
-+#define SIGTTIN               21
-+#define SIGTTOU               22
-+#define SIGURG                23
-+#define SIGXCPU               24
-+#define SIGXFSZ               25
-+#define SIGVTALRM     26
-+#define SIGPROF               27
-+#define SIGWINCH      28
-+#define SIGIO         29
-+#define SIGPOLL               SIGIO
-+/*
-+#define SIGLOST               29
-+*/
-+#define SIGPWR                30
-+#define SIGSYS                31
-+#define       SIGUNUSED       31
-+
-+/* These should not be considered constants from userland.  */
-+#define SIGRTMIN      32
-+#define SIGRTMAX      _NSIG
-+
-+/*
-+ * SA_FLAGS values:
-+ *
-+ * SA_ONSTACK indicates that a registered stack_t will be used.
-+ * SA_RESTART flag to get restarting signals (which were the default long ago)
-+ * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
-+ * SA_RESETHAND clears the handler when the signal is delivered.
-+ * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
-+ * SA_NODEFER prevents the current signal from being masked in the handler.
-+ *
-+ * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
-+ * Unix names RESETHAND and NODEFER respectively.
-+ */
-+#define SA_NOCLDSTOP  0x00000001
-+#define SA_NOCLDWAIT  0x00000002 /* not supported yet */
-+#define SA_SIGINFO    0x00000004
-+#define SA_ONSTACK    0x08000000
-+#define SA_RESTART    0x10000000
-+#define SA_NODEFER    0x40000000
-+#define SA_RESETHAND  0x80000000
-+
-+#define SA_NOMASK     SA_NODEFER
-+#define SA_ONESHOT    SA_RESETHAND
-+
-+/* 
-+ * sigaltstack controls
-+ */
-+#define SS_ONSTACK    1
-+#define SS_DISABLE    2
-+
-+#define MINSIGSTKSZ   2048
-+#define SIGSTKSZ      8192
-+
-+#include <asm-generic/signal.h>
-+
-+#ifdef __KERNEL__
-+struct old_sigaction {
-+      __sighandler_t sa_handler;
-+      old_sigset_t sa_mask;
-+      unsigned long sa_flags;
-+      void (*sa_restorer)(void);
-+};
-+
-+struct sigaction {
-+      __sighandler_t sa_handler;
-+      unsigned long sa_flags;
-+      void (*sa_restorer)(void);
-+      sigset_t sa_mask;               /* mask last for extensibility */
-+};
-+
-+struct k_sigaction {
-+      struct sigaction sa;
-+};
-+#else
-+/* Here we must cater to libcs that poke about in kernel headers.  */
-+
-+struct sigaction {
-+      union {
-+        __sighandler_t _sa_handler;
-+        void (*_sa_sigaction)(int, struct siginfo *, void *);
-+      } _u;
-+      sigset_t sa_mask;
-+      unsigned long sa_flags;
-+      void (*sa_restorer)(void);
-+};
-+
-+#define sa_handler    _u._sa_handler
-+#define sa_sigaction  _u._sa_sigaction
-+
-+#endif /* __KERNEL__ */
-+
-+typedef struct sigaltstack {
-+      void *ss_sp;
-+      int ss_flags;
-+      size_t ss_size;
-+} stack_t;
-+
-+#ifdef __KERNEL__
-+
-+#include <asm/sigcontext.h>
-+#undef __HAVE_ARCH_SIG_BITOPS
-+
-+#define ptrace_signal_deliver(regs, cookie) do { } while (0)
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NIOS2_SIGNAL_H */
-diff --git a/include/asm-nios2nommu/smp.h b/include/asm-nios2nommu/smp.h
-new file mode 100644
-index 0000000..fb23307
---- /dev/null
-+++ b/include/asm-nios2nommu/smp.h
-@@ -0,0 +1,32 @@
-+#ifndef __ASM_SMP_H
-+#define __ASM_SMP_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/smp.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#ifdef CONFIG_SMP
-+#error SMP not supported
-+#endif
-+
-+#endif
-diff --git a/include/asm-nios2nommu/socket.h b/include/asm-nios2nommu/socket.h
-new file mode 100644
-index 0000000..5452e2b
---- /dev/null
-+++ b/include/asm-nios2nommu/socket.h
-@@ -0,0 +1,79 @@
-+#ifndef _ASM_SOCKET_H
-+#define _ASM_SOCKET_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/socket.h
-+ *
-+ * Derived from m68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/sockios.h>
-+
-+/* For setsockopt(2) */
-+#define SOL_SOCKET    1
-+
-+#define SO_DEBUG      1
-+#define SO_REUSEADDR  2
-+#define SO_TYPE               3
-+#define SO_ERROR      4
-+#define SO_DONTROUTE  5
-+#define SO_BROADCAST  6
-+#define SO_SNDBUF     7
-+#define SO_RCVBUF     8
-+#define SO_SNDBUFFORCE        32
-+#define SO_RCVBUFFORCE        33
-+#define SO_KEEPALIVE  9
-+#define SO_OOBINLINE  10
-+#define SO_NO_CHECK   11
-+#define SO_PRIORITY   12
-+#define SO_LINGER     13
-+#define SO_BSDCOMPAT  14
-+/* To add :#define SO_REUSEPORT 15 */
-+#define SO_PASSCRED   16
-+#define SO_PEERCRED   17
-+#define SO_RCVLOWAT   18
-+#define SO_SNDLOWAT   19
-+#define SO_RCVTIMEO   20
-+#define SO_SNDTIMEO   21
-+
-+/* Security levels - as per NRL IPv6 - don't actually do anything */
-+#define SO_SECURITY_AUTHENTICATION            22
-+#define SO_SECURITY_ENCRYPTION_TRANSPORT      23
-+#define SO_SECURITY_ENCRYPTION_NETWORK                24
-+
-+#define SO_BINDTODEVICE       25
-+
-+/* Socket filtering */
-+#define SO_ATTACH_FILTER        26
-+#define SO_DETACH_FILTER        27
-+
-+#define SO_PEERNAME             28
-+#define SO_TIMESTAMP          29
-+#define SCM_TIMESTAMP         SO_TIMESTAMP
-+
-+#define SO_ACCEPTCONN         30
-+
-+#define SO_PEERSEC            31      /* ;dgt2;tmp;                   */
-+#define SO_PASSSEC            34
-+#define SO_TIMESTAMPNS                35
-+#define SCM_TIMESTAMPNS               SO_TIMESTAMPNS
-+
-+#endif /* _ASM_SOCKET_H */
-diff --git a/include/asm-nios2nommu/sockios.h b/include/asm-nios2nommu/sockios.h
-new file mode 100644
-index 0000000..c604aa7
---- /dev/null
-+++ b/include/asm-nios2nommu/sockios.h
-@@ -0,0 +1,39 @@
-+#ifndef _ASM_NIOS_SOCKIOS_H
-+#define _ASM_NIOS_SOCKIOS_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/sockios.h
-+ *
-+ * Socket-level I/O control calls.
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#define FIOSETOWN     0x8901
-+#define SIOCSPGRP     0x8902
-+#define FIOGETOWN     0x8903
-+#define SIOCGPGRP     0x8904
-+#define SIOCATMARK    0x8905
-+#define SIOCGSTAMP    0x8906  /* Get stamp */
-+#define SIOCGSTAMPNS  0x8907  /* Get stamp (timespec) */
-+
-+#endif /* !(_ASM_NIOS_SOCKIOS_H) */
-+
-diff --git a/include/asm-nios2nommu/spi.h b/include/asm-nios2nommu/spi.h
-new file mode 100644
-index 0000000..6efb82c
---- /dev/null
-+++ b/include/asm-nios2nommu/spi.h
-@@ -0,0 +1,92 @@
-+#ifndef _ASM_SPI_H_
-+#define _ASM_SPI_H_ 1
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/spi.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/nios.h>
-+
-+int  register_NIOS_SPI( void );
-+void unregister_NIOS_SPI( void );
-+
-+#if defined(MODULE)
-+void cleanup_module( void );
-+int  init_module( void );
-+#endif
-+
-+#if defined(__KERNEL__)
-+int  spi_reset  ( void );
-+#endif
-+
-+
-+#define clockCS 0x01
-+#define temperatureCS 0x02
-+
-+#define clock_read_base 0x00
-+#define clock_write_base 0x80
-+#define clock_read_control 0x0F
-+#define clock_read_trickle 0x11
-+
-+#define clock_read_sec 0x00
-+#define clock_read_min 0x01
-+#define clock_read_hour 0x02
-+#define clock_read_day 0x03
-+#define clock_read_date 0x04
-+#define clock_read_month 0x05
-+#define clock_read_year 0x06
-+
-+#define clock_write_control 0x8F
-+#define clock_write_trickle 0x91
-+#define clock_write_sec 0x80
-+#define clock_write_min 0x81
-+#define clock_write_hour 0x82
-+#define clock_write_day 0x83
-+#define clock_write_date 0x84
-+#define clock_write_month 0x85
-+#define clock_write_year 0x86
-+
-+#define clock_write_ram_start 0xA0
-+#define clock_write_ram_end 0x100
-+#define clock_read_ram_start 0x20
-+#define clock_read_ram_end 0x80
-+
-+
-+#define       clock_sec_def 0x11
-+#define clock_min_def 0x59
-+#define clock_hour_def 0x71
-+#define clock_day_def 0x00
-+#define clock_date_def 0x20
-+#define clock_month_def 0x12
-+#define clock_year_def 0x34
-+
-+#define temp_read_base 0x00
-+#define temp_write_base 0x80
-+#define temp_read_control 0x00
-+#define temp_write_control 0x80
-+#define temp_read_msb 0x02
-+#define temp_read_lsb 0x01
-+
-+#define MAX_TEMP_VAR 10
-+
-+#endif /*_ASM_SPI_H_*/
-diff --git a/include/asm-nios2nommu/spi_struct.h b/include/asm-nios2nommu/spi_struct.h
-new file mode 100644
-index 0000000..c7b2faf
---- /dev/null
-+++ b/include/asm-nios2nommu/spi_struct.h
-@@ -0,0 +1,57 @@
-+// SPI Registers
-+typedef volatile struct
-+  {
-+  int np_spirxdata;       // Read-only, 1-16 bit
-+  int np_spitxdata;       // Write-only, same width as rxdata
-+  int np_spistatus;       // Read-only, 9-bit
-+  int np_spicontrol;      // Read/Write, 9-bit
-+  int np_spireserved;     // reserved
-+  int np_spislaveselect;  // Read/Write, 1-16 bit, master only
-+  int np_spiendofpacket;  // Read/write, same width as txdata, rxdata.
-+  } np_spi;
-+
-+// SPI Status Register Bits
-+enum
-+  {
-+  np_spistatus_eop_bit  = 9,
-+  np_spistatus_e_bit    = 8,
-+  np_spistatus_rrdy_bit = 7,
-+  np_spistatus_trdy_bit = 6,
-+  np_spistatus_tmt_bit  = 5,
-+  np_spistatus_toe_bit  = 4,
-+  np_spistatus_roe_bit  = 3,
-+
-+  np_spistatus_eop_mask  = (1 << 9),
-+  np_spistatus_e_mask    = (1 << 8),
-+  np_spistatus_rrdy_mask = (1 << 7),
-+  np_spistatus_trdy_mask = (1 << 6),
-+  np_spistatus_tmt_mask  = (1 << 5),
-+  np_spistatus_toe_mask  = (1 << 4),
-+  np_spistatus_roe_mask  = (1 << 3),
-+  };
-+
-+// SPI Control Register Bits
-+enum
-+  {
-+  np_spicontrol_sso_bit   = 10,
-+  np_spicontrol_ieop_bit  = 9,
-+  np_spicontrol_ie_bit    = 8,
-+  np_spicontrol_irrdy_bit = 7,
-+  np_spicontrol_itrdy_bit = 6,
-+  np_spicontrol_itoe_bit  = 4,
-+  np_spicontrol_iroe_bit  = 3,
-+
-+  np_spicontrol_sso_mask   = (1 << 10),
-+  np_spicontrol_ieop_mask  = (1 << 9),
-+  np_spicontrol_ie_mask    = (1 << 8),
-+  np_spicontrol_irrdy_mask = (1 << 7),
-+  np_spicontrol_itrdy_mask = (1 << 6),
-+  np_spicontrol_itoe_mask  = (1 << 4),
-+  np_spicontrol_iroe_mask  = (1 << 3),
-+  };
-+
-+// SPI Routines.
-+int nr_spi_rxchar(np_spi *spiBase);
-+int nr_spi_txchar(int i, np_spi *spiBase);
-+
-+
-diff --git a/include/asm-nios2nommu/spinlock.h b/include/asm-nios2nommu/spinlock.h
-new file mode 100644
-index 0000000..f518755
---- /dev/null
-+++ b/include/asm-nios2nommu/spinlock.h
-@@ -0,0 +1,30 @@
-+#ifndef __NIOS_SPINLOCK_H
-+#define __NIOS_SPINLOCK_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/spinlock.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#error "Nios doesn't do SMP yet"
-+
-+#endif
-diff --git a/include/asm-nios2nommu/stat.h b/include/asm-nios2nommu/stat.h
-new file mode 100644
-index 0000000..bd27a97
---- /dev/null
-+++ b/include/asm-nios2nommu/stat.h
-@@ -0,0 +1,102 @@
-+#ifndef _ASMNIOS2NOMMU_STAT_H
-+#define _ASMNIOS2NOMMU_STAT_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/stat.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+struct __old_kernel_stat {
-+      unsigned short st_dev;
-+      unsigned short st_ino;
-+      unsigned short st_mode;
-+      unsigned short st_nlink;
-+      unsigned short st_uid;
-+      unsigned short st_gid;
-+      unsigned short st_rdev;
-+      unsigned long  st_size;
-+      unsigned long  st_atime;
-+      unsigned long  st_mtime;
-+      unsigned long  st_ctime;
-+};
-+
-+struct stat {
-+      unsigned short st_dev;
-+      unsigned short __pad1;
-+      unsigned long st_ino;
-+      unsigned short st_mode;
-+      unsigned short st_nlink;
-+      unsigned short st_uid;
-+      unsigned short st_gid;
-+      unsigned short st_rdev;
-+      unsigned short __pad2;
-+      unsigned long  st_size;
-+      unsigned long  st_blksize;
-+      unsigned long  st_blocks;
-+      unsigned long  st_atime;
-+      unsigned long  __unused1;
-+      unsigned long  st_mtime;
-+      unsigned long  __unused2;
-+      unsigned long  st_ctime;
-+      unsigned long  __unused3;
-+      unsigned long  __unused4;
-+      unsigned long  __unused5;
-+};
-+
-+/* This matches struct stat64 in glibc2.1, hence the absolutely
-+ * insane amounts of padding around dev_t's.
-+ */
-+struct stat64 {
-+      unsigned long long      st_dev;
-+      unsigned char   __pad1[4];
-+
-+#define STAT64_HAS_BROKEN_ST_INO      1
-+      unsigned long   __st_ino;
-+
-+      unsigned int    st_mode;
-+      unsigned int    st_nlink;
-+
-+      unsigned long   st_uid;
-+      unsigned long   st_gid;
-+
-+      unsigned long long      st_rdev;
-+      unsigned char   __pad3[4];
-+
-+      long long       st_size;
-+      unsigned long   st_blksize;
-+
-+      unsigned long   __pad4;         /* future possible st_blocks high bits */
-+      unsigned long   st_blocks;      /* Number 512-byte blocks allocated. */
-+
-+      unsigned long   st_atime;
-+      unsigned long   st_atime_nsec;
-+
-+      unsigned long   st_mtime;
-+      unsigned long   st_mtime_nsec;
-+
-+      unsigned long   st_ctime;
-+      unsigned long   st_ctime_nsec;
-+
-+      unsigned long long      st_ino;
-+};
-+
-+#endif
-diff --git a/include/asm-nios2nommu/statfs.h b/include/asm-nios2nommu/statfs.h
-new file mode 100644
-index 0000000..c4637f6
---- /dev/null
-+++ b/include/asm-nios2nommu/statfs.h
-@@ -0,0 +1,30 @@
-+#ifndef _NIOS2NOMMU_STATFS_H
-+#define _NIOS2NOMMU_STATFS_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/statfs.h
-+ *
-+ * Derived from M68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm-generic/statfs.h>
-+
-+#endif /* _NIOS2NOMMU_STATFS_H */
-diff --git a/include/asm-nios2nommu/string.h b/include/asm-nios2nommu/string.h
-new file mode 100644
-index 0000000..7e39479
---- /dev/null
-+++ b/include/asm-nios2nommu/string.h
-@@ -0,0 +1,45 @@
-+#ifndef __NIOS_STRING_H__
-+#define __NIOS_STRING_H__
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/string.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#ifdef __KERNEL__ /* only set these up for kernel code */
-+
-+#define __HAVE_ARCH_MEMMOVE
-+void * memmove(void * d, const void * s, size_t count);
-+#define __HAVE_ARCH_MEMCPY
-+extern void * memcpy(void *d, const void *s, size_t count);
-+#define __HAVE_ARCH_MEMSET
-+extern void * memset(void * s,int c,size_t count);
-+
-+#if 0
-+#define __HAVE_ARCH_BCOPY
-+#define __HAVE_ARCH_STRLEN
-+#endif
-+
-+#endif /* KERNEL */
-+
-+#endif /* !(__NIOS_STRING_H__) */
-diff --git a/include/asm-nios2nommu/system.h b/include/asm-nios2nommu/system.h
-new file mode 100644
-index 0000000..7c35af0
---- /dev/null
-+++ b/include/asm-nios2nommu/system.h
-@@ -0,0 +1,172 @@
-+/*
-+ * Taken from the m68k.
-+ *
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _NIOS2NOMMU_SYSTEM_H
-+#define _NIOS2NOMMU_SYSTEM_H
-+
-+#include <linux/linkage.h>
-+#include <linux/compiler.h>
-+#include <asm/segment.h>
-+#include <asm/entry.h>
-+#include <asm/nios.h>
-+
-+/*
-+ * switch_to(n) should switch tasks to task ptr, first checking that
-+ * ptr isn't the current task, in which case it does nothing.  This
-+ * also clears the TS-flag if the task we switched to has used the
-+ * math co-processor latest.
-+ */
-+
-+/*
-+ */
-+asmlinkage void resume(void);
-+#define switch_to(prev,next,last)                             \
-+{                                                             \
-+  void *_last;                                                        \
-+  __asm__ __volatile__(                                               \
-+      "mov    r4, %1\n"                                       \
-+      "mov    r5, %2\n"                                       \
-+      "call   resume\n"                                       \
-+      "mov    %0,r4\n"                                        \
-+       : "=r" (_last)                                         \
-+       : "r" (prev), "r" (next)                                       \
-+       : "r4","r5","r7","r8","ra");   \
-+  (last) = _last;                                             \
-+}
-+
-+#define local_irq_enable() __asm__ __volatile__ (  \
-+      "rdctl  r8, status\n"                      \
-+      "ori    r8, r8, 1\n"                       \
-+      "wrctl  status, r8\n"                      \
-+      : : : "r8")       
-+
-+#define local_irq_disable() __asm__ __volatile__ ( \
-+      "rdctl  r8, status\n"                      \
-+      "andi   r8, r8, 0xfffe\n"                  \
-+      "wrctl  status, r8\n"                      \
-+      : : : "r8")
-+
-+#define local_save_flags(x) __asm__ __volatile__ (    \
-+      "rdctl  r8, status\n"                           \
-+      "mov    %0, r8\n"                               \
-+      :"=r" (x) : : "r8", "memory")
-+
-+#define local_irq_restore(x) __asm__ __volatile__ (   \
-+      "mov    r8, %0\n"                               \
-+      "wrctl  status, r8\n"                           \
-+      : :"r" (x) : "memory")
-+
-+/* For spinlocks etc */
-+#define local_irq_save(x) do { local_save_flags(x); local_irq_disable(); } while (0)
-+
-+#define       irqs_disabled()                                 \
-+({                                                    \
-+      unsigned long flags;                            \
-+      local_save_flags(flags);                        \
-+      ((flags & NIOS2_STATUS_PIE_MSK) == 0x0);        \
-+})
-+
-+#define iret() __asm__ __volatile__ ("eret": : :"memory", "ea")
-+
-+/*
-+ * Force strict CPU ordering.
-+ * Not really required on m68k...
-+ */
-+#define nop()  asm volatile ("nop"::)
-+#define mb()   asm volatile (""   : : :"memory")
-+#define rmb()  asm volatile (""   : : :"memory")
-+#define wmb()  asm volatile (""   : : :"memory")
-+#define set_rmb(var, value)    do { xchg(&var, value); } while (0)
-+#define set_mb(var, value)     set_rmb(var, value)
-+#define set_wmb(var, value)    do { var = value; wmb(); } while (0)
-+
-+#ifdef CONFIG_SMP
-+#define smp_mb()      mb()
-+#define smp_rmb()     rmb()
-+#define smp_wmb()     wmb()
-+#define smp_read_barrier_depends()    read_barrier_depends()
-+#else
-+#define smp_mb()      barrier()
-+#define smp_rmb()     barrier()
-+#define smp_wmb()     barrier()
-+#define smp_read_barrier_depends()    do { } while(0)
-+#endif
-+
-+#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
-+#define tas(ptr) (xchg((ptr),1))
-+
-+struct __xchg_dummy { unsigned long a[100]; };
-+#define __xg(x) ((volatile struct __xchg_dummy *)(x))
-+
-+static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+{
-+  unsigned long tmp, flags;
-+
-+  local_irq_save(flags);
-+
-+  switch (size) {
-+  case 1:
-+    __asm__ __volatile__( \
-+      "ldb    %0, %2\n" \
-+      "stb    %1, %2\n" \
-+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
-+    break;
-+  case 2:
-+    __asm__ __volatile__( \
-+      "ldh    %0, %2\n" \
-+      "sth    %1, %2\n" \
-+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
-+    break;
-+  case 4:
-+    __asm__ __volatile__( \
-+      "ldw    %0, %2\n" \
-+      "stw    %1, %2\n" \
-+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
-+    break;
-+  }
-+  local_irq_restore(flags);
-+  return tmp;
-+}
-+
-+/*
-+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
-+ * store NEW in MEM.  Return the initial value in MEM.  Success is
-+ * indicated by comparing RETURN with OLD.
-+ */
-+#define __HAVE_ARCH_CMPXCHG   1
-+
-+static __inline__ unsigned long
-+cmpxchg(volatile int *p, int old, int new)
-+{
-+      unsigned long flags;
-+      int prev;
-+
-+      local_irq_save(flags);
-+      if ((prev = *p) == old)
-+              *p = new;
-+      local_irq_restore(flags);
-+      return(prev);
-+}
-+
-+#endif /* _NIOS2NOMMU_SYSTEM_H */
-diff --git a/include/asm-nios2nommu/termbits.h b/include/asm-nios2nommu/termbits.h
-new file mode 100644
-index 0000000..74ef61d
---- /dev/null
-+++ b/include/asm-nios2nommu/termbits.h
-@@ -0,0 +1,210 @@
-+#ifndef __ARCH_NIOS_TERMBITS_H__
-+#define __ARCH_NIOS_TERMBITS_H__
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/termbits.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <linux/posix_types.h>
-+
-+typedef unsigned char cc_t;
-+typedef unsigned int  speed_t;
-+typedef unsigned int  tcflag_t;
-+
-+#define NCCS 19
-+struct termios {
-+      tcflag_t c_iflag;               /* input mode flags */
-+      tcflag_t c_oflag;               /* output mode flags */
-+      tcflag_t c_cflag;               /* control mode flags */
-+      tcflag_t c_lflag;               /* local mode flags */
-+      cc_t c_line;                    /* line discipline */
-+      cc_t c_cc[NCCS];                /* control characters */
-+};
-+
-+struct ktermios {
-+      tcflag_t c_iflag;               /* input mode flags */
-+      tcflag_t c_oflag;               /* output mode flags */
-+      tcflag_t c_cflag;               /* control mode flags */
-+      tcflag_t c_lflag;               /* local mode flags */
-+      cc_t c_line;                    /* line discipline */
-+      cc_t c_cc[NCCS];                /* control characters */
-+      speed_t c_ispeed;               /* input speed */
-+      speed_t c_ospeed;               /* output speed */
-+};
-+
-+/* c_cc characters */
-+#define VINTR 0
-+#define VQUIT 1
-+#define VERASE 2
-+#define VKILL 3
-+#define VEOF 4
-+#define VTIME 5
-+#define VMIN 6
-+#define VSWTC 7
-+#define VSTART 8
-+#define VSTOP 9
-+#define VSUSP 10
-+#define VEOL 11
-+#define VREPRINT 12
-+#define VDISCARD 13
-+#define VWERASE 14
-+#define VLNEXT 15
-+#define VEOL2 16
-+
-+
-+/* c_iflag bits */
-+#define IGNBRK        0000001
-+#define BRKINT        0000002
-+#define IGNPAR        0000004
-+#define PARMRK        0000010
-+#define INPCK 0000020
-+#define ISTRIP        0000040
-+#define INLCR 0000100
-+#define IGNCR 0000200
-+#define ICRNL 0000400
-+#define IUCLC 0001000
-+#define IXON  0002000
-+#define IXANY 0004000
-+#define IXOFF 0010000
-+#define IMAXBEL       0020000
-+#define IUTF8 0040000
-+
-+/* c_oflag bits */
-+#define OPOST 0000001
-+#define OLCUC 0000002
-+#define ONLCR 0000004
-+#define OCRNL 0000010
-+#define ONOCR 0000020
-+#define ONLRET        0000040
-+#define OFILL 0000100
-+#define OFDEL 0000200
-+#define NLDLY 0000400
-+#define   NL0 0000000
-+#define   NL1 0000400
-+#define CRDLY 0003000
-+#define   CR0 0000000
-+#define   CR1 0001000
-+#define   CR2 0002000
-+#define   CR3 0003000
-+#define TABDLY        0014000
-+#define   TAB0        0000000
-+#define   TAB1        0004000
-+#define   TAB2        0010000
-+#define   TAB3        0014000
-+#define   XTABS       0014000
-+#define BSDLY 0020000
-+#define   BS0 0000000
-+#define   BS1 0020000
-+#define VTDLY 0040000
-+#define   VT0 0000000
-+#define   VT1 0040000
-+#define FFDLY 0100000
-+#define   FF0 0000000
-+#define   FF1 0100000
-+
-+/* c_cflag bit meaning */
-+#define CBAUD 0010017
-+#define  B0   0000000         /* hang up */
-+#define  B50  0000001
-+#define  B75  0000002
-+#define  B110 0000003
-+#define  B134 0000004
-+#define  B150 0000005
-+#define  B200 0000006
-+#define  B300 0000007
-+#define  B600 0000010
-+#define  B1200        0000011
-+#define  B1800        0000012
-+#define  B2400        0000013
-+#define  B4800        0000014
-+#define  B9600        0000015
-+#define  B19200       0000016
-+#define  B38400       0000017
-+#define EXTA B19200
-+#define EXTB B38400
-+#define CSIZE 0000060
-+#define   CS5 0000000
-+#define   CS6 0000020
-+#define   CS7 0000040
-+#define   CS8 0000060
-+#define CSTOPB        0000100
-+#define CREAD 0000200
-+#define PARENB        0000400
-+#define PARODD        0001000
-+#define HUPCL 0002000
-+#define CLOCAL        0004000
-+#define CBAUDEX 0010000
-+#define    B57600 0010001
-+#define   B115200 0010002
-+#define   B230400 0010003
-+#define   B460800 0010004
-+#define   B500000 0010005
-+#define   B576000 0010006
-+#define   B921600 0010007
-+#define  B1000000 0010010
-+#define  B1152000 0010011
-+#define  B1500000 0010012
-+#define  B2000000 0010013
-+#define  B2500000 0010014
-+#define  B3000000 0010015
-+#define  B3500000 0010016
-+#define  B4000000 0010017
-+#define CIBAUD          002003600000  /* input baud rate (not used) */
-+#define CMSPAR          010000000000          /* mark or space (stick) parity */
-+#define CRTSCTS         020000000000          /* flow control */
-+
-+/* c_lflag bits */
-+#define ISIG  0000001
-+#define ICANON        0000002
-+#define XCASE 0000004
-+#define ECHO  0000010
-+#define ECHOE 0000020
-+#define ECHOK 0000040
-+#define ECHONL        0000100
-+#define NOFLSH        0000200
-+#define TOSTOP        0000400
-+#define ECHOCTL       0001000
-+#define ECHOPRT       0002000
-+#define ECHOKE        0004000
-+#define FLUSHO        0010000
-+#define PENDIN        0040000
-+#define IEXTEN        0100000
-+
-+
-+/* tcflow() and TCXONC use these */
-+#define       TCOOFF          0
-+#define       TCOON           1
-+#define       TCIOFF          2
-+#define       TCION           3
-+
-+/* tcflush() and TCFLSH use these */
-+#define       TCIFLUSH        0
-+#define       TCOFLUSH        1
-+#define       TCIOFLUSH       2
-+
-+/* tcsetattr uses these */
-+#define       TCSANOW         0
-+#define       TCSADRAIN       1
-+#define       TCSAFLUSH       2
-+
-+#endif /* __ARCH_NIOS_TERMBITS_H__ */
-diff --git a/include/asm-nios2nommu/termios.h b/include/asm-nios2nommu/termios.h
-new file mode 100644
-index 0000000..db0dddf
---- /dev/null
-+++ b/include/asm-nios2nommu/termios.h
-@@ -0,0 +1,132 @@
-+#ifndef _NIOS_TERMIOS_H
-+#define _NIOS_TERMIOS_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/termios.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/termbits.h>
-+#include <asm/ioctls.h>
-+ 
-+struct winsize {
-+      unsigned short ws_row;
-+      unsigned short ws_col;
-+      unsigned short ws_xpixel;
-+      unsigned short ws_ypixel;
-+};
-+
-+#define NCC 8
-+struct termio {
-+      unsigned short c_iflag;         /* input mode flags */
-+      unsigned short c_oflag;         /* output mode flags */
-+      unsigned short c_cflag;         /* control mode flags */
-+      unsigned short c_lflag;         /* local mode flags */
-+      unsigned char c_line;           /* line discipline */
-+      unsigned char c_cc[NCC];        /* control characters */
-+};
-+
-+#ifdef __KERNEL__
-+/*    intr=^C         quit=^|         erase=del       kill=^U
-+      eof=^D          vtime=\0        vmin=\1         sxtc=\0
-+      start=^Q        stop=^S         susp=^Z         eol=\0
-+      reprint=^R      discard=^U      werase=^W       lnext=^V
-+      eol2=\0
-+*/
-+#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
-+#endif
-+
-+/* modem lines */
-+#define TIOCM_LE      0x001
-+#define TIOCM_DTR     0x002
-+#define TIOCM_RTS     0x004
-+#define TIOCM_ST      0x008
-+#define TIOCM_SR      0x010
-+#define TIOCM_CTS     0x020
-+#define TIOCM_CAR     0x040
-+#define TIOCM_RNG     0x080
-+#define TIOCM_DSR     0x100
-+#define TIOCM_CD      TIOCM_CAR
-+#define TIOCM_RI      TIOCM_RNG
-+#define TIOCM_OUT1    0x2000
-+#define TIOCM_OUT2    0x4000
-+#define TIOCM_LOOP    0x8000
-+
-+/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
-+
-+/* line disciplines */
-+#define N_TTY         0
-+#define N_SLIP                1
-+#define N_MOUSE               2
-+#define N_PPP         3
-+#define N_STRIP               4
-+#define N_AX25                5
-+#define N_X25         6       /* X.25 async */
-+#define N_6PACK               7
-+#define N_MASC                8       /* Reserved for Mobitex module <kaz@cafe.net> */
-+#define N_R3964               9       /* Reserved for Simatic R3964 module */
-+#define N_PROFIBUS_FDL        10      /* Reserved for Profibus <Dave@mvhi.com> */
-+#define N_IRDA                11      /* Linux IrDa - http://irda.sourceforge.net/ */
-+#define N_SMSBLOCK    12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-+#define N_HDLC                13      /* synchronous HDLC */
-+#define N_SYNC_PPP    14
-+#define N_HCI         15  /* Bluetooth HCI UART */
-+
-+#ifdef __KERNEL__
-+
-+/*
-+ * Translate a "termio" structure into a "termios". Ugh.
-+ */
-+#define user_termio_to_kernel_termios(termios, termio) \
-+({ \
-+      unsigned short tmp; \
-+      get_user(tmp, &(termio)->c_iflag); \
-+      (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
-+      get_user(tmp, &(termio)->c_oflag); \
-+      (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
-+      get_user(tmp, &(termio)->c_cflag); \
-+      (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
-+      get_user(tmp, &(termio)->c_lflag); \
-+      (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
-+      get_user((termios)->c_line, &(termio)->c_line); \
-+      copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
-+})
-+
-+/*
-+ * Translate a "termios" structure into a "termio". Ugh.
-+ */
-+#define kernel_termios_to_user_termio(termio, termios) \
-+({ \
-+      put_user((termios)->c_iflag, &(termio)->c_iflag); \
-+      put_user((termios)->c_oflag, &(termio)->c_oflag); \
-+      put_user((termios)->c_cflag, &(termio)->c_cflag); \
-+      put_user((termios)->c_lflag, &(termio)->c_lflag); \
-+      put_user((termios)->c_line,  &(termio)->c_line); \
-+      copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
-+})
-+
-+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
-+
-+#endif        /* __KERNEL__ */
-+
-+#endif /* _NIOS_TERMIOS_H */
-diff --git a/include/asm-nios2nommu/thread_info.h b/include/asm-nios2nommu/thread_info.h
-new file mode 100644
-index 0000000..6d51e0c
---- /dev/null
-+++ b/include/asm-nios2nommu/thread_info.h
-@@ -0,0 +1,127 @@
-+/* thread_info.h: niosnommu low-level thread information
-+ * adapted from the m68knommu
-+ *
-+ * Copyright (C) 2004 Microtronix Datacom Ltd.
-+ * Copyright (C) 2002 Microtronix Datacom 
-+ *
-+ * - Incorporating suggestions made by Linus Torvalds and Dave Miller
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#ifndef _ASM_THREAD_INFO_H
-+#define _ASM_THREAD_INFO_H
-+
-+#include <asm/page.h>
-+
-+#ifdef __KERNEL__
-+
-+#ifndef __ASSEMBLY__
-+
-+/*
-+ * low level task data.
-+ */
-+struct thread_info {
-+      struct task_struct *task;               /* main task structure */
-+      struct exec_domain *exec_domain;        /* execution domain */
-+      unsigned long      flags;               /* low level flags */
-+      int                cpu;                 /* cpu we're on */
-+      int                preempt_count;       /* 0 => preemptable, <0 => BUG*/
-+      struct restart_block restart_block;
-+};
-+
-+/*
-+ * macros/functions for gaining access to the thread information structure
-+ */
-+#define INIT_THREAD_INFO(tsk)                 \
-+{                                             \
-+      .task           = &tsk,                 \
-+      .exec_domain    = &default_exec_domain, \
-+      .flags          = 0,                    \
-+      .cpu            = 0,                    \
-+      .preempt_count  = 1,                    \
-+      .restart_block  = {                     \
-+              .fn = do_no_restart_syscall,    \
-+      },                                      \
-+}
-+
-+#define init_thread_info      (init_thread_union.thread_info)
-+#define init_stack            (init_thread_union.stack)
-+
-+
-+/* how to get the thread information struct from C
-+   usable only in supervisor mode */
-+static inline struct thread_info *current_thread_info(void)
-+{
-+      struct thread_info *ti;
-+      __asm__ __volatile__(
-+              "mov    %0, sp\n"
-+              "and    %0, %0, %1\n"
-+              : "=&r"(ti)
-+              : "r" (~(THREAD_SIZE-1))
-+              );
-+      return ti;
-+}
-+
-+/* thread information allocation */
-+#define alloc_thread_info(tsk) ((struct thread_info *) \
-+                              __get_free_pages(GFP_KERNEL, 1))
-+#define free_thread_info(ti)  free_pages((unsigned long) (ti), 1)
-+#define put_thread_info(ti)   put_task_struct((ti)->task)
-+
-+#define       PREEMPT_ACTIVE  0x4000000
-+
-+/*
-+ * thread information flag bit numbers
-+ */
-+#define TIF_SYSCALL_TRACE     0       /* syscall trace active */
-+#define TIF_NOTIFY_RESUME     1       /* resumption notification requested */
-+#define TIF_SIGPENDING                2       /* signal pending */
-+#define TIF_NEED_RESCHED      3       /* rescheduling necessary */
-+#define TIF_POLLING_NRFLAG    4       /* true if poll_idle() is polling
-+                                         TIF_NEED_RESCHED */
-+#define TIF_MEMDIE            5
-+
-+/* as above, but as bit values */
-+#define _TIF_SYSCALL_TRACE    (1<<TIF_SYSCALL_TRACE)
-+#define _TIF_NOTIFY_RESUME    (1<<TIF_NOTIFY_RESUME)
-+#define _TIF_SIGPENDING               (1<<TIF_SIGPENDING)
-+#define _TIF_NEED_RESCHED     (1<<TIF_NEED_RESCHED)
-+#define _TIF_POLLING_NRFLAG   (1<<TIF_POLLING_NRFLAG)
-+
-+#define _TIF_WORK_MASK                0x0000FFFE      /* work to do on interrupt/exception return */
-+
-+#else /* __ASSEMBLY__ */
-+
-+/* how to get the thread information struct from ASM 
-+   usable only in supervisor mode */
-+.macro GET_THREAD_INFO reg 
-+.if THREAD_SIZE & 0xffff0000
-+      andhi   \reg, sp, %hi(~(THREAD_SIZE-1))
-+.else
-+      addi    \reg, r0, %lo(~(THREAD_SIZE-1))
-+      and     \reg, \reg, sp
-+.endif
-+.endm
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _ASM_THREAD_INFO_H */
-diff --git a/include/asm-nios2nommu/timer_struct.h b/include/asm-nios2nommu/timer_struct.h
-new file mode 100644
-index 0000000..d811a37
---- /dev/null
-+++ b/include/asm-nios2nommu/timer_struct.h
-@@ -0,0 +1,38 @@
-+
-+// ----------------------------------------------
-+// Timer Peripheral
-+
-+// Timer Registers
-+typedef volatile struct
-+      {
-+      int np_timerstatus;  // read only, 2 bits (any write to clear TO)
-+      int np_timercontrol; // write/readable, 4 bits
-+      int np_timerperiodl; // write/readable, 16 bits
-+      int np_timerperiodh; // write/readable, 16 bits
-+      int np_timersnapl;   // read only, 16 bits
-+      int np_timersnaph;   // read only, 16 bits
-+      } np_timer;
-+
-+// Timer Register Bits
-+enum
-+      {
-+      np_timerstatus_run_bit    = 1, // timer is running
-+      np_timerstatus_to_bit     = 0, // timer has timed out
-+
-+      np_timercontrol_stop_bit  = 3, // stop the timer
-+      np_timercontrol_start_bit = 2, // start the timer
-+      np_timercontrol_cont_bit  = 1, // continous mode
-+      np_timercontrol_ito_bit   = 0, // enable time out interrupt
-+
-+      np_timerstatus_run_mask    = (1<<1), // timer is running
-+      np_timerstatus_to_mask     = (1<<0), // timer has timed out
-+
-+      np_timercontrol_stop_mask  = (1<<3), // stop the timer
-+      np_timercontrol_start_mask = (1<<2), // start the timer
-+      np_timercontrol_cont_mask  = (1<<1), // continous mode
-+      np_timercontrol_ito_mask   = (1<<0)  // enable time out interrupt
-+      };
-+
-+// Timer Routines
-+int nr_timer_milliseconds(void);      // Starts on first call, hogs timer1.
-+
-diff --git a/include/asm-nios2nommu/timex.h b/include/asm-nios2nommu/timex.h
-new file mode 100644
-index 0000000..abd48cc
---- /dev/null
-+++ b/include/asm-nios2nommu/timex.h
-@@ -0,0 +1,48 @@
-+#ifndef _ASMNIOS2NOMMU_TIMEX_H
-+#define _ASMNIOS2NOMMU_TIMEX_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/timex.h
-+ *
-+ * timex specifications
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/nios.h>
-+
-+
-+#define CLOCK_TICK_RATE       nasys_clock_freq /* Underlying HZ */
-+
-+#define CLOCK_TICK_FACTOR     20      /* Factor of both 1000000 and CLOCK_TICK_RATE */
-+
-+#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \
-+      (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \
-+              << (SHIFT_SCALE-SHIFT_HZ)) / HZ)
-+
-+typedef unsigned long cycles_t;
-+
-+static inline cycles_t get_cycles(void)
-+{
-+      return 0;
-+}
-+
-+#endif
-diff --git a/include/asm-nios2nommu/tlb.h b/include/asm-nios2nommu/tlb.h
-new file mode 100644
-index 0000000..c597b25
---- /dev/null
-+++ b/include/asm-nios2nommu/tlb.h
-@@ -0,0 +1,35 @@
-+#ifndef __NIOS_TLB_H__
-+#define __NIOS_TLB_H__
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/tlb.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ *  Copyright (C) 2003  Microtronix Datacom Ltd
-+ *  Copyright (C) 2002  NEC Corporation
-+ *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Written by Miles Bader <miles@gnu.org>
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#define tlb_flush(tlb)        ((void)0)
-+
-+#include <asm-generic/tlb.h>
-+
-+#endif /* __NIOS_TLB_H__ */
-+
-diff --git a/include/asm-nios2nommu/tlbflush.h b/include/asm-nios2nommu/tlbflush.h
-new file mode 100644
-index 0000000..63cbe52
---- /dev/null
-+++ b/include/asm-nios2nommu/tlbflush.h
-@@ -0,0 +1,86 @@
-+#ifndef _NIOS2NOMMU_TLBFLUSH_H
-+#define _NIOS2NOMMU_TLBFLUSH_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/tlbflush.h
-+ *
-+ * Ported from m68knommu.
-+ *
-+ * Copyright (C) 2003 Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+#include <asm/setup.h>
-+
-+/*
-+ * flush all user-space atc entries.
-+ */
-+static inline void __flush_tlb(void)
-+{
-+      BUG();
-+}
-+
-+static inline void __flush_tlb_one(unsigned long addr)
-+{
-+      BUG();
-+}
-+
-+#define flush_tlb() __flush_tlb()
-+
-+/*
-+ * flush all atc entries (both kernel and user-space entries).
-+ */
-+static inline void flush_tlb_all(void)
-+{
-+      BUG();
-+}
-+
-+static inline void flush_tlb_mm(struct mm_struct *mm)
-+{
-+      BUG();
-+}
-+
-+static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
-+{
-+      BUG();
-+}
-+
-+static inline void flush_tlb_range(struct mm_struct *mm,
-+                                 unsigned long start, unsigned long end)
-+{
-+      BUG();
-+}
-+
-+extern inline void flush_tlb_kernel_page(unsigned long addr)
-+{
-+      BUG();
-+}
-+
-+extern inline void flush_tlb_pgtables(struct mm_struct *mm,
-+                                    unsigned long start, unsigned long end)
-+{
-+      BUG();
-+}
-+
-+#endif /* _NIOS2NOMMU_TLBFLUSH_H */
-diff --git a/include/asm-nios2nommu/topology.h b/include/asm-nios2nommu/topology.h
-new file mode 100644
-index 0000000..cfe1054
---- /dev/null
-+++ b/include/asm-nios2nommu/topology.h
-@@ -0,0 +1,30 @@
-+#ifndef _ASM_NIOS2NOMMU_TOPOLOGY_H
-+#define _ASM_NIOS2NOMMU_TOPOLOGY_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/topology.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm-generic/topology.h>
-+
-+#endif /* _ASM_NIOS2NOMMU_TOPOLOGY_H */
-diff --git a/include/asm-nios2nommu/traps.h b/include/asm-nios2nommu/traps.h
-new file mode 100644
-index 0000000..e03ef7f
---- /dev/null
-+++ b/include/asm-nios2nommu/traps.h
-@@ -0,0 +1,27 @@
-+/*
-+ * Copyright (C) 2004, Microtronix Datacom Ltd.
-+ *
-+ * All rights reserved.          
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
-+ * NON INFRINGEMENT.  See the GNU General Public License for more
-+ * details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#ifndef _NIOS2_TRAPS_H
-+#define _NIOS2_TRAPS_H
-+
-+#define TRAP_ID_SYSCALL 0
-+#define TRAP_ID_APPDEBUG 1
-+#endif /* !(_NIOS2_TRAPS_H) */
-diff --git a/include/asm-nios2nommu/types.h b/include/asm-nios2nommu/types.h
-new file mode 100644
-index 0000000..dd7a48e
---- /dev/null
-+++ b/include/asm-nios2nommu/types.h
-@@ -0,0 +1,91 @@
-+#ifndef _NIOS_TYPES_H
-+#define _NIOS_TYPES_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/types.h
-+ *
-+ * Derived from m68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/*
-+ * This file is never included by application software unless
-+ * explicitly requested (e.g., via linux/types.h) in which case the
-+ * application is Linux specific so (user-) name space pollution is
-+ * not a major issue.  However, for interoperability, libraries still
-+ * need to be careful to avoid a name clashes.
-+ */
-+
-+#ifndef __ASSEMBLY__
-+
-+typedef unsigned short umode_t;
-+
-+/*
-+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
-+ * header files exported to user space
-+ */
-+
-+typedef __signed__ char __s8;
-+typedef unsigned char __u8;
-+
-+typedef __signed__ short __s16;
-+typedef unsigned short __u16;
-+
-+typedef __signed__ int __s32;
-+typedef unsigned int __u32;
-+
-+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-+typedef __signed__ long long __s64;
-+typedef unsigned long long __u64;
-+#endif
-+
-+#endif /* __ASSEMBLY__ */
-+
-+/*
-+ * These aren't exported outside the kernel to avoid name space clashes
-+ */
-+#ifdef __KERNEL__
-+
-+#define BITS_PER_LONG 32
-+
-+#ifndef __ASSEMBLY__
-+
-+typedef signed char s8;
-+typedef unsigned char u8;
-+
-+typedef signed short s16;
-+typedef unsigned short u16;
-+
-+typedef signed int s32;
-+typedef unsigned int u32;
-+
-+typedef signed long long s64;
-+typedef unsigned long long u64;
-+
-+/* DMA addresses are always 32-bits wide */
-+
-+typedef u32 dma_addr_t;
-+typedef u32 dma64_addr_t;
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NIOS_TYPES_H */
-diff --git a/include/asm-nios2nommu/uaccess.h b/include/asm-nios2nommu/uaccess.h
-new file mode 100644
-index 0000000..e7ea20a
---- /dev/null
-+++ b/include/asm-nios2nommu/uaccess.h
-@@ -0,0 +1,184 @@
-+#ifndef __NIOS2NOMMU_UACCESS_H
-+#define __NIOS2NOMMU_UACCESS_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * asm-nios2nommu/uaccess.h
-+ *
-+ * User space memory access functions
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Ported from asm-m68knommu/uaccess.h --wentao
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <asm/segment.h>
-+#include <asm/nios.h>
-+
-+#define VERIFY_READ   0
-+#define VERIFY_WRITE  1
-+
-+#define access_ok(type,addr,size)     _access_ok((unsigned long)(addr),(size))
-+
-+static inline int _access_ok(unsigned long addr, unsigned long size)
-+{
-+      return (((unsigned long)addr < (unsigned long)nasys_program_mem_end) &&
-+              (((unsigned long)addr >= (unsigned long)nasys_program_mem)));
-+}
-+
-+extern inline int verify_area(int type, const void * addr, unsigned long size)
-+{
-+      return access_ok(type,addr,size)?0:-EFAULT;
-+}
-+
-+/*
-+ * The exception table consists of pairs of addresses: the first is the
-+ * address of an instruction that is allowed to fault, and the second is
-+ * the address at which the program should continue.  No registers are
-+ * modified, so it is entirely up to the continuation code to figure out
-+ * what to do.
-+ *
-+ * All the routines below use bits of fixup code that are out of line
-+ * with the main instruction path.  This means when everything is well,
-+ * we don't even have to jump over them.  Further, they do not intrude
-+ * on our cache or tlb entries.
-+ */
-+
-+#define ARCH_HAS_SEARCH_EXTABLE
-+//;dgt2;tmp;
-+
-+struct exception_table_entry
-+{
-+      unsigned long insn, fixup;
-+};
-+
-+/* Returns 0 if exception not found and fixup otherwise.  */
-+extern unsigned long search_exception_table(unsigned long);
-+
-+
-+/*
-+ * These are the main single-value transfer routines.  They automatically
-+ * use the right size if we just have the right pointer type.
-+ */
-+
-+#define put_user(x, ptr)                              \
-+({                                                    \
-+    int __pu_err = 0;                                 \
-+    typeof(*(ptr)) __pu_val = (x);                    \
-+    switch (sizeof (*(ptr))) {                                \
-+    case 1:                                           \
-+    case 2:                                           \
-+    case 4:                                           \
-+    case 8:                                           \
-+      memcpy(ptr, &__pu_val, sizeof (*(ptr))); \
-+      break;                                          \
-+    default:                                          \
-+      __pu_err = __put_user_bad();                    \
-+      break;                                          \
-+    }                                                 \
-+    __pu_err;                                         \
-+})
-+#define __put_user(x, ptr) put_user(x, ptr)
-+
-+extern int __put_user_bad(void);
-+
-+/*
-+ * Tell gcc we read from memory instead of writing: this is because
-+ * we do not write to any memory gcc knows about, so there are no
-+ * aliasing issues.
-+ */
-+
-+#define __ptr(x) ((unsigned long *)(x))
-+
-+#define get_user(x, ptr)                                      \
-+({                                                            \
-+    int __gu_err = 0;                                         \
-+    typeof(*(ptr)) __gu_val = 0;                              \
-+    switch (sizeof(*(ptr))) {                                 \
-+    case 1:                                           \
-+    case 2:                                           \
-+    case 4:                                           \
-+    case 8:                                           \
-+      memcpy(&__gu_val, ptr, sizeof (*(ptr))); \
-+      break;                                                  \
-+    default:                                                  \
-+      __gu_val = 0;                                           \
-+      __gu_err = __get_user_bad();                            \
-+      break;                                                  \
-+    }                                                         \
-+    (x) = __gu_val;                                           \
-+    __gu_err;                                                 \
-+})
-+#define __get_user(x, ptr) get_user(x, ptr)
-+
-+extern int __get_user_bad(void);
-+
-+#define copy_from_user(to, from, n)           (memcpy(to, from, n), 0)
-+#define copy_to_user(to, from, n)             (memcpy(to, from, n), 0)
-+
-+#define __copy_from_user(to, from, n) copy_from_user(to, from, n)
-+#define __copy_to_user(to, from, n) copy_to_user(to, from, n)
-+#define __copy_to_user_inatomic __copy_to_user
-+#define __copy_from_user_inatomic __copy_from_user
-+
-+#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; })
-+
-+#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; })
-+
-+/*
-+ * Copy a null terminated string from userspace.
-+ */
-+
-+static inline long
-+strncpy_from_user(char *dst, const char *src, long count)
-+{
-+      char *tmp;
-+      strncpy(dst, src, count);
-+      for (tmp = dst; *tmp && count > 0; tmp++, count--)
-+              ;
-+      return(tmp - dst); /* DAVIDM should we count a NUL ?  check getname */
-+}
-+
-+/*
-+ * Return the size of a string (including the ending 0)
-+ *
-+ * Return 0 on exception, a value greater than N if too long
-+ */
-+static inline long strnlen_user(const char *src, long n)
-+{
-+      return(strlen(src) + 1); /* DAVIDM make safer */
-+}
-+
-+#define strlen_user(str) strnlen_user(str, 32767)
-+
-+/*
-+ * Zero Userspace
-+ */
-+
-+static inline unsigned long __clear_user(void *to, unsigned long n)
-+{
-+      memset(to, 0, n);
-+      return(0);
-+}
-+
-+#define clear_user(to, n) __clear_user(to, n)
-+
-+#endif /* _NIOS2NOMMU_UACCESS_H */
-diff --git a/include/asm-nios2nommu/uart_struct.h b/include/asm-nios2nommu/uart_struct.h
-new file mode 100644
-index 0000000..d955192
---- /dev/null
-+++ b/include/asm-nios2nommu/uart_struct.h
-@@ -0,0 +1,83 @@
-+
-+// UART Registers
-+typedef volatile struct
-+      {
-+      int np_uartrxdata;      // Read-only, 8-bit
-+      int np_uarttxdata;      // Write-only, 8-bit
-+      int np_uartstatus;      // Read-only, 8-bit
-+      int np_uartcontrol;     // Read/Write, 9-bit
-+      int np_uartdivisor;     // Read/Write, 16-bit, optional
-+      int np_uartendofpacket; // Read/Write, end-of-packet character
-+      } np_uart;
-+
-+// UART Status Register Bits
-+enum
-+      {
-+      np_uartstatus_eop_bit  = 12,
-+      np_uartstatus_cts_bit  = 11,
-+      np_uartstatus_dcts_bit = 10,
-+      np_uartstatus_e_bit    = 8,
-+      np_uartstatus_rrdy_bit = 7,
-+      np_uartstatus_trdy_bit = 6,
-+      np_uartstatus_tmt_bit  = 5,
-+      np_uartstatus_toe_bit  = 4,
-+      np_uartstatus_roe_bit  = 3,
-+      np_uartstatus_brk_bit  = 2,
-+      np_uartstatus_fe_bit   = 1,
-+      np_uartstatus_pe_bit   = 0,
-+
-+      np_uartstatus_eop_mask  = (1<<12),
-+      np_uartstatus_cts_mask  = (1<<11),
-+      np_uartstatus_dcts_mask = (1<<10),
-+      np_uartstatus_e_mask    = (1<<8),
-+      np_uartstatus_rrdy_mask = (1<<7),
-+      np_uartstatus_trdy_mask = (1<<6),
-+      np_uartstatus_tmt_mask  = (1<<5),
-+      np_uartstatus_toe_mask  = (1<<4),
-+      np_uartstatus_roe_mask  = (1<<3),
-+      np_uartstatus_brk_mask  = (1<<2),
-+      np_uartstatus_fe_mask   = (1<<1),
-+      np_uartstatus_pe_mask   = (1<<0)
-+      };
-+
-+// UART Control Register Bits
-+enum
-+      {
-+      np_uartcontrol_ieop_bit  = 12,
-+      np_uartcontrol_rts_bit   = 11,
-+      np_uartcontrol_idcts_bit = 10,
-+      np_uartcontrol_tbrk_bit  = 9,
-+      np_uartcontrol_ie_bit    = 8,
-+      np_uartcontrol_irrdy_bit = 7,
-+      np_uartcontrol_itrdy_bit = 6,
-+      np_uartcontrol_itmt_bit  = 5,
-+      np_uartcontrol_itoe_bit  = 4,
-+      np_uartcontrol_iroe_bit  = 3,
-+      np_uartcontrol_ibrk_bit  = 2,
-+      np_uartcontrol_ife_bit   = 1,
-+      np_uartcontrol_ipe_bit   = 0,
-+
-+      np_uartcontrol_ieop_mask  = (1<<12),
-+      np_uartcontrol_rts_mask   = (1<<11),
-+      np_uartcontrol_idcts_mask = (1<<10),
-+      np_uartcontrol_tbrk_mask  = (1<<9),
-+      np_uartcontrol_ie_mask    = (1<<8),
-+      np_uartcontrol_irrdy_mask = (1<<7),
-+      np_uartcontrol_itrdy_mask = (1<<6),
-+      np_uartcontrol_itmt_mask  = (1<<5),
-+      np_uartcontrol_itoe_mask  = (1<<4),
-+      np_uartcontrol_iroe_mask  = (1<<3),
-+      np_uartcontrol_ibrk_mask  = (1<<2),
-+      np_uartcontrol_ife_mask   = (1<<1),
-+      np_uartcontrol_ipe_mask   = (1<<0)
-+      };
-+
-+// UART Routines
-+int nr_uart_rxchar(np_uart *uartBase);        // 0 for default UART
-+void nr_uart_txcr(void);
-+void nr_uart_txchar(int c,np_uart *uartBase); // 0 for default UART
-+void nr_uart_txhex(int x);                     // 16 or 32 bits
-+void nr_uart_txhex16(short x);
-+void nr_uart_txhex32(long x);
-+void nr_uart_txstring(char *s);
-+
-diff --git a/include/asm-nios2nommu/ucontext.h b/include/asm-nios2nommu/ucontext.h
-new file mode 100644
-index 0000000..f2e7ce2
---- /dev/null
-+++ b/include/asm-nios2nommu/ucontext.h
-@@ -0,0 +1,63 @@
-+#ifndef _NIOSKNOMMU_UCONTEXT_H
-+#define _NIOSKNOMMU_UCONTEXT_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/ucontext.h
-+ *
-+ * Derived from M68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+typedef int greg_t;
-+#define NGREG 32
-+typedef greg_t gregset_t[NGREG];
-+
-+#ifdef CONFIG_FPU
-+typedef struct fpregset {
-+      int f_pcr;
-+      int f_psr;
-+      int f_fpiaddr;
-+      int f_fpregs[8][3];
-+} fpregset_t;
-+#endif
-+
-+struct mcontext {
-+      int version;
-+      int status_extension;
-+      gregset_t gregs;
-+#ifdef CONFIG_FPU
-+      fpregset_t fpregs;
-+#endif
-+};
-+
-+#define MCONTEXT_VERSION 2
-+
-+struct ucontext {
-+      unsigned long     uc_flags;
-+      struct ucontext  *uc_link;
-+      stack_t           uc_stack;
-+      struct mcontext   uc_mcontext;
-+#ifdef CONFIG_FPU
-+      unsigned long     uc_filler[80];
-+#endif
-+      sigset_t          uc_sigmask;   /* mask last for extensibility */
-+};
-+
-+#endif
-diff --git a/include/asm-nios2nommu/unaligned.h b/include/asm-nios2nommu/unaligned.h
-new file mode 100644
-index 0000000..4876185
---- /dev/null
-+++ b/include/asm-nios2nommu/unaligned.h
-@@ -0,0 +1,6 @@
-+#ifndef __NIOS2_UNALIGNED_H
-+#define __NIOS2_UNALIGNED_H
-+
-+#include <asm-generic/unaligned.h>
-+
-+#endif                                /* __NIOS2_UNALIGNED_H */
-diff --git a/include/asm-nios2nommu/unistd.h b/include/asm-nios2nommu/unistd.h
-new file mode 100644
-index 0000000..43cd165
---- /dev/null
-+++ b/include/asm-nios2nommu/unistd.h
-@@ -0,0 +1,395 @@
-+#ifndef _ASM_NIOS_UNISTD_H_
-+#define _ASM_NIOS_UNISTD_H_
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/unistd.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * //vic - kernel_thread moved to process.c
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/traps.h>
-+
-+/* TRAP isr expects the trap# (syscall=#TRAP_ID_SYSCALL) in r2,
-+ *  the syscall # in r3, and arguments in r4, r5, ...
-+ * Return argument expected in r2.
-+ */
-+
-+#define __NR_restart_syscall      0
-+#define __NR_exit               1
-+#define __NR_fork               2
-+#define __NR_read               3
-+#define __NR_write              4
-+#define __NR_open               5
-+#define __NR_close              6
-+#define __NR_waitpid            7
-+#define __NR_creat              8
-+#define __NR_link               9
-+#define __NR_unlink            10
-+#define __NR_execve            11
-+#define __NR_chdir             12
-+#define __NR_time              13
-+#define __NR_mknod             14
-+#define __NR_chmod             15
-+#define __NR_chown             16
-+#define __NR_break             17
-+#define __NR_oldstat           18
-+#define __NR_lseek             19
-+#define __NR_getpid            20
-+#define __NR_mount             21
-+#define __NR_umount            22
-+#define __NR_setuid            23
-+#define __NR_getuid            24
-+#define __NR_stime             25
-+#define __NR_ptrace            26
-+#define __NR_alarm             27
-+#define __NR_oldfstat          28
-+#define __NR_pause             29
-+#define __NR_utime             30
-+#define __NR_stty              31
-+#define __NR_gtty              32
-+#define __NR_access            33
-+#define __NR_nice              34
-+#define __NR_ftime             35
-+#define __NR_sync              36
-+#define __NR_kill              37
-+#define __NR_rename            38
-+#define __NR_mkdir             39
-+#define __NR_rmdir             40
-+#define __NR_dup               41
-+#define __NR_pipe              42
-+#define __NR_times             43
-+#define __NR_prof              44
-+#define __NR_brk               45
-+#define __NR_setgid            46
-+#define __NR_getgid            47
-+#define __NR_signal            48
-+#define __NR_geteuid           49
-+#define __NR_getegid           50
-+#define __NR_acct              51
-+#define __NR_umount2           52     //vic #define __NR_phys          52
-+#define __NR_lock              53
-+#define __NR_ioctl             54
-+#define __NR_fcntl             55
-+#define __NR_mpx               56
-+#define __NR_setpgid           57
-+#define __NR_ulimit            58
-+#define __NR_oldolduname       59
-+#define __NR_umask             60
-+#define __NR_chroot            61
-+#define __NR_ustat             62
-+#define __NR_dup2              63
-+#define __NR_getppid           64
-+#define __NR_getpgrp           65
-+#define __NR_setsid            66
-+#define __NR_sigaction                 67
-+#define __NR_sgetmask          68
-+#define __NR_ssetmask          69
-+#define __NR_setreuid          70
-+#define __NR_setregid          71
-+#define __NR_sigsuspend                72
-+#define __NR_sigpending                73
-+#define __NR_sethostname       74
-+#define __NR_setrlimit                 75
-+#define __NR_getrlimit                 76
-+#define __NR_getrusage                 77
-+#define __NR_gettimeofday      78
-+#define __NR_settimeofday      79
-+#define __NR_getgroups                 80
-+#define __NR_setgroups                 81
-+#define __NR_select            82
-+#define __NR_symlink           83
-+#define __NR_oldlstat          84
-+#define __NR_readlink          85
-+#define __NR_uselib            86
-+#define __NR_swapon            87
-+#define __NR_reboot            88
-+#define __NR_readdir           89
-+#define __NR_mmap              90
-+#define __NR_munmap            91
-+#define __NR_truncate          92
-+#define __NR_ftruncate                 93
-+#define __NR_fchmod            94
-+#define __NR_fchown            95
-+#define __NR_getpriority       96
-+#define __NR_setpriority       97
-+#define __NR_profil            98
-+#define __NR_statfs            99
-+#define __NR_fstatfs          100
-+#define __NR_ioperm           101
-+#define __NR_socketcall               102
-+#define __NR_syslog           103
-+#define __NR_setitimer                104
-+#define __NR_getitimer                105
-+#define __NR_stat             106
-+#define __NR_lstat            107
-+#define __NR_fstat            108
-+#define __NR_olduname         109
-+#define __NR_iopl             /* 110 */ not supported
-+#define __NR_vhangup          111
-+#define __NR_idle             /* 112 */ Obsolete
-+#define __NR_vm86             /* 113 */ not supported
-+#define __NR_wait4            114
-+#define __NR_swapoff          115
-+#define __NR_sysinfo          116
-+#define __NR_ipc              117
-+#define __NR_fsync            118
-+#define __NR_sigreturn                119
-+#define __NR_clone            120
-+#define __NR_setdomainname    121
-+#define __NR_uname            122
-+#define __NR_cacheflush               123
-+#define __NR_adjtimex         124
-+#define __NR_mprotect         125
-+#define __NR_sigprocmask      126
-+#define __NR_create_module    127
-+#define __NR_init_module      128
-+#define __NR_delete_module    129
-+#define __NR_get_kernel_syms  130
-+#define __NR_quotactl         131
-+#define __NR_getpgid          132
-+#define __NR_fchdir           133
-+#define __NR_bdflush          134
-+#define __NR_sysfs            135
-+#define __NR_personality      136
-+#define __NR_afs_syscall      137 /* Syscall for Andrew File System */
-+#define __NR_setfsuid         138
-+#define __NR_setfsgid         139
-+#define __NR__llseek          140
-+#define __NR_getdents         141
-+#define __NR__newselect               142
-+#define __NR_flock            143
-+                              /* 144 __NR_msync obsolete */
-+#define __NR_readv            145
-+#define __NR_writev           146
-+#define __NR_getsid           147
-+#define __NR_fdatasync                148
-+#define __NR__sysctl          149
-+#define __NR_mlock            150
-+#define __NR_munlock          151
-+#define __NR_mlockall         152
-+#define __NR_munlockall               153
-+#define __NR_sched_setparam           154
-+#define __NR_sched_getparam           155
-+#define __NR_sched_setscheduler               156
-+#define __NR_sched_getscheduler               157
-+#define __NR_sched_yield              158
-+#define __NR_sched_get_priority_max   159
-+#define __NR_sched_get_priority_min   160
-+#define __NR_sched_rr_get_interval    161
-+#define __NR_nanosleep                162
-+#define __NR_mremap           163
-+#define __NR_setresuid                164
-+#define __NR_getresuid                165
-+#define __NR_getpagesize      166
-+#define __NR_query_module     167
-+#define __NR_poll             168
-+#define __NR_nfsservctl               169
-+#define __NR_setresgid                170
-+#define __NR_getresgid                171
-+#define __NR_prctl            172
-+#define __NR_rt_sigreturn     173
-+#define __NR_rt_sigaction     174
-+#define __NR_rt_sigprocmask   175
-+#define __NR_rt_sigpending    176
-+#define __NR_rt_sigtimedwait  177
-+#define __NR_rt_sigqueueinfo  178
-+#define __NR_rt_sigsuspend    179
-+#define __NR_pread            180
-+#define __NR_pwrite           181
-+#define __NR_lchown           182
-+#define __NR_getcwd           183
-+#define __NR_capget           184
-+#define __NR_capset           185
-+#define __NR_sigaltstack      186
-+#define __NR_sendfile         187
-+#define __NR_getpmsg          188     /* some people actually want streams */
-+#define __NR_putpmsg          189     /* some people actually want streams */
-+#define __NR_vfork            190
-+#define __NR_ugetrlimit               191
-+#define __NR_mmap2            192
-+#define __NR_truncate64               193
-+#define __NR_ftruncate64      194
-+#define __NR_stat64           195
-+#define __NR_lstat64          196
-+#define __NR_fstat64          197
-+#define __NR_chown32          198
-+#define __NR_getuid32         199
-+#define __NR_getgid32         200
-+#define __NR_geteuid32                201
-+#define __NR_getegid32                202
-+#define __NR_setreuid32               203
-+#define __NR_setregid32               204
-+#define __NR_getgroups32      205
-+#define __NR_setgroups32      206
-+#define __NR_fchown32         207
-+#define __NR_setresuid32      208
-+#define __NR_getresuid32      209
-+#define __NR_setresgid32      210
-+#define __NR_getresgid32      211
-+#define __NR_lchown32         212
-+#define __NR_setuid32         213
-+#define __NR_setgid32         214
-+#define __NR_setfsuid32               215
-+#define __NR_setfsgid32               216
-+#define __NR_pivot_root               217
-+/* 218 unused */
-+/* 219 unused */
-+#define __NR_getdents64               220
-+#define __NR_gettid           221
-+#define __NR_tkill            222
-+#define __NR_setxattr         223
-+#define __NR_lsetxattr                224
-+#define __NR_fsetxattr                225
-+#define __NR_getxattr         226
-+#define __NR_lgetxattr                227
-+#define __NR_fgetxattr                228
-+#define __NR_listxattr                229
-+#define __NR_llistxattr               230
-+#define __NR_flistxattr               231
-+#define __NR_removexattr      232
-+#define __NR_lremovexattr     233
-+#define __NR_fremovexattr     234
-+#define __NR_futex            235
-+#define __NR_sendfile64               236
-+#define __NR_mincore          237
-+#define __NR_madvise          238
-+#define __NR_fcntl64          239
-+#define __NR_readahead                240
-+#define __NR_io_setup         241
-+#define __NR_io_destroy               242
-+#define __NR_io_getevents     243
-+#define __NR_io_submit                244
-+#define __NR_io_cancel                245
-+#define __NR_fadvise64                246
-+#define __NR_exit_group               247
-+#define __NR_lookup_dcookie   248
-+#define __NR_epoll_create     249
-+#define __NR_epoll_ctl                250
-+#define __NR_epoll_wait               251
-+#define __NR_remap_file_pages 252
-+#define __NR_set_tid_address  253
-+#define __NR_timer_create     254
-+#define __NR_timer_settime    255
-+#define __NR_timer_gettime    256
-+#define __NR_timer_getoverrun 257
-+#define __NR_timer_delete     258
-+#define __NR_clock_settime    259
-+#define __NR_clock_gettime    260
-+#define __NR_clock_getres     261
-+#define __NR_clock_nanosleep  262
-+#define __NR_statfs64         263
-+#define __NR_fstatfs64                264
-+#define __NR_tgkill           265
-+#define __NR_utimes           266
-+#define __NR_fadvise64_64     267
-+#define __NR_mbind            268
-+#define __NR_get_mempolicy    269
-+#define __NR_set_mempolicy    270
-+#define __NR_mq_open          271
-+#define __NR_mq_unlink                272
-+#define __NR_mq_timedsend     273
-+#define __NR_mq_timedreceive  274
-+#define __NR_mq_notify                275
-+#define __NR_mq_getsetattr    276
-+#define __NR_waitid           277
-+#define __NR_sys_setaltroot   278
-+#define __NR_add_key          279
-+#define __NR_request_key      280
-+#define __NR_keyctl           281
-+#define __NR_ioprio_set               282
-+#define __NR_ioprio_get               283
-+#define __NR_inotify_init     284
-+#define __NR_inotify_add_watch        285
-+#define __NR_inotify_rm_watch 286
-+#define __NR_migrate_pages    287
-+#define __NR_openat           288
-+#define __NR_mkdirat          289
-+#define __NR_mknodat          290
-+#define __NR_fchownat         291
-+#define __NR_futimesat                292
-+#define __NR_fstatat64                293
-+#define __NR_unlinkat         294
-+#define __NR_renameat         295
-+#define __NR_linkat           296
-+#define __NR_symlinkat                297
-+#define __NR_readlinkat               298
-+#define __NR_fchmodat         299
-+#define __NR_faccessat                300
-+#define __NR_pselect6         301
-+#define __NR_ppoll            302
-+#define __NR_unshare          303
-+#define __NR_set_robust_list  304
-+#define __NR_get_robust_list  305
-+#define __NR_splice           306
-+#define __NR_sync_file_range  307
-+#define __NR_tee              308
-+#define __NR_vmsplice         309
-+#define __NR_move_pages               310
-+#define __NR_sched_setaffinity        311
-+#define __NR_sched_getaffinity        312
-+#define __NR_kexec_load               313
-+#define __NR_getcpu           314
-+#define __NR_epoll_pwait      315
-+#define __NR_utimensat                316
-+#define __NR_signalfd         317
-+#define __NR_timerfd          318
-+#define __NR_eventfd          319
-+#define __NR_pread64          320
-+#define __NR_pwrite64         321
-+
-+#ifdef __KERNEL__
-+#define NR_syscalls           322
-+
-+#define __ARCH_WANT_IPC_PARSE_VERSION
-+#define __ARCH_WANT_OLD_READDIR
-+#define __ARCH_WANT_OLD_STAT
-+#define __ARCH_WANT_STAT64
-+#define __ARCH_WANT_SYS_ALARM
-+#define __ARCH_WANT_SYS_GETHOSTNAME
-+#define __ARCH_WANT_SYS_PAUSE
-+#define __ARCH_WANT_SYS_SGETMASK
-+#define __ARCH_WANT_SYS_SIGNAL
-+#define __ARCH_WANT_SYS_TIME
-+#define __ARCH_WANT_SYS_UTIME
-+#define __ARCH_WANT_SYS_WAITPID
-+#define __ARCH_WANT_SYS_SOCKETCALL
-+#define __ARCH_WANT_SYS_FADVISE64
-+#define __ARCH_WANT_SYS_GETPGRP
-+#define __ARCH_WANT_SYS_LLSEEK
-+#define __ARCH_WANT_SYS_NICE
-+#define __ARCH_WANT_SYS_OLD_GETRLIMIT
-+#define __ARCH_WANT_SYS_OLDUMOUNT
-+#define __ARCH_WANT_SYS_SIGPENDING
-+#define __ARCH_WANT_SYS_SIGPROCMASK
-+#define __ARCH_WANT_SYS_RT_SIGACTION
-+
-+/*
-+ * "Conditional" syscalls
-+ *
-+ * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
-+ * but it doesn't work on all toolchains, so we just do it by hand
-+ */
-+#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall");
-+
-+#endif        /* __KERNEL__ */
-+
-+#endif /* _ASM_NIOS_UNISTD_H_ */
-diff --git a/include/asm-nios2nommu/user.h b/include/asm-nios2nommu/user.h
-new file mode 100644
-index 0000000..3cdc2ba
---- /dev/null
-+++ b/include/asm-nios2nommu/user.h
-@@ -0,0 +1,112 @@
-+#ifndef _NIOS2NOMMU_USER_H
-+#define _NIOS2NOMMU_USER_H
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/user.h
-+ *
-+ * Derived from M68knommu
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+#include <asm/page.h>
-+
-+/* Core file format: The core file is written in such a way that gdb
-+   can understand it and provide useful information to the user (under
-+   linux we use the 'trad-core' bfd).  There are quite a number of
-+   obstacles to being able to view the contents of the floating point
-+   registers, and until these are solved you will not be able to view the
-+   contents of them.  Actually, you can read in the core file and look at
-+   the contents of the user struct to find out what the floating point
-+   registers contain.
-+   The actual file contents are as follows:
-+   UPAGE: 1 page consisting of a user struct that tells gdb what is present
-+   in the file.  Directly after this is a copy of the task_struct, which
-+   is currently not used by gdb, but it may come in useful at some point.
-+   All of the registers are stored as part of the upage.  The upage should
-+   always be only one page.
-+   DATA: The data area is stored.  We use current->end_text to
-+   current->brk to pick up all of the user variables, plus any memory
-+   that may have been malloced.  No attempt is made to determine if a page
-+   is demand-zero or if a page is totally unused, we just cover the entire
-+   range.  All of the addresses are rounded in such a way that an integral
-+   number of pages is written.
-+   STACK: We need the stack information in order to get a meaningful
-+   backtrace.  We need to write the data from (esp) to
-+   current->start_stack, so we round each of these off in order to be able
-+   to write an integer number of pages.
-+   The minimum core file size is 3 pages, or 12288 bytes.
-+*/
-+
-+struct user_m68kfp_struct {
-+      unsigned long  fpregs[8*3];     /* fp0-fp7 registers */
-+      unsigned long  fpcntl[3];       /* fp control regs */
-+};
-+
-+/* This is needs more work, probably should look like gdb useage */
-+struct user_regs_struct {
-+      long r1,r2,r3,r4,r5,r6,r7,r8;
-+      long r9,r10,r11,r12,r13,r14,r15;
-+      long r16,r17,r18,r19,r20,r21,r22,r23;
-+      long gp;
-+      long sp;
-+      long ra;
-+      long fp;
-+      long orig_r2;
-+      long estatus;
-+      long status_extension;
-+      long ea;
-+};
-+
-+      
-+/* When the kernel dumps core, it starts by dumping the user struct -
-+   this will be used by gdb to figure out where the data and stack segments
-+   are within the file, and what virtual addresses to use. */
-+struct user{
-+/* We start with the registers, to mimic the way that "memory" is returned
-+   from the ptrace(3,...) function.  */
-+  struct user_regs_struct regs;       /* Where the registers are actually stored */
-+/* ptrace does not yet supply these.  Someday.... */
-+  int u_fpvalid;              /* True if math co-processor being used. */
-+                                /* for this mess. Not yet used. */
-+  struct user_m68kfp_struct m68kfp; /* Math Co-processor registers. */
-+/* The rest of this junk is to help gdb figure out what goes where */
-+  unsigned long int u_tsize;  /* Text segment size (pages). */
-+  unsigned long int u_dsize;  /* Data segment size (pages). */
-+  unsigned long int u_ssize;  /* Stack segment size (pages). */
-+  unsigned long start_code;     /* Starting virtual address of text. */
-+  unsigned long start_stack;  /* Starting virtual address of stack area.
-+                                 This is actually the bottom of the stack,
-+                                 the top of the stack is always found in the
-+                                 esp register.  */
-+  long int signal;                    /* Signal that caused the core dump. */
-+  int reserved;                       /* No longer used */
-+  struct user_regs_struct *u_ar0;
-+                              /* Used by gdb to help find the values for */
-+                              /* the registers. */
-+  struct user_m68kfp_struct* u_fpstate;       /* Math Co-processor pointer. */
-+  unsigned long magic;                /* To uniquely identify a core file */
-+  char u_comm[32];            /* User command that was responsible */
-+};
-+#define NBPG PAGE_SIZE
-+#define UPAGES 1
-+#define HOST_TEXT_START_ADDR (u.start_code)
-+#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
-+
-+#endif
-diff --git a/include/asm-nios2nommu/virtconvert.h b/include/asm-nios2nommu/virtconvert.h
-new file mode 100644
-index 0000000..89bf899
---- /dev/null
-+++ b/include/asm-nios2nommu/virtconvert.h
-@@ -0,0 +1,46 @@
-+#ifndef __NIOS_VIRT_CONVERT__
-+#define __NIOS_VIRT_CONVERT__
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * include/asm-nios2nommu/virtconvert.h
-+ *
-+ * Derived from various works, Alpha, ix86, M68K, Sparc, ...et al
-+ *
-+ * Copyright (C) 2004   Microtronix Datacom Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * Jan/20/2004                dgt         NiosII
-+ *
-+ ---------------------------------------------------------------------*/
-+
-+
-+/*
-+ * Macros used for converting between virtual and physical mappings.
-+ */
-+
-+#ifdef __KERNEL__
-+
-+#include <asm/setup.h>
-+#include <asm/page.h>
-+
-+#define mm_ptov(vaddr)                ((void *) (vaddr))
-+#define mm_vtop(vaddr)                ((unsigned long) (vaddr))
-+#define phys_to_virt(vaddr)   ((void *) (vaddr))
-+#define virt_to_phys(vaddr)   ((unsigned long) (vaddr))
-+
-+#define virt_to_bus virt_to_phys
-+#define bus_to_virt phys_to_virt
-+
-+#endif /*__KERNEL__ */
-+#endif /*__NIOS_VIRT_CONVERT__*/
diff --git a/toolchain/kernel-headers/linux-2.6.25.19-export-linux-aout.patch b/toolchain/kernel-headers/linux-2.6.25.19-export-linux-aout.patch
deleted file mode 100644 (file)
index 972fa76..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-[PATCH] export linux/a.out.h
-
-Export linux/a.out.h like we do for asm/a.out.h. One minor complication is
-that the interesting stuff is protected by an CONFIG_ARCH_SUPPORTS_AOUT ifdef,
-so make sure this gets defined for unifdef.
-
-Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
----
- include/linux/Kbuild |    2 ++
- 1 file changed, 2 insertions(+)
-
-Index: linux-2.6.25.6/include/linux/Kbuild
-===================================================================
---- linux-2.6.25.6.orig/include/linux/Kbuild
-+++ linux-2.6.25.6/include/linux/Kbuild
-@@ -159,6 +159,8 @@
- header-y += videotext.h
- header-y += x25.h
-+UNIFDEF += -DCONFIG_ARCH_SUPPORTS_AOUT
-+unifdef-y += a.out.h
- unifdef-y += acct.h
- unifdef-y += adb.h
- unifdef-y += adfs_fs.h