blob: 6e558fd66c437c989f603b690753f520f2753da1 [file] [log] [blame]
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__*/