OSDN Git Service

Merge branch 'master' into h8300
authorYoshinori Sato <ysato@users.sourceforge.jp>
Sun, 14 Dec 2014 08:45:53 +0000 (17:45 +0900)
committerYoshinori Sato <ysato@users.sourceforge.jp>
Sun, 14 Dec 2014 08:45:53 +0000 (17:45 +0900)
Conflicts:
arch/h8300/Kconfig
arch/h8300/Makefile
arch/h8300/kernel/vmlinux.lds.S
drivers/tty/serial/sh-sci.c
sound/soc/codecs/wm8994.c

176 files changed:
arch/h8300/Kconfig
arch/h8300/Kconfig.cpu [new file with mode: 0644]
arch/h8300/Kconfig.debug [new file with mode: 0644]
arch/h8300/Kconfig.ide [new file with mode: 0644]
arch/h8300/Makefile
arch/h8300/README [new file with mode: 0644]
arch/h8300/boards/Makefile [new file with mode: 0644]
arch/h8300/boards/ae3069/Makefile [new file with mode: 0644]
arch/h8300/boards/ae3069/crt0_ram.S [new file with mode: 0644]
arch/h8300/boards/edosk2674/Makefile [new file with mode: 0644]
arch/h8300/boards/edosk2674/crt0_ram.S [new file with mode: 0644]
arch/h8300/boards/edosk2674/crt0_rom.S [new file with mode: 0644]
arch/h8300/boards/h8300h_sim/Makefile [new file with mode: 0644]
arch/h8300/boards/h8300h_sim/crt0_ram.S [new file with mode: 0644]
arch/h8300/boards/h8300h_sim/crt0_rom.S [new file with mode: 0644]
arch/h8300/boards/h8300h_sim/target.S [new file with mode: 0644]
arch/h8300/boards/h8max/Makefile [new file with mode: 0644]
arch/h8300/boards/h8max/crt0_ram.S [new file with mode: 0644]
arch/h8300/boards/h8s_sim/Makefile [new file with mode: 0644]
arch/h8300/boards/h8s_sim/target.S [new file with mode: 0644]
arch/h8300/boot/Makefile [new file with mode: 0644]
arch/h8300/boot/compressed/Makefile [new file with mode: 0644]
arch/h8300/boot/compressed/head.S [new file with mode: 0644]
arch/h8300/boot/compressed/misc.c [new file with mode: 0644]
arch/h8300/boot/compressed/vmlinux.lds [new file with mode: 0644]
arch/h8300/boot/compressed/vmlinux.scr [new file with mode: 0644]
arch/h8300/defconfig [new file with mode: 0644]
arch/h8300/include/asm/Kbuild [new file with mode: 0644]
arch/h8300/include/asm/asm-offsets.h [new file with mode: 0644]
arch/h8300/include/asm/atomic.h [new file with mode: 0644]
arch/h8300/include/asm/barrier.h [new file with mode: 0644]
arch/h8300/include/asm/bitops.h [new file with mode: 0644]
arch/h8300/include/asm/bootparams.h [new file with mode: 0644]
arch/h8300/include/asm/bug.h [new file with mode: 0644]
arch/h8300/include/asm/bugs.h [new file with mode: 0644]
arch/h8300/include/asm/cache.h [new file with mode: 0644]
arch/h8300/include/asm/cacheflush.h [new file with mode: 0644]
arch/h8300/include/asm/checksum.h [new file with mode: 0644]
arch/h8300/include/asm/cmpxchg.h [new file with mode: 0644]
arch/h8300/include/asm/cputime.h [new file with mode: 0644]
arch/h8300/include/asm/current.h [new file with mode: 0644]
arch/h8300/include/asm/delay.h [new file with mode: 0644]
arch/h8300/include/asm/device.h [new file with mode: 0644]
arch/h8300/include/asm/div64.h [new file with mode: 0644]
arch/h8300/include/asm/dma.h [new file with mode: 0644]
arch/h8300/include/asm/elf.h [new file with mode: 0644]
arch/h8300/include/asm/emergency-restart.h [new file with mode: 0644]
arch/h8300/include/asm/flat.h [new file with mode: 0644]
arch/h8300/include/asm/ftrace.h [new file with mode: 0644]
arch/h8300/include/asm/futex.h [new file with mode: 0644]
arch/h8300/include/asm/gpio-internal.h [new file with mode: 0644]
arch/h8300/include/asm/hardirq.h [new file with mode: 0644]
arch/h8300/include/asm/hw_irq.h [new file with mode: 0644]
arch/h8300/include/asm/io.h [new file with mode: 0644]
arch/h8300/include/asm/irq.h [new file with mode: 0644]
arch/h8300/include/asm/irq_regs.h [new file with mode: 0644]
arch/h8300/include/asm/irqflags.h [new file with mode: 0644]
arch/h8300/include/asm/kdebug.h [new file with mode: 0644]
arch/h8300/include/asm/kmap_types.h [new file with mode: 0644]
arch/h8300/include/asm/local.h [new file with mode: 0644]
arch/h8300/include/asm/local64.h [new file with mode: 0644]
arch/h8300/include/asm/mc146818rtc.h [new file with mode: 0644]
arch/h8300/include/asm/mmu.h [new file with mode: 0644]
arch/h8300/include/asm/mmu_context.h [new file with mode: 0644]
arch/h8300/include/asm/mutex.h [new file with mode: 0644]
arch/h8300/include/asm/page.h [new file with mode: 0644]
arch/h8300/include/asm/page_offset.h [new file with mode: 0644]
arch/h8300/include/asm/param.h [new file with mode: 0644]
arch/h8300/include/asm/pci.h [new file with mode: 0644]
arch/h8300/include/asm/percpu.h [new file with mode: 0644]
arch/h8300/include/asm/pgalloc.h [new file with mode: 0644]
arch/h8300/include/asm/pgtable.h [new file with mode: 0644]
arch/h8300/include/asm/processor.h [new file with mode: 0644]
arch/h8300/include/asm/ptrace.h [new file with mode: 0644]
arch/h8300/include/asm/regs267x.h [new file with mode: 0644]
arch/h8300/include/asm/regs306x.h [new file with mode: 0644]
arch/h8300/include/asm/scatterlist.h [new file with mode: 0644]
arch/h8300/include/asm/sections.h [new file with mode: 0644]
arch/h8300/include/asm/segment.h [new file with mode: 0644]
arch/h8300/include/asm/sh_bios.h [new file with mode: 0644]
arch/h8300/include/asm/shmparam.h [new file with mode: 0644]
arch/h8300/include/asm/signal.h [new file with mode: 0644]
arch/h8300/include/asm/smp.h [new file with mode: 0644]
arch/h8300/include/asm/spinlock.h [new file with mode: 0644]
arch/h8300/include/asm/string.h [new file with mode: 0644]
arch/h8300/include/asm/switch_to.h [new file with mode: 0644]
arch/h8300/include/asm/target_time.h [new file with mode: 0644]
arch/h8300/include/asm/termios.h [new file with mode: 0644]
arch/h8300/include/asm/thread_info.h [new file with mode: 0644]
arch/h8300/include/asm/timer.h [new file with mode: 0644]
arch/h8300/include/asm/timer16.h [new file with mode: 0644]
arch/h8300/include/asm/timex.h [new file with mode: 0644]
arch/h8300/include/asm/tlb.h [new file with mode: 0644]
arch/h8300/include/asm/tlbflush.h [new file with mode: 0644]
arch/h8300/include/asm/topology.h [new file with mode: 0644]
arch/h8300/include/asm/traps.h [new file with mode: 0644]
arch/h8300/include/asm/types.h [new file with mode: 0644]
arch/h8300/include/asm/uaccess.h [new file with mode: 0644]
arch/h8300/include/asm/ucontext.h [new file with mode: 0644]
arch/h8300/include/asm/unaligned.h [new file with mode: 0644]
arch/h8300/include/asm/unistd.h [new file with mode: 0644]
arch/h8300/include/asm/user.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/Kbuild [new file with mode: 0644]
arch/h8300/include/uapi/asm/auxvec.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/bitsperlong.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/byteorder.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/errno.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/fcntl.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/ioctl.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/ioctls.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/ipcbuf.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/kvm_para.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/mman.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/msgbuf.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/param.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/poll.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/posix_types.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/ptrace.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/resource.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/sembuf.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/setup.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/shmbuf.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/sigcontext.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/siginfo.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/signal.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/socket.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/sockios.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/stat.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/statfs.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/swab.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/termbits.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/termios.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/types.h [new file with mode: 0644]
arch/h8300/include/uapi/asm/unistd.h [new file with mode: 0644]
arch/h8300/kernel/Makefile [new file with mode: 0644]
arch/h8300/kernel/asm-offsets.c [new file with mode: 0644]
arch/h8300/kernel/cpu/h83069/Makefile [new file with mode: 0644]
arch/h8300/kernel/cpu/h83069/setup.c [new file with mode: 0644]
arch/h8300/kernel/cpu/h8s2678/Makefile [new file with mode: 0644]
arch/h8300/kernel/cpu/h8s2678/setup.c [new file with mode: 0644]
arch/h8300/kernel/entry.S [new file with mode: 0644]
arch/h8300/kernel/gpio.c [new file with mode: 0644]
arch/h8300/kernel/h8300_ksyms.c [new file with mode: 0644]
arch/h8300/kernel/head_ram.S [new file with mode: 0644]
arch/h8300/kernel/head_rom.S [new file with mode: 0644]
arch/h8300/kernel/irq.c [new file with mode: 0644]
arch/h8300/kernel/irq_h.c [new file with mode: 0644]
arch/h8300/kernel/irq_s.c [new file with mode: 0644]
arch/h8300/kernel/module.c [new file with mode: 0644]
arch/h8300/kernel/process.c [new file with mode: 0644]
arch/h8300/kernel/ptrace_h.c [new file with mode: 0644]
arch/h8300/kernel/ptrace_s.c [new file with mode: 0644]
arch/h8300/kernel/setup.c [new file with mode: 0644]
arch/h8300/kernel/signal.c [new file with mode: 0644]
arch/h8300/kernel/sim-console.c [new file with mode: 0644]
arch/h8300/kernel/sys_h8300.c [new file with mode: 0644]
arch/h8300/kernel/syscalls.S [new file with mode: 0644]
arch/h8300/kernel/time.c [new file with mode: 0644]
arch/h8300/kernel/timer/Makefile [new file with mode: 0644]
arch/h8300/kernel/timer/timer16.c [new file with mode: 0644]
arch/h8300/kernel/timer/timer8.c [new file with mode: 0644]
arch/h8300/kernel/timer/tpu.c [new file with mode: 0644]
arch/h8300/kernel/traps.c [new file with mode: 0644]
arch/h8300/kernel/vmlinux.lds.S
arch/h8300/lib/Makefile [new file with mode: 0644]
arch/h8300/lib/abs.S [new file with mode: 0644]
arch/h8300/lib/ashrdi3.c [new file with mode: 0644]
arch/h8300/lib/checksum.c [new file with mode: 0644]
arch/h8300/lib/memcpy.S [new file with mode: 0644]
arch/h8300/lib/memset.S [new file with mode: 0644]
arch/h8300/lib/romfs.S [new file with mode: 0644]
arch/h8300/mm/Makefile [new file with mode: 0644]
arch/h8300/mm/fault.c [new file with mode: 0644]
arch/h8300/mm/init.c [new file with mode: 0644]
arch/h8300/mm/kmap.c [new file with mode: 0644]
arch/h8300/mm/memory.c [new file with mode: 0644]

index 336e76d..ab78325 100644 (file)
@@ -2,18 +2,22 @@ config H8300
        bool
        default y
        select HAVE_IDE
-       select HAVE_GENERIC_HARDIRQS
        select GENERIC_ATOMIC64
        select HAVE_UID16
        select VIRT_TO_BUS
        select ARCH_WANT_IPC_PARSE_VERSION
        select GENERIC_IRQ_SHOW
+       select ARCH_WANT_FRAME_POINTER
        select GENERIC_CPU_DEVICES
        select MODULES_USE_ELF_RELA
+<<<<<<< HEAD
+       select GENERIC_CLOCKEVENTS
+=======
        select OLD_SIGSUSPEND3
        select OLD_SIGACTION
        select HAVE_UNDERSCORE_SYMBOL_PREFIX
        select FRAME_POINTER
+>>>>>>> master
 
 config MMU
        bool
@@ -81,6 +85,10 @@ config HZ
        int
        default 100
 
+config NR_CPUS
+        int
+       default 1
+
 source "init/Kconfig"
 
 source "kernel/Kconfig.freezer"
diff --git a/arch/h8300/Kconfig.cpu b/arch/h8300/Kconfig.cpu
new file mode 100644 (file)
index 0000000..d61ee8d
--- /dev/null
@@ -0,0 +1,136 @@
+menu "Processor type and features"
+
+choice
+       prompt "H8/300 platform"
+
+config H8300_AE3068
+       bool "AE-3068/69"
+       select H83069
+       select RAMKERNEL
+       help
+         AKI-H8/3068F / AKI-H8/3069F Flashmicom LAN Board Support
+         More Information. (Japanese Only)
+         <http://akizukidenshi.com/catalog/default.aspx>
+         AE-3068/69 Evaluation Board Support
+         More Information.
+         <http://www.microtronique.com/ae3069lan.htm>
+
+config H8300_H8MAX
+       bool "H8MAX"
+       select H83069
+       select RAMKERNEL
+       help
+         H8MAX Evaluation Board Support
+         More Information. (Japanese Only)
+         <http://strawberry-linux.com/h8/index.html>
+
+config H8300_KANEBEBE
+       bool "KaneBebe"
+       select H83069
+       select RAMKERNEL
+       help
+         KaneBebe Evalition Board Support
+
+config H8300H_SIM
+       bool "H8/300H GDB Simulator"
+       select H83069
+       select ROMKERNEL
+       help
+         GDB Simulator Support
+         More Information.
+         <http://sourceware.org/sid/>
+
+config H8S_EDOSK2674
+       bool "EDOSK-2674"
+       select H8S2678
+       select RAMKERNEL
+       help
+         Renesas EDOSK-2674 Evaluation Board Support
+         More Information.
+         <http://www.azpower.com/H8-uClinux/index.html>
+         <http://www.renesas.eu/products/tools/introductory_evaluation_tools/evaluation_development_os_kits/edosk2674r/edosk2674r_software_tools_root.jsp>
+
+config H8S_SIM
+       bool "H8S GDB Simulator"
+       select H8S2678
+       select ROMKERNEL
+       help
+         GDB Simulator Support
+         More Information.
+         <http://sourceware.org/sid/>
+
+endchoice
+
+choice
+       prompt "CPU Selection"
+
+config H83069
+       bool "H8/3065,3066,3067,3068,3069"
+       select CPU_H8300H
+
+config H8S2678
+       bool "H8S/2670,2673,2674R,2675,2676"
+       select CPU_H8S
+       select 8TMR_CED
+
+endchoice
+
+config CPU_CLOCK
+       int "CPU Clock Frequency"
+       depends on ROMKERNEL
+       default "20000000" if H8300H_AKI3068NET || H8300H_SIM
+       default "25000000" if H8300H_H8MAX || H8300H_KANEBEBE
+       default "33333333" if H8S_EDOSK2674 || H8S_SIM
+       help
+         CPU Clock Frequency
+
+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.
+endchoice
+
+config CPU_H8300H
+       bool
+       depends on H83069
+       default y
+
+config CPU_H8S
+       bool
+       depends on H8S2678
+       default y
+
+config ROMSIZE
+       hex "ROM size"
+       depends on ROMKERNEL
+       default 0x200000
+
+config RAMBASE
+       hex "RAM base address"
+       default 0x400000
+
+config RAMSIZE
+       hex "RAM size"
+       depends on ROMKERNEL
+       default 0x200000 if H8300_AE3068 || H8300_H8MAX || H8300H_SIM
+       default 0x400000 if H8300_KANEBEBE
+       default 0x800000 if H8S_EDOSK2674 || H8S_SIM
+
+config 8TMR_CED
+        bool
+
+source "kernel/Kconfig.preempt"
+
+source "mm/Kconfig"
+
+endmenu
diff --git a/arch/h8300/Kconfig.debug b/arch/h8300/Kconfig.debug
new file mode 100644 (file)
index 0000000..ff2e592
--- /dev/null
@@ -0,0 +1,65 @@
+menu "Kernel hacking"
+
+source "lib/Kconfig.debug"
+
+config FULLDEBUG
+       bool "Full Symbolic/Source Debugging support"
+       help
+         Enable debugging symbols on kernel build.
+
+config HIGHPROFILE
+       bool "Use fast second timer for profiling"
+       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 EARLY_PRINTK
+        bool "Early printk support"
+
+config SYSCALL_PRINT
+       bool "SystemCall trace print"
+       help
+         output history of systemcall
+
+config GDB_DEBUG
+       bool "Use gdb stub"
+       depends on (!H8300H_SIM && !H8S_SIM)
+       help
+         gdb stub exception support
+
+config SH_STANDARD_BIOS
+       bool "Use gdb protocol serial console"
+       depends on (!H8300H_SIM && !H8S_SIM)
+       help
+         serial console output using GDB protocol.
+         Require eCos/RedBoot
+
+config DEFAULT_CMDLINE
+       bool "Use builtin commandline"
+       default n
+       help
+         builtin kernel commandline enabled.
+
+config KERNEL_COMMAND
+       string "Buildin command string"
+       depends on DEFAULT_CMDLINE
+       help
+         builtin kernel commandline strings.
+
+config BLKDEV_RESERVE
+       bool "BLKDEV Reserved Memory"
+       default n
+       help
+         Reserved BLKDEV area.
+
+config BLKDEV_RESERVE_ADDRESS
+       hex 'start address'
+       depends on BLKDEV_RESERVE
+       help
+         BLKDEV start address.
+
+endmenu
diff --git a/arch/h8300/Kconfig.ide b/arch/h8300/Kconfig.ide
new file mode 100644 (file)
index 0000000..a38a630
--- /dev/null
@@ -0,0 +1,44 @@
+# uClinux H8/300 Target Board Selection Menu (IDE)
+
+if (H8300H_AKI3068NET)
+menu "IDE Extra configuration"
+
+config H8300_IDE_BASE
+       hex "IDE register base address"
+       depends on IDE
+       default 0
+       help
+         IDE registers base address
+
+config H8300_IDE_ALT
+       hex "IDE register alternate address"
+       depends on IDE
+       default 0
+       help
+         IDE alternate registers address
+
+config H8300_IDE_IRQ
+       int "IDE IRQ no"
+       depends on IDE
+       default 0
+       help
+         IDE use IRQ no
+endmenu
+endif
+
+if (H8300H_H8MAX)
+config H8300_IDE_BASE
+       hex
+       depends on IDE
+       default 0x200000
+
+config H8300_IDE_ALT
+       hex
+       depends on IDE
+       default 0x60000c
+
+config H8300_IDE_IRQ
+       int
+       depends on IDE
+       default 5
+endif
index bfd68aa..aaeae96 100644 (file)
@@ -8,39 +8,25 @@
 # (C) Copyright 2002,2003 Yoshinori Sato <ysato@users.sourceforge.jp>
 #
 
-platform-$(CONFIG_CPU_H8300H)  := h8300h
-platform-$(CONFIG_CPU_H8S)     := h8s
-PLATFORM := $(platform-y)
-
-board-$(CONFIG_H8300H_GENERIC)         := generic
-board-$(CONFIG_H8300H_AKI3068NET)      := aki3068net
-board-$(CONFIG_H8300H_H8MAX)           := h8max
-board-$(CONFIG_H8300H_SIM)             := generic
-board-$(CONFIG_H8S_GENERIC)            := generic
-board-$(CONFIG_H8S_EDOSK2674)          := edosk2674
-board-$(CONFIG_H8S_SIM)                        := generic
-BOARD := $(board-y)
-
-model-$(CONFIG_RAMKERNEL)      := ram
-model-$(CONFIG_ROMKERNEL)      := rom
-MODEL := $(model-y)
-
 cflags-$(CONFIG_CPU_H8300H)    := -mh
-ldflags-$(CONFIG_CPU_H8300H)   := -mh8300helf
+ldflags-$(CONFIG_CPU_H8300H)   := -mh8300helf_linux
 cflags-$(CONFIG_CPU_H8S)       := -ms
-ldflags-$(CONFIG_CPU_H8S)      := -mh8300self
+ldflags-$(CONFIG_CPU_H8S)      := -mh8300self_linux
 
 KBUILD_CFLAGS += $(cflags-y)
 KBUILD_CFLAGS += -mint32 -fno-builtin
 KBUILD_CFLAGS += -g
 KBUILD_CFLAGS += -D__linux__
 KBUILD_CFLAGS += -DUTS_SYSNAME=\"uClinux\"
-KBUILD_AFLAGS += -DPLATFORM=$(PLATFORM) -DMODEL=$(MODEL) $(cflags-y)
+KBUILD_AFLAGS += $(cflags-y)
 LDFLAGS += $(ldflags-y)
 
-CROSS_COMPILE = h8300-elf-
+CROSS_COMPILE := h8300-unknown-linux-
 LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
 
+<<<<<<< HEAD
+core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/ arch/$(ARCH)/boards/
+=======
 head-y := arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/crt0_$(MODEL).o
 
 core-y += arch/$(ARCH)/kernel/ \
@@ -48,13 +34,12 @@ core-y      += arch/$(ARCH)/kernel/ \
 ifdef PLATFORM
 core-y += arch/$(ARCH)/platform/$(PLATFORM)/ 
 endif
+>>>>>>> master
 
 libs-y += arch/$(ARCH)/lib/ $(LIBGCC)
 
 boot := arch/h8300/boot
 
-export MODEL PLATFORM BOARD
-
 archmrproper:
 
 archclean:
diff --git a/arch/h8300/README b/arch/h8300/README
new file mode 100644 (file)
index 0000000..efa805f
--- /dev/null
@@ -0,0 +1,38 @@
+linux-2.6 for H8/300 README
+Yoshinori Sato <ysato@users.sourceforge.jp>
+
+* Supported CPU
+H8/300H and H8S
+
+* Supported Target
+1.simulator of GDB
+  require patches.
+
+2.AE 3068/AE 3069
+  more information 
+  MICROTRONIQUE <http://www.microtronique.com/>
+  Akizuki Denshi Tsusho Ltd. <http://akizukidenshi.com/> (Japanese Only)
+
+3.H8MAX 
+  see http://ip-sol.jp/h8max/ (Japanese Only)
+
+4.EDOSK2674
+  see http://www.eu.renesas.com/products/mpumcu/tool/edk/support/edosk2674.html
+      http://www.uclinux.org/pub/uClinux/ports/h8/HITACHI-EDOSK2674-HOWTO
+      http://www.azpower.com/H8-uClinux/
+
+* Toolchain Version
+gcc-3.1 or higher and patch
+see arch/h8300/tools_patch/README
+binutils-2.12 or higher
+gdb-5.2 or higher
+The environment that can compile a h8300-elf binary is necessary.
+
+* Userland Develop environment
+used h8300-elf toolchains.
+see http://www.uclinux.org/pub/uClinux/ports/h8/
+
+* A few words of thanks
+Porting to H8/300 serieses is support of Information-technology Promotion Agency, Japan.
+I thank support.
+and All developer/user.
diff --git a/arch/h8300/boards/Makefile b/arch/h8300/boards/Makefile
new file mode 100644 (file)
index 0000000..d271ea4
--- /dev/null
@@ -0,0 +1,6 @@
+obj-$(CONFIG_AE3069) = ae3069/
+obj-$(CONFIG_EDOSK2674) = edosk2674/
+obj-$(CONFIG_H8MAX) = h8max/
+obj-$(CONFIG_H8300H_SIM) = h8300h_sim/
+obj-$(CONFIG_H8S_SIM) = h8s_sim/
+obj-$(CONFIG_KANEBEBE) = kanebebe/
diff --git a/arch/h8300/boards/ae3069/Makefile b/arch/h8300/boards/ae3069/Makefile
new file mode 100644 (file)
index 0000000..b7ff780
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the linux kernel.
+#
+
+extra-y := crt0_ram.o
diff --git a/arch/h8300/boards/ae3069/crt0_ram.S b/arch/h8300/boards/ae3069/crt0_ram.S
new file mode 100644 (file)
index 0000000..b2ad0f2
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target Archtecture:        AE-3068 (aka. aki3068net)
+ *  Memory Layout     :        RAM
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+       
+#if !defined(CONFIG_BLKDEV_RESERVE)
+#if defined(CONFIG_GDB_DEBUG)
+#define RAMEND (__ramend - 0xc000)
+#else
+#define RAMEND __ramend
+#endif
+#else
+#define RAMEND CONFIG_BLKDEV_RESERVE_ADDRESS
+#endif
+       
+       .global __start
+       .global _command_line
+       .global __platform_gpio_table
+       .global __target_name
+       
+       .h8300h
+
+       .section .text
+       .file   "crt0_ram.S"
+
+       /* CPU Reset entry */
+__start:
+       mov.l   #RAMEND,sp
+       ldc     #0x80,ccr
+
+       /* Peripheral Setup */
+       
+#if defined(CONFIG_MTD_UCLINUX)
+       /* move romfs image */
+       jsr     @__move_romfs   
+#endif
+       
+       /* .bss clear */
+       mov.l   #__sbss,er5
+       mov.l   #__ebss,er4
+       sub.l   er5,er4
+       shlr    er4
+       shlr    er4
+       sub.l   er0,er0
+1:     
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+
+       /* copy kernel commandline */
+       mov.l   #COMMAND_START,er5
+       mov.l   #_command_line,er6
+       mov.w   #512,r4
+       eepmov.w
+
+       /* uClinux kernel start */
+       ldc     #0x90,ccr       /* running kernel */
+       mov.l   #_init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @_start_kernel
+_exit:
+
+       jmp     _exit
+
+       rts
+
+       /* I/O port assign information */
+__platform_gpio_table: 
+       mov.l   #gpio_table,er0
+       rts
+
+gpio_table:
+       ;; P1DDR
+       .byte   0xff,0xff
+       ;; P2DDR
+       .byte   0xff,0xff
+       ;; P3DDR
+       .byte   0xff,0x00
+       ;; P4DDR
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x01,0x01
+       ;; P6DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0x0c,0x0c
+       ;; P9DDR
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0x00,0x00
+       ;; PBDDR
+       .byte   0x30,0x30
+
+__target_name: 
+       .asciz  "AE-3068"
+       
+       .section .bootvec,"ax"
+       jmp     @__start
diff --git a/arch/h8300/boards/edosk2674/Makefile b/arch/h8300/boards/edosk2674/Makefile
new file mode 100644 (file)
index 0000000..8e34972
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the linux kernel.
+#
+
+extra-y := crt0_$(MODEL).o
diff --git a/arch/h8300/boards/edosk2674/crt0_ram.S b/arch/h8300/boards/edosk2674/crt0_ram.S
new file mode 100644 (file)
index 0000000..5ed191b
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ *  linux/arch/h8300/platform/h8s/edosk2674/crt0_ram.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target Archtecture:        EDOSK-2674
+ *  Memory Layout     :        RAM
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+#include <asm/regs267x.h>
+                       
+#if !defined(CONFIG_BLKDEV_RESERVE)
+#if defined(CONFIG_GDB_DEBUG)
+#define RAMEND (__ramend - 0xc000)
+#else
+#define RAMEND __ramend
+#endif
+#else
+#define RAMEND CONFIG_BLKDEV_RESERVE_ADDRESS
+#endif
+       
+       .global __start
+       .global __command_line
+       .global __platform_gpio_table
+       .global __target_name
+       
+       .h8300s
+
+       .section .text
+       .file   "crt0_ram.S"
+
+       /* CPU Reset entry */
+__start:
+       mov.l   #RAMEND,sp
+       ldc     #0x80,ccr
+       ldc     #0x00,exr
+
+       /* Peripheral Setup */
+       bclr    #4,@INTCR:8     /* interrupt mode 2 */
+       bset    #5,@INTCR:8
+       bclr    #0,@IER+1:16
+       bset    #1,@ISCRL+1:16  /* IRQ0 Positive Edge */
+       bclr    #0,@ISCRL+1:16
+
+#if defined(CONFIG_MTD_UCLINUX)
+       /* move romfs image */
+       jsr     @__move_romfs   
+#endif
+       
+       /* .bss clear */
+       mov.l   #__sbss,er5
+       mov.l   er5,er6
+       mov.l   #__ebss,er4
+       sub.l   er5,er4
+       shlr    #2,er4
+       sub.l   er0,er0
+1:     
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+
+       /* copy kernel commandline */
+       mov.l   #COMMAND_START,er5
+       mov.l   #_command_line,er6
+       mov.w   #512,r4
+       eepmov.w
+
+       /* uClinux kernel start */
+       ldc     #0x90,ccr       /* running kernel */
+       mov.l   #_init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @_start_kernel
+_exit:
+
+       jmp     _exit
+
+       rts
+
+       /* I/O port assign information */
+__platform_gpio_table: 
+       mov.l   #gpio_table,er0
+       rts
+
+gpio_table:
+       ;; P1DDR
+       ;;      used,ddr
+       .byte   0x00,0x00
+       ;; P2DDR
+       .byte   0x00,0x00
+       ;; P3DDR
+       .byte   0x3f,0x3a
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x00,0x00
+       ;; P6DDR
+       .byte   0x00,0x00
+       ;; P7DDR
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0xff,0xff
+       ;; PBDDR
+       .byte   0xff,0x00
+       ;; PCDDR
+       .byte   0xff,0x00
+       ;; PDDDR
+       .byte   0xff,0x00
+       ;; PEDDR
+       .byte   0xff,0x00
+       ;; PFDDR
+       .byte   0xff,0xff
+       ;; PGDDR
+       .byte   0x0f,0x0f
+       ;; PHDDR
+       .byte   0x0f,0x0f
+
+__target_name: 
+       .asciz  "EDOSK-2674"
+       
+       .section .bootvec,"ax"
+       jmp     @__start
diff --git a/arch/h8300/boards/edosk2674/crt0_rom.S b/arch/h8300/boards/edosk2674/crt0_rom.S
new file mode 100644 (file)
index 0000000..f0a6a2c
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ *  linux/arch/h8300/platform/h8s/edosk2674/crt0_rom.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target Archtecture:        EDOSK-2674
+ *  Memory Layout     :        ROM
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+#include <asm/regs267x.h>
+               
+       .global __start
+       .global __command_line
+       .global __platform_gpio_table
+       .global __target_name
+       
+       .h8300s
+       .section .text
+       .file   "crt0_rom.S"
+
+       /* CPU Reset entry */
+__start:
+       mov.l   #__ramend,sp
+       ldc     #0x80,ccr
+       ldc     #0,exr
+       
+       /* Peripheral Setup */
+;BSC/GPIO setup
+       mov.l   #init_regs,er0
+       mov.w   #0xffff,e2
+1:
+       mov.w   @er0+,r2
+       beq     2f
+       mov.w   @er0+,r1
+       mov.b   r1l,@er2
+       bra     1b
+
+2:
+;SDRAM setup
+#define SDRAM_SMR 0x400040
+
+       mov.b   #0,r0l
+       mov.b   r0l,@DRACCR:16
+       mov.w   #0x188,r0
+       mov.w   r0,@REFCR:16
+       mov.w   #0x85b4,r0
+       mov.w   r0,@DRAMCR:16
+       mov.b   #0,r1l
+       mov.b   r1l,@SDRAM_SMR
+       mov.w   #0x84b4,r0
+       mov.w   r0,@DRAMCR:16
+;special thanks to Arizona Cooperative Power
+       
+       /* copy .data */
+       mov.l   #__begin_data,er5
+       mov.l   #__sdata,er6
+       mov.l   #__edata,er4
+       sub.l   er6,er4
+       shlr.l  #2,er4
+1:     
+       mov.l   @er5+,er0
+       mov.l   er0,@er6
+       adds    #4,er6
+       dec.l   #1,er4
+       bne     1b      
+
+       /* .bss clear */
+       mov.l   #__sbss,er5
+       mov.l   #__ebss,er4
+       sub.l   er5,er4
+       shlr.l  #2,er4          
+       sub.l   er0,er0
+1:
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+
+       /* copy kernel commandline */
+       mov.l   #COMMAND_START,er5
+       mov.l   #__command_line,er6
+       mov.w   #512,r4
+       eepmov.w
+
+       /* linux kernel start */
+       ldc     #0x90,ccr       /* running kernel */
+       mov.l   #_init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @_start_kernel
+_exit:
+
+       jmp     _exit
+
+       rts
+
+       /* I/O port assign information */
+__platform_gpio_table: 
+       mov.l   #gpio_table,er0
+       rts
+
+#define INIT_REGS_DATA(REGS,DATA) \
+       .word   ((REGS) & 0xffff),DATA
+
+init_regs:
+INIT_REGS_DATA(ASTCR,0xff)
+INIT_REGS_DATA(RDNCR,0x00)
+INIT_REGS_DATA(ABWCR,0x80)
+INIT_REGS_DATA(WTCRAH,0x27)
+INIT_REGS_DATA(WTCRAL,0x77)
+INIT_REGS_DATA(WTCRBH,0x71)
+INIT_REGS_DATA(WTCRBL,0x22)
+INIT_REGS_DATA(CSACRH,0x80)
+INIT_REGS_DATA(CSACRL,0x80)
+INIT_REGS_DATA(BROMCRH,0xa0)
+INIT_REGS_DATA(BROMCRL,0xa0)
+INIT_REGS_DATA(P3DDR,0x3a)
+INIT_REGS_DATA(P3ODR,0x06)
+INIT_REGS_DATA(PADDR,0xff)
+INIT_REGS_DATA(PFDDR,0xfe)
+INIT_REGS_DATA(PGDDR,0x0f)
+INIT_REGS_DATA(PHDDR,0x0f)
+INIT_REGS_DATA(PFCR0,0xff)
+INIT_REGS_DATA(PFCR2,0x0d)
+INIT_REGS_DATA(ITSR, 0x00)
+INIT_REGS_DATA(ITSR+1,0x3f)
+INIT_REGS_DATA(INTCR,0x20)
+               
+       .word   0
+
+gpio_table:
+       ;; P1DDR
+       .byte   0x00,0x00
+       ;; P2DDR
+       .byte   0x00,0x00
+       ;; P3DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x00,0x00
+       ;; P6DDR
+       .byte   0x00,0x00
+       ;; P7DDR
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0x00,0x00
+       ;; PBDDR
+       .byte   0x00,0x00
+       ;; PCDDR
+       .byte   0x00,0x00
+       ;; PDDDR
+       .byte   0x00,0x00
+       ;; PEDDR
+       .byte   0x00,0x00
+       ;; PFDDR
+       .byte   0x00,0x00
+       ;; PGDDR
+       .byte   0x00,0x00
+       ;; PHDDR
+       .byte   0x00,0x00
+
+       .section .rodata
+__target_name: 
+       .asciz  "EDOSK-2674"
+       
+       /* interrupt vector */
+       .section .vectors,"ax"
+       .long   __start
+       .long   __start
+vector =       2
+       .rept   126
+       .long   _interrupt_redirect_table+vector*4
+vector =       vector + 1
+       .endr
diff --git a/arch/h8300/boards/h8300h_sim/Makefile b/arch/h8300/boards/h8300h_sim/Makefile
new file mode 100644 (file)
index 0000000..580b733
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the linux kernel.
+#
+
+obj-y :=  target.o
diff --git a/arch/h8300/boards/h8300h_sim/crt0_ram.S b/arch/h8300/boards/h8300h_sim/crt0_ram.S
new file mode 100644 (file)
index 0000000..5ab7d9c
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/generic/crt0_ram.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target Archtecture:        AE-3068 (aka. aki3068net)
+ *  Memory Layout     :        RAM
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+       
+#if !defined(CONFIG_BLKDEV_RESERVE)
+#if defined(CONFIG_GDB_DEBUG)
+#define RAMEND (__ramend - 0xc000)
+#else
+#define RAMEND __ramend
+#endif
+#else
+#define RAMEND CONFIG_BLKDEV_RESERVE_ADDRESS
+#endif
+       
+       .global __start
+       .global _command_line
+       .global __platform_gpio_table
+       .global __target_name
+       
+       .h8300h
+
+       .section .text
+       .file   "crt0_ram.S"
+
+       /* CPU Reset entry */
+__start:
+       mov.l   #RAMEND,sp
+       ldc     #0x80,ccr
+
+       /* Peripheral Setup */
+       
+#if defined(CONFIG_BLK_DEV_BLKMEM)
+       /* move romfs image */
+       jsr     @__move_romfs   
+#endif
+       
+       /* .bss clear */
+       mov.l   #__sbss,er5
+       mov.l   #__ebss,er4
+       sub.l   er5,er4
+       shlr    er4
+       shlr    er4
+       sub.l   er0,er0
+1:     
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+
+       /* copy kernel commandline */
+       mov.l   #COMMAND_START,er5
+       mov.l   #_command_line,er6
+       mov.w   #512,r4
+       eepmov.w
+
+       /* uClinux kernel start */
+       ldc     #0x90,ccr       /* running kernel */
+       mov.l   #_init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @_start_kernel
+_exit:
+
+       jmp     _exit
+
+       rts
+
+       /* I/O port assign information */
+__platform_gpio_table: 
+       mov.l   #gpio_table,er0
+       rts
+
+gpio_table:
+       ;; P1DDR
+       .byte   0x00,0x00
+       ;; P2DDR
+       .byte   0x00,0x00
+       ;; P3DDR
+       .byte   0x00,0x00
+       ;; P4DDR
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x00,0x00
+       ;; P6DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0x00,0x00
+       ;; P9DDR
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0x00,0x00
+       ;; PBDDR
+       .byte   0x00,0x00
+
+__target_name: 
+       .asciz  "generic"
diff --git a/arch/h8300/boards/h8300h_sim/crt0_rom.S b/arch/h8300/boards/h8300h_sim/crt0_rom.S
new file mode 100644 (file)
index 0000000..8fdff69
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/generic/crt0_rom.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target Archtecture:        generic
+ *  Memory Layout     :        ROM
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+#include <asm/regs306x.h>
+       
+       .global _start
+       .global _command_line
+       .global _platform_gpio_table
+       .global _target_name
+       
+       .h8300h
+       .section .head.text,"ax"
+       .file   "crt0_rom.S"
+
+       /* CPU Reset entry */
+_start:
+       mov.l   #_ramend,sp
+       ldc     #0xc0,ccr
+       mov.l   #SYSCR,er0
+       bclr    #3,@er0
+       
+       /* Peripheral Setup */
+       
+#if !defined(CONFIG_H8300H_SIM)
+       /* .bss clear */
+       mov.l   #__sbss,er5
+       mov.l   #__ebss,er4
+       sub.l   er5,er4
+       shlr    er4
+       shlr    er4
+       sub.l   er0,er0
+1:     
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+
+       /* copy .data */
+       mov.l   #__begin_data,er5
+       mov.l   #__sdata,er6
+       mov.l   #__edata,er4
+       sub.l   er6,er4
+       shlr.l  er4
+       shlr.l  er4
+1:     
+       mov.l   @er5+,er0
+       mov.l   er0,@er6
+       adds    #4,er6
+       dec.l   #1,er4
+       bne     1b      
+
+#else
+       /* get cmdline from gdb */
+       jsr     @0xcc
+       ;; er0 - argc
+       ;; er1 - argv
+       mov.l   #_command_start,er3
+       adds    #4,er1
+       dec.l   #1,er0
+       beq     4f
+1:
+       mov.l   @er1+,er2
+2:     
+       mov.b   @er2+,r4l
+       beq     3f
+       mov.b   r4l,@er3
+       adds    #1,er3
+       bra     2b
+3:
+       mov.b   #' ',r4l
+       mov.b   r4l,@er3
+       adds    #1,er3
+       dec.l   #1,er0
+       bne     1b
+       subs    #1,er3
+       mov.b   #0,r4l
+       mov.b   r4l,@er3
+4:     
+#endif
+
+       /* linux kernel start */
+       ldc     #0xd0,ccr       /* running kernel */
+       mov.l   #_init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @_start_kernel
+_exit:
+
+       jmp     _exit
+
+       rts
+
+       /* I/O port assign information */
+__platform_gpio_table: 
+       mov.l   #gpio_table,er0
+       rts
+
+gpio_table:
+       ;; P1DDR
+       .byte   0x00,0x00
+       ;; P2DDR
+       .byte   0x00,0x00
+       ;; P3DDR
+       .byte   0x00,0x00
+       ;; P4DDR
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x00,0x00
+       ;; P6DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0x00,0x00
+       ;; P9DDR
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0x00,0x00
+       ;; PBDDR
+       .byte   0x00,0x00
+
+       .section .rodata
+__target_name: 
+       .asciz  "generic"
+       
+       /* interrupt vector */
+       .section .vectors,"ax"
+       .long   __start
+vector =       1
+       .rept   64-1
+       .long   _interrupt_redirect_table+vector*4
+vector =       vector + 1
+       .endr
diff --git a/arch/h8300/boards/h8300h_sim/target.S b/arch/h8300/boards/h8300h_sim/target.S
new file mode 100644 (file)
index 0000000..12529ea
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ *  linux/arch/h8300/board/h8300h_sim/target.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target: GDB simulator
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+
+       .global lowlevel_init
+       .global _platform_gpio_table
+       .global _target_name
+       
+       .h8300h
+lowlevel_init:
+       rts
+       
+       /* I/O port assign information */
+_platform_gpio_table:  
+       mov.l   #gpio_table,er0
+       rts
+
+gpio_table:
+       ;; P1DDR
+       .byte   0x00,0x00
+       ;; P2DDR
+       .byte   0x00,0x00
+       ;; P3DDR
+       .byte   0x00,0x00
+       ;; P4DDR
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x00,0x00
+       ;; P6DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0x00,0x00
+       ;; P9DDR
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0x00,0x00
+       ;; PBDDR
+       .byte   0x00,0x00
+
+#if defined(CONFIG_ROMKERNEL)
+       /* interrupt vector */
+       .section .vectors,"ax"
+       .long   _start
+vector =       1
+       .rept   64-1
+       .long   _interrupt_redirect_table+vector*4
+vector =       vector + 1
+       .endr
+#endif
diff --git a/arch/h8300/boards/h8max/Makefile b/arch/h8300/boards/h8max/Makefile
new file mode 100644 (file)
index 0000000..b7ff780
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the linux kernel.
+#
+
+extra-y := crt0_ram.o
diff --git a/arch/h8300/boards/h8max/crt0_ram.S b/arch/h8300/boards/h8max/crt0_ram.S
new file mode 100644 (file)
index 0000000..6a0d4e2
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/h8max/crt0_ram.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target Archtecture:        H8MAX
+ *  Memory Layout     :        RAM
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+       
+#if !defined(CONFIG_BLKDEV_RESERVE)
+#if defined(CONFIG_GDB_DEBUG)
+#define RAMEND (__ramend - 0xc000)
+#else
+#define RAMEND __ramend
+#endif
+#else
+#define RAMEND CONFIG_BLKDEV_RESERVE_ADDRESS
+#endif
+       
+       .global __start
+       .global _command_line
+       .global __platform_gpio_table
+       .global __target_name
+       
+       .h8300h
+
+       .section .text
+       .file   "crt0_ram.S"
+
+       /* CPU Reset entry */
+__start:
+       mov.l   #RAMEND,sp
+       ldc     #0x80,ccr
+
+       /* Peripheral Setup */
+       
+#if defined(CONFIG_MTD_UCLINUX)
+       /* move romfs image */
+       jsr     @__move_romfs   
+#endif
+       
+       /* .bss clear */
+       mov.l   #__sbss,er5
+       mov.l   #__ebss,er4
+       sub.l   er5,er4
+       shlr    er4
+       shlr    er4
+       sub.l   er0,er0
+1:     
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+
+       /* copy kernel commandline */
+       mov.l   #COMMAND_START,er5
+       mov.l   #_command_line,er6
+       mov.w   #512,r4
+       eepmov.w
+
+       /* uClinux kernel start */
+       ldc     #0x90,ccr       /* running kernel */
+       mov.l   #_init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @_start_kernel
+_exit:
+
+       jmp     _exit
+
+       rts
+
+       /* I/O port assign information */
+__platform_gpio_table: 
+       mov.l   #gpio_table,er0
+       rts
+
+gpio_table:
+       ;; P1DDR
+       .byte   0xff,0xff
+       ;; P2DDR
+       .byte   0xff,0xff
+       ;; P3DDR
+       .byte   0x00,0x00
+       ;; P4DDR
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x01,0x01
+       ;; P6DDR
+       .byte   0xf6,0xf6
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0xee,0xee
+       ;; P9DDR
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0x00,0x00
+       ;; PBDDR
+       .byte   0x30,0x30
+
+__target_name: 
+       .asciz  "H8MAX"
+       
+       .section .bootvec,"ax"
+       jmp     @__start
diff --git a/arch/h8300/boards/h8s_sim/Makefile b/arch/h8300/boards/h8s_sim/Makefile
new file mode 100644 (file)
index 0000000..13b49aa
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the linux kernel.
+#
+
+obj-y =  target.o
diff --git a/arch/h8300/boards/h8s_sim/target.S b/arch/h8300/boards/h8s_sim/target.S
new file mode 100644 (file)
index 0000000..9c9e384
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ *  linux/arch/h8300/board/h8300h_sim/target.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup
+ *  Target: GDB simulator
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+
+       .global lowlevel_init
+       .global _platform_gpio_table
+       .global _target_name
+       
+       .h8300s
+lowlevel_init:
+       rts
+       
+       /* I/O port assign information */
+_platform_gpio_table:  
+       mov.l   #gpio_table,er0
+       rts
+
+gpio_table:
+       ;; P1DDR
+       .byte   0x00,0x00
+       ;; P2DDR
+       .byte   0x00,0x00
+       ;; P3DDR
+       .byte   0x00,0x00
+       ;; P4DDR
+       .byte   0x00,0x00
+       ;; P5DDR
+       .byte   0x00,0x00
+       ;; P6DDR
+       .byte   0x00,0x00
+       ;; dummy
+       .byte   0x00,0x00
+       ;; P8DDR
+       .byte   0x00,0x00
+       ;; P9DDR
+       .byte   0x00,0x00
+       ;; PADDR
+       .byte   0x00,0x00
+       ;; PBDDR
+       .byte   0x00,0x00
+       ;; PCDDR
+       .byte   0x00,0x00
+       ;; PDDDR
+       .byte   0x00,0x00
+       ;; PEDDR
+       .byte   0x00,0x00
+       ;; PFDDR
+       .byte   0x00,0x00
+       ;; PGDDR
+       .byte   0x00,0x00
+
+#if defined(CONFIG_ROMKERNEL)
+       /* interrupt vector */
+       .section .vectors,"ax"
+       .long   _start
+       .long   _start
+vector =       2
+       .rept   128-2
+       .long   _interrupt_redirect_table+vector*4
+vector =       vector + 1
+       .endr
+#endif
diff --git a/arch/h8300/boot/Makefile b/arch/h8300/boot/Makefile
new file mode 100644 (file)
index 0000000..0bb62e0
--- /dev/null
@@ -0,0 +1,22 @@
+# arch/h8300/boot/Makefile
+
+targets := vmlinux.srec vmlinux.bin zImage
+subdir- := compressed
+
+OBJCOPYFLAGS_vmlinux.srec := -Osrec
+OBJCOPYFLAGS_vmlinux.bin  := -Obinary
+OBJCOPYFLAGS_zImage := -O binary -R .note -R .comment -R .stab -R .stabstr -S
+
+$(obj)/vmlinux.srec $(obj)/vmlinux.bin:  vmlinux FORCE
+       $(call if_changed,objcopy)
+       @echo '  Kernel: $@ is ready'
+
+$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
+       $(call if_changed,objcopy)
+       @echo 'Kernel: $@ is ready'
+
+$(obj)/compressed/vmlinux: FORCE
+       $(Q)$(MAKE) $(build)=$(obj)/compressed $@
+
+CLEAN_FILES += arch/$(ARCH)/vmlinux.bin arch/$(ARCH)/vmlinux.srec
+
diff --git a/arch/h8300/boot/compressed/Makefile b/arch/h8300/boot/compressed/Makefile
new file mode 100644 (file)
index 0000000..a6c98fe
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# 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
+asflags-y      := -traditional
+
+OBJECTS = $(obj)/head.o $(obj)/misc.o
+
+#
+# IMAGE_OFFSET is the load offset of the compression loader
+# Assign dummy values if these 2 variables are not defined,
+# in order to suppress error message.
+#
+CONFIG_MEMORY_START     ?= 0x00400000
+CONFIG_BOOT_LINK_OFFSET ?= 0x00140000
+IMAGE_OFFSET := $(shell printf "0x%08x" $$(($(CONFIG_MEMORY_START)+$(CONFIG_BOOT_LINK_OFFSET))))
+
+LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -estartup $(obj)/vmlinux.lds
+
+$(obj)/vmlinux: $(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-h8300 -T
+OBJCOPYFLAGS := -O binary
+
+$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
+       $(call if_changed,ld)
diff --git a/arch/h8300/boot/compressed/head.S b/arch/h8300/boot/compressed/head.S
new file mode 100644 (file)
index 0000000..10e9a2d
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ *  linux/arch/h8300/boot/compressed/head.S
+ *
+ *  Copyright (C) 2006 Yoshinori Sato
+ */
+
+       .h8300h
+#include <linux/linkage.h>
+
+#define SRAM_START 0xff4000
+
+       .section        .text..startup
+       .global startup
+startup:
+       mov.l   #SRAM_START+0x8000, sp
+       mov.l   #__sbss, er0
+       mov.l   #__ebss, er1
+       sub.l   er0, er1
+       shlr    er1
+       shlr    er1
+       sub.l   er2, er2
+1:
+       mov.l   er2, @er0
+       adds    #4, er0
+       dec.l   #1, er1
+       bne     1b
+       jsr     @_decompress_kernel
+       jmp     @0x400000
+
+       .align  9
+fake_headers_as_bzImage:
+       .word   0
+       .ascii  "HdrS"          ; header signature
+       .word   0x0202          ; header version number (>= 0x0105)
+                               ; or else old loadlin-1.5 will fail)
+       .word   0               ; default_switch
+       .word   0               ; SETUPSEG
+       .word   0x1000
+       .word   0               ; pointing to kernel version string
+       .byte   0               ; = 0, old one (LILO, Loadlin,
+                               ; 0xTV: T=0 for LILO
+                               ;       V = version
+       .byte   1               ; Load flags bzImage=1
+       .word   0x8000          ; size to move, when setup is not
+       .long   0x100000        ; 0x100000 = default for big kernel
+       .long   0               ; address of loaded ramdisk image
+       .long   0               ; its size in bytes
diff --git a/arch/h8300/boot/compressed/misc.c b/arch/h8300/boot/compressed/misc.c
new file mode 100644 (file)
index 0000000..4a1e3dd
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * arch/h8300/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 h8300 by Yoshinori Sato 2006
+ */
+
+#include <asm/uaccess.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);
+
+extern char input_data[];
+extern int input_len;
+
+static long bytes_out = 0;
+static uch *output_data;
+static unsigned long output_ptr = 0;
+
+static void error(char *m);
+
+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"
+
+#define SCR *((volatile unsigned char *)0xffff8a)
+#define TDR *((volatile unsigned char *)0xffff8b)
+#define SSR *((volatile unsigned char *)0xffff8c)
+
+int puts(const char *s)
+{
+       return 0;
+}
+
+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("\n\n");
+       puts(x);
+       puts("\n\n -- System halted");
+
+       while(1);       /* Halt */
+}
+
+#define STACK_SIZE (4096)
+long user_stack [STACK_SIZE];
+long* stack_start = &user_stack[STACK_SIZE];
+
+void decompress_kernel(void)
+{
+       output_data = 0;
+       output_ptr = (unsigned long)0x400000;
+       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/h8300/boot/compressed/vmlinux.lds b/arch/h8300/boot/compressed/vmlinux.lds
new file mode 100644 (file)
index 0000000..a0a3a0e
--- /dev/null
@@ -0,0 +1,32 @@
+SECTIONS
+{
+        .text :
+        {
+        __stext = . ;
+       __text = .;
+              *(.text..startup)
+              *(.text)
+        __etext = . ;
+        }
+
+       .rodata :
+       {
+               *(.rodata)
+       }
+        .data :
+
+        {
+        __sdata = . ;
+        ___data_start = . ;
+                *(.data.*)
+       }
+        .bss :
+        {
+        . = ALIGN(0x4) ;
+        __sbss = . ;
+                *(.bss*)
+        . = ALIGN(0x4) ;
+        __ebss = . ;
+        __end = . ;
+        }
+}
diff --git a/arch/h8300/boot/compressed/vmlinux.scr b/arch/h8300/boot/compressed/vmlinux.scr
new file mode 100644 (file)
index 0000000..a0f6962
--- /dev/null
@@ -0,0 +1,9 @@
+SECTIONS
+{
+  .data : {
+       _input_len = .;
+       LONG(_input_data_end - _input_data) _input_data = .;
+       *(.data)
+       _input_data_end = .;
+       }
+}
diff --git a/arch/h8300/defconfig b/arch/h8300/defconfig
new file mode 100644 (file)
index 0000000..042425a
--- /dev/null
@@ -0,0 +1,42 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_EXPERT=y
+# CONFIG_UID16 is not set
+# CONFIG_SYSCTL_SYSCALL is not set
+# CONFIG_KALLSYMS is not set
+# CONFIG_HOTPLUG is not set
+# CONFIG_BASE_FULL is not set
+# CONFIG_FUTEX is not set
+# CONFIG_EPOLL is not set
+# CONFIG_SIGNALFD is not set
+# CONFIG_TIMERFD is not set
+# CONFIG_EVENTFD is not set
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SLOB=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_H83007=y
+CONFIG_BINFMT_FLAT=y
+CONFIG_BINFMT_ZFLAT=y
+CONFIG_BINFMT_MISC=y
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_RAM=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_UCLINUX=y
+# CONFIG_BLK_DEV is not set
+# CONFIG_INPUT is not set
+# CONFIG_SERIO is not set
+# CONFIG_HWMON is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_DNOTIFY is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_CRC32 is not set
diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild
new file mode 100644 (file)
index 0000000..8ada3cf
--- /dev/null
@@ -0,0 +1,8 @@
+
+generic-y += clkdev.h
+generic-y += exec.h
+generic-y += linkage.h
+generic-y += mmu.h
+generic-y += module.h
+generic-y += trace_clock.h
+generic-y += xor.h
diff --git a/arch/h8300/include/asm/asm-offsets.h b/arch/h8300/include/asm/asm-offsets.h
new file mode 100644 (file)
index 0000000..d370ee3
--- /dev/null
@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>
diff --git a/arch/h8300/include/asm/atomic.h b/arch/h8300/include/asm/atomic.h
new file mode 100644 (file)
index 0000000..40901e3
--- /dev/null
@@ -0,0 +1,146 @@
+#ifndef __ARCH_H8300_ATOMIC__
+#define __ARCH_H8300_ATOMIC__
+
+#include <linux/types.h>
+#include <asm/cmpxchg.h>
+
+/*
+ * Atomic operations that C can't guarantee us.  Useful for
+ * resource counting etc..
+ */
+
+#define ATOMIC_INIT(i) { (i) }
+
+#define atomic_read(v)         (*(volatile int *)&(v)->counter)
+#define atomic_set(v, i)       (((v)->counter) = i)
+
+#include <linux/kernel.h>
+
+static __inline__ int atomic_add_return(int i, atomic_t *v)
+{
+       unsigned long flags;
+       int ret;
+       local_irq_save(flags);
+       ret = v->counter += i;
+       local_irq_restore(flags);
+       return ret;
+}
+
+#define atomic_add(i, v) atomic_add_return(i, v)
+#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 flags;
+       int ret;
+       local_irq_save(flags);
+       ret = v->counter -= i;
+       local_irq_restore(flags);
+       return ret;
+}
+
+#define atomic_sub(i, v) atomic_sub_return(i, v)
+#define atomic_sub_and_test(i,v) (atomic_sub_return(i, v) == 0)
+
+static __inline__ int atomic_inc_return(atomic_t *v)
+{
+       unsigned long flags;
+       int ret;
+       local_irq_save(flags);
+       v->counter++;
+       ret = v->counter;
+       local_irq_restore(flags);
+       return ret;
+}
+
+#define atomic_inc(v) atomic_inc_return(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)
+
+static __inline__ int atomic_dec_return(atomic_t *v)
+{
+       unsigned long flags;
+       int ret;
+       local_irq_save(flags);
+       --v->counter;
+       ret = v->counter;
+       local_irq_restore(flags);
+       return ret;
+}
+
+#define atomic_dec(v) atomic_dec_return(v)
+
+static __inline__ int atomic_dec_and_test(atomic_t *v)
+{
+       unsigned long flags;
+       int ret;
+       local_irq_save(flags);
+       --v->counter;
+       ret = v->counter;
+       local_irq_restore(flags);
+       return ret == 0;
+}
+
+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;
+}
+
+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;
+}
+
+static __inline__ void atomic_clear_mask(unsigned long mask, unsigned long *v)
+{
+       __asm__ __volatile__("stc ccr,r1l\n\t"
+                            "orc #0x80,ccr\n\t"
+                            "mov.l %0,er0\n\t"
+                            "and.l %1,er0\n\t"
+                            "mov.l er0,%0\n\t"
+                            "ldc r1l,ccr" 
+                             : "=m" (*v) : "g" (~(mask)) :"er0","er1");
+}
+
+static __inline__ void atomic_set_mask(unsigned long mask, unsigned long *v)
+{
+       __asm__ __volatile__("stc ccr,r1l\n\t"
+                            "orc #0x80,ccr\n\t"
+                            "mov.l %0,er0\n\t"
+                            "or.l %1,er0\n\t"
+                            "mov.l er0,%0\n\t"
+                            "ldc r1l,ccr" 
+                             : "=m" (*v) : "g" (mask) :"er0","er1");
+}
+
+/* Atomic operations are already serializing */
+#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()
+
+#endif /* __ARCH_H8300_ATOMIC __ */
diff --git a/arch/h8300/include/asm/barrier.h b/arch/h8300/include/asm/barrier.h
new file mode 100644 (file)
index 0000000..f514fd6
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef _H8300_BARRIER_H
+#define _H8300_BARRIER_H
+
+#define nop()  asm volatile ("nop"::)
+
+/*
+ * Force strict CPU ordering.
+ * Not really required on H8...
+ */
+#define mb()   asm volatile (""   : : :"memory")
+#define rmb()  asm volatile (""   : : :"memory")
+#define wmb()  asm volatile (""   : : :"memory")
+#define set_mb(var, value) do { xchg(&var, value); } while (0)
+#define read_barrier_depends() do { } 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
+
+#endif /* _H8300_BARRIER_H */
diff --git a/arch/h8300/include/asm/bitops.h b/arch/h8300/include/asm/bitops.h
new file mode 100644 (file)
index 0000000..eb34e0c
--- /dev/null
@@ -0,0 +1,211 @@
+#ifndef _H8300_BITOPS_H
+#define _H8300_BITOPS_H
+
+/*
+ * Copyright 1992, Linus Torvalds.
+ * Copyright 2002, Yoshinori Sato
+ */
+
+#include <linux/compiler.h>
+
+#ifdef __KERNEL__
+
+#ifndef _LINUX_BITOPS_H
+#error only <linux/bitops.h> can be included directly
+#endif
+
+/*
+ * Function prototypes to keep gcc -Wall happy
+ */
+
+/*
+ * ffz = Find First Zero in word. Undefined if no zero exists,
+ * so code should check against ~0UL first..
+ */
+static __inline__ unsigned long ffz(unsigned long word)
+{
+       unsigned long result;
+
+       result = -1;
+       __asm__("1:\n\t"
+               "shlr.l %2\n\t"
+               "adds #1,%0\n\t"
+               "bcs 1b"
+               : "=r" (result)
+               : "0"  (result),"r" (word));
+       return result;
+}
+
+#define H8300_GEN_BITOP_CONST(OP,BIT)                      \
+       case BIT:                                           \
+       __asm__(OP " #" #BIT ",@%0"::"r"(b_addr):"memory"); \
+       break;
+
+#define H8300_GEN_BITOP(FNAME,OP)                                    \
+static __inline__ void FNAME(int nr, volatile unsigned long* addr)    \
+{                                                                    \
+       volatile unsigned char *b_addr;                               \
+       b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);    \
+       if (__builtin_constant_p(nr)) {                               \
+               switch(nr & 7) {                                      \
+                       H8300_GEN_BITOP_CONST(OP,0)                   \
+                       H8300_GEN_BITOP_CONST(OP,1)                   \
+                       H8300_GEN_BITOP_CONST(OP,2)                   \
+                       H8300_GEN_BITOP_CONST(OP,3)                   \
+                       H8300_GEN_BITOP_CONST(OP,4)                   \
+                       H8300_GEN_BITOP_CONST(OP,5)                   \
+                       H8300_GEN_BITOP_CONST(OP,6)                   \
+                       H8300_GEN_BITOP_CONST(OP,7)                   \
+               }                                                     \
+       } else {                                                      \
+               __asm__(OP " %w0,@%1"::"r"(nr),"r"(b_addr):"memory"); \
+       }                                                             \
+}
+
+/*
+ * clear_bit() doesn't provide any barrier for the compiler.
+ */
+#define smp_mb__before_clear_bit()     barrier()
+#define smp_mb__after_clear_bit()      barrier()
+
+H8300_GEN_BITOP(set_bit          ,"bset")
+H8300_GEN_BITOP(clear_bit ,"bclr")
+H8300_GEN_BITOP(change_bit,"bnot")
+#define __set_bit(nr,addr)    set_bit((nr),(addr))
+#define __clear_bit(nr,addr)  clear_bit((nr),(addr))
+#define __change_bit(nr,addr) change_bit((nr),(addr))
+
+#undef H8300_GEN_BITOP
+#undef H8300_GEN_BITOP_CONST
+
+static __inline__ int test_bit(int nr, const unsigned long* addr)
+{
+       return (*((volatile unsigned char *)addr + 
+               ((nr >> 3) ^ 3)) & (1UL << (nr & 7))) != 0;
+}
+
+#define __test_bit(nr, addr) test_bit(nr, addr)
+
+#define H8300_GEN_TEST_BITOP_CONST_INT(OP,BIT)                      \
+       case BIT:                                                    \
+       __asm__("stc ccr,%w1\n\t"                                    \
+               "orc #0x80,ccr\n\t"                                  \
+               "bld #" #BIT ",@%4\n\t"                              \
+               OP " #" #BIT ",@%4\n\t"                              \
+               "rotxl.l %0\n\t"                                     \
+               "ldc %w1,ccr"                                        \
+               : "=r"(retval),"=&r"(ccrsave),"=m"(*b_addr)          \
+               : "0" (retval),"r" (b_addr)                          \
+               : "memory");                                         \
+        break;
+
+#define H8300_GEN_TEST_BITOP_CONST(OP,BIT)                          \
+       case BIT:                                                    \
+       __asm__("bld #" #BIT ",@%3\n\t"                              \
+               OP " #" #BIT ",@%3\n\t"                              \
+               "rotxl.l %0\n\t"                                     \
+               : "=r"(retval),"=m"(*b_addr)                         \
+               : "0" (retval),"r" (b_addr)                          \
+               : "memory");                                         \
+        break;
+
+#define H8300_GEN_TEST_BITOP(FNNAME,OP)                                     \
+static __inline__ int FNNAME(int nr, volatile void * addr)          \
+{                                                                   \
+       int retval = 0;                                              \
+       char ccrsave;                                                \
+       volatile unsigned char *b_addr;                              \
+       b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);   \
+       if (__builtin_constant_p(nr)) {                              \
+               switch(nr & 7) {                                     \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,0)         \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,1)         \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,2)         \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,3)         \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,4)         \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,5)         \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,6)         \
+                       H8300_GEN_TEST_BITOP_CONST_INT(OP,7)         \
+               }                                                    \
+       } else {                                                     \
+               __asm__("stc ccr,%w1\n\t"                            \
+                       "orc #0x80,ccr\n\t"                          \
+                       "btst %w5,@%4\n\t"                           \
+                       OP " %w5,@%4\n\t"                            \
+                       "beq 1f\n\t"                                 \
+                       "inc.l #1,%0\n"                              \
+                       "1:\n\t"                                     \
+                       "ldc %w1,ccr"                                \
+                       : "=r"(retval),"=&r"(ccrsave),"=m"(*b_addr)  \
+                       : "0" (retval),"r" (b_addr),"r"(nr)          \
+                       : "memory");                                 \
+       }                                                            \
+       return retval;                                               \
+}                                                                   \
+                                                                    \
+static __inline__ int __ ## FNNAME(int nr, volatile void * addr)     \
+{                                                                   \
+       int retval = 0;                                              \
+       volatile unsigned char *b_addr;                              \
+       b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);   \
+       if (__builtin_constant_p(nr)) {                              \
+               switch(nr & 7) {                                     \
+                       H8300_GEN_TEST_BITOP_CONST(OP,0)             \
+                       H8300_GEN_TEST_BITOP_CONST(OP,1)             \
+                       H8300_GEN_TEST_BITOP_CONST(OP,2)             \
+                       H8300_GEN_TEST_BITOP_CONST(OP,3)             \
+                       H8300_GEN_TEST_BITOP_CONST(OP,4)             \
+                       H8300_GEN_TEST_BITOP_CONST(OP,5)             \
+                       H8300_GEN_TEST_BITOP_CONST(OP,6)             \
+                       H8300_GEN_TEST_BITOP_CONST(OP,7)             \
+               }                                                    \
+       } else {                                                     \
+               __asm__("btst %w4,@%3\n\t"                           \
+                       OP " %w4,@%3\n\t"                            \
+                       "beq 1f\n\t"                                 \
+                       "inc.l #1,%0\n"                              \
+                       "1:"                                         \
+                       : "=r"(retval),"=m"(*b_addr)                 \
+                       : "0" (retval),"r" (b_addr),"r"(nr)          \
+                       : "memory");                                 \
+       }                                                            \
+       return retval;                                               \
+}
+
+H8300_GEN_TEST_BITOP(test_and_set_bit,  "bset")
+H8300_GEN_TEST_BITOP(test_and_clear_bit, "bclr")
+H8300_GEN_TEST_BITOP(test_and_change_bit,"bnot")
+#undef H8300_GEN_TEST_BITOP_CONST
+#undef H8300_GEN_TEST_BITOP_CONST_INT
+#undef H8300_GEN_TEST_BITOP
+
+#include <asm-generic/bitops/ffs.h>
+
+static __inline__ unsigned long __ffs(unsigned long word)
+{
+       unsigned long result;
+
+       result = -1;
+       __asm__("1:\n\t"
+               "shlr.l %2\n\t"
+               "adds #1,%0\n\t"
+               "bcc 1b"
+               : "=r" (result)
+               : "0"(result),"r"(word));
+       return result;
+}
+
+#include <asm-generic/bitops/find.h>
+#include <asm-generic/bitops/sched.h>
+#include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/lock.h>
+#include <asm-generic/bitops/le.h>
+#include <asm-generic/bitops/ext2-atomic.h>
+
+#endif /* __KERNEL__ */
+
+#include <asm-generic/bitops/fls.h>
+#include <asm-generic/bitops/__fls.h>
+#include <asm-generic/bitops/fls64.h>
+
+#endif /* _H8300_BITOPS_H */
diff --git a/arch/h8300/include/asm/bootparams.h b/arch/h8300/include/asm/bootparams.h
new file mode 100644 (file)
index 0000000..de88812
--- /dev/null
@@ -0,0 +1,8 @@
+struct bootparams {
+       unsigned char gpio_ddr[16];
+       unsigned char gpio_use[16];
+       unsigned int clock_freq;
+       unsigned int ram_end;
+       unsigned char *command_line;
+};
+
diff --git a/arch/h8300/include/asm/bug.h b/arch/h8300/include/asm/bug.h
new file mode 100644 (file)
index 0000000..1e1be81
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef _H8300_BUG_H
+#define _H8300_BUG_H
+
+/* always true */
+#define is_valid_bugaddr(addr) (1)
+
+#include <asm-generic/bug.h>
+
+struct pt_regs;
+extern void die(const char *str, struct pt_regs *fp, unsigned long err);
+
+#endif
diff --git a/arch/h8300/include/asm/bugs.h b/arch/h8300/include/asm/bugs.h
new file mode 100644 (file)
index 0000000..61791e1
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/bugs.h>
diff --git a/arch/h8300/include/asm/cache.h b/arch/h8300/include/asm/cache.h
new file mode 100644 (file)
index 0000000..05887a1
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef __ARCH_H8300_CACHE_H
+#define __ARCH_H8300_CACHE_H
+
+/* bytes per L1 cache line */
+#define        L1_CACHE_SHIFT  2
+#define        L1_CACHE_BYTES  (1 << L1_CACHE_SHIFT)
+
+/* m68k-elf-gcc  2.95.2 doesn't like these */
+
+#define __cacheline_aligned
+#define ____cacheline_aligned
+
+#endif
diff --git a/arch/h8300/include/asm/cacheflush.h b/arch/h8300/include/asm/cacheflush.h
new file mode 100644 (file)
index 0000000..7ce581b
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/cacheflush.h>
diff --git a/arch/h8300/include/asm/checksum.h b/arch/h8300/include/asm/checksum.h
new file mode 100644 (file)
index 0000000..98724e1
--- /dev/null
@@ -0,0 +1,102 @@
+#ifndef _H8300_CHECKSUM_H
+#define _H8300_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
+ */
+__wsum csum_partial(const void *buff, int len, __wsum sum);
+
+/*
+ * the same as csum_partial, but copies from src while it
+ * checksums
+ *
+ * here even more important to align src and dst on a 32-bit (or even
+ * better 64-bit) boundary
+ */
+
+__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum 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 __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
+                                               int len, __wsum sum, int *csum_err);
+
+__sum16 ip_fast_csum(const void *iph, unsigned int ihl);
+
+
+/*
+ *     Fold a partial checksum
+ */
+
+static inline __sum16 csum_fold(__wsum sum)
+{
+       __asm__("mov.l %0,er0\n\t"
+               "add.w e0,r0\n\t"
+               "xor.w e0,e0\n\t"
+               "rotxl.w e0\n\t"
+               "add.w e0,r0\n\t"
+               "sub.w e0,e0\n\t"
+               "mov.l er0,%0"
+               : "=r"(sum)
+               : "0"(sum)
+               : "er0");
+       return (__force __sum16)~sum;
+}
+
+
+/*
+ * computes the checksum of the TCP/UDP pseudo-header
+ * returns a 16-bit checksum, already complemented
+ */
+
+static inline __wsum
+csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
+                 unsigned short proto, __wsum sum)
+{
+       __asm__ ("sub.l er0,er0\n\t"
+                "add.l %2,%0\n\t"
+                "addx  #0,r0l\n\t"
+                "add.l %3,%0\n\t"
+                "addx  #0,r0l\n\t"
+                "add.l %4,%0\n\t"
+                "addx  #0,r0l\n\t"
+                "add.l er0,%0\n\t"
+                "bcc   1f\n\t"
+                "inc.l #1,%0\n"
+                "1:"
+                : "=&r" (sum)
+                : "0" (sum), "r" (daddr), "r" (saddr), "r" (len + proto)
+                :"er0");
+       return sum;
+}
+
+static inline __sum16
+csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
+                 unsigned short proto, __wsum sum)
+{
+       return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
+}
+
+/*
+ * this routine is used for miscellaneous IP-like checksums, mainly
+ * in icmp.c
+ */
+
+extern __sum16 ip_compute_csum(const void *buff, int len);
+
+#endif /* _H8300_CHECKSUM_H */
diff --git a/arch/h8300/include/asm/cmpxchg.h b/arch/h8300/include/asm/cmpxchg.h
new file mode 100644 (file)
index 0000000..cdb203e
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef __ARCH_H8300_CMPXCHG__
+#define __ARCH_H8300_CMPXCHG__
+
+#include <linux/irqflags.h>
+
+#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
+
+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__
+    ("mov.b %2,%0\n\t"
+     "mov.b %1,%2"
+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
+    break;
+  case 2:
+    __asm__ __volatile__
+    ("mov.w %2,%0\n\t"
+     "mov.w %1,%2"
+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
+    break;
+  case 4:
+    __asm__ __volatile__
+    ("mov.l %2,%0\n\t"
+     "mov.l %1,%2"
+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
+    break;
+  default:
+    tmp = 0;     
+  }
+  local_irq_restore(flags);
+  return tmp;
+}
+
+#include <asm-generic/cmpxchg-local.h>
+
+/*
+ * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make
+ * them available.
+ */
+#define cmpxchg_local(ptr, o, n)                                              \
+       ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\
+                       (unsigned long)(n), sizeof(*(ptr))))
+#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
+
+#ifndef CONFIG_SMP
+#include <asm-generic/cmpxchg.h>
+#endif
+
+#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
+
+#endif /* __ARCH_H8300_CMPXCHG__ */
diff --git a/arch/h8300/include/asm/cputime.h b/arch/h8300/include/asm/cputime.h
new file mode 100644 (file)
index 0000000..092e187
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __H8300_CPUTIME_H
+#define __H8300_CPUTIME_H
+
+#include <asm-generic/cputime.h>
+
+#endif /* __H8300_CPUTIME_H */
diff --git a/arch/h8300/include/asm/current.h b/arch/h8300/include/asm/current.h
new file mode 100644 (file)
index 0000000..4c51401
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/current.h>
diff --git a/arch/h8300/include/asm/delay.h b/arch/h8300/include/asm/delay.h
new file mode 100644 (file)
index 0000000..743beba
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _H8300_DELAY_H
+#define _H8300_DELAY_H
+
+#include <asm/param.h>
+
+/*
+ * Copyright (C) 2002 Yoshinori Sato <ysato@sourceforge.jp>
+ *
+ * Delay routines, using a pre-computed "loops_per_second" value.
+ */
+
+static inline void __delay(unsigned long loops)
+{
+       __asm__ __volatile__ ("1:\n\t"
+                             "dec.l #1,%0\n\t"
+                             "bne 1b"
+                             :"=r" (loops):"0"(loops));
+}
+
+/*
+ * Use only for very small delays ( < 1 msec).  Should probably use a
+ * lookup table, really, as the multiplications take much too long with
+ * short delays.  This is a "reasonable" implementation, though (and the
+ * first constant multiplications gets optimized away if the delay is
+ * a constant)  
+ */
+
+extern unsigned long loops_per_jiffy;
+
+static inline void udelay(unsigned long usecs)
+{
+       usecs *= 4295;          /* 2**32 / 1000000 */
+       usecs /= (loops_per_jiffy*HZ);
+       if (usecs)
+               __delay(usecs);
+}
+
+#endif /* _H8300_DELAY_H */
diff --git a/arch/h8300/include/asm/device.h b/arch/h8300/include/asm/device.h
new file mode 100644 (file)
index 0000000..d8f9872
--- /dev/null
@@ -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/arch/h8300/include/asm/div64.h b/arch/h8300/include/asm/div64.h
new file mode 100644 (file)
index 0000000..6cd978c
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/div64.h>
diff --git a/arch/h8300/include/asm/dma.h b/arch/h8300/include/asm/dma.h
new file mode 100644 (file)
index 0000000..7ce20d9
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/dma.h>
diff --git a/arch/h8300/include/asm/elf.h b/arch/h8300/include/asm/elf.h
new file mode 100644 (file)
index 0000000..6db7124
--- /dev/null
@@ -0,0 +1,101 @@
+#ifndef __ASMH8300_ELF_H
+#define __ASMH8300_ELF_H
+
+/*
+ * ELF register definitions..
+ */
+
+#include <asm/ptrace.h>
+#include <asm/user.h>
+
+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_H8_300)
+
+/*
+ * These are used to set parameters in the core dumps.
+ */
+#define ELF_CLASS      ELFCLASS32
+#define ELF_DATA       ELFDATA2MSB
+#define ELF_ARCH       EM_H8_300
+#if defined(__H8300H__)
+#define ELF_CORE_EFLAGS 0x810000
+#endif
+#if defined(__H8300S__)
+#define ELF_CORE_EFLAGS 0x820000
+#endif
+
+#define ELF_PLAT_INIT(_r)      _r->er1 = 0
+
+#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
+
+/* 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)
+
+#define R_H8_NONE       0
+#define R_H8_DIR32      1
+#define R_H8_DIR32_28   2
+#define R_H8_DIR32_24   3
+#define R_H8_DIR32_16   4
+#define R_H8_DIR32U     6
+#define R_H8_DIR32U_28  7
+#define R_H8_DIR32U_24  8
+#define R_H8_DIR32U_20  9
+#define R_H8_DIR32U_16 10
+#define R_H8_DIR24     11
+#define R_H8_DIR24_20  12
+#define R_H8_DIR24_16  13
+#define R_H8_DIR24U    14
+#define R_H8_DIR24U_20 15
+#define R_H8_DIR24U_16 16
+#define R_H8_DIR16     17
+#define R_H8_DIR16U    18
+#define R_H8_DIR16S_32 19
+#define R_H8_DIR16S_28 20
+#define R_H8_DIR16S_24 21
+#define R_H8_DIR16S_20 22
+#define R_H8_DIR16S    23
+#define R_H8_DIR8      24
+#define R_H8_DIR8U     25
+#define R_H8_DIR8Z_32  26
+#define R_H8_DIR8Z_28  27
+#define R_H8_DIR8Z_24  28
+#define R_H8_DIR8Z_20  29
+#define R_H8_DIR8Z_16  30
+#define R_H8_PCREL16   31
+#define R_H8_PCREL8    32
+#define R_H8_BPOS      33
+#define R_H8_PCREL32   34
+#define R_H8_GOT32O    35
+#define R_H8_GOT16O    36
+#define R_H8_DIR16A8   59
+#define R_H8_DIR16R8   60
+#define R_H8_DIR24A8   61
+#define R_H8_DIR24R8   62
+#define R_H8_DIR32A16  63
+#define R_H8_ABS32     65
+#define R_H8_ABS32A16 127
+
+#endif
diff --git a/arch/h8300/include/asm/emergency-restart.h b/arch/h8300/include/asm/emergency-restart.h
new file mode 100644 (file)
index 0000000..108d8c4
--- /dev/null
@@ -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/arch/h8300/include/asm/flat.h b/arch/h8300/include/asm/flat.h
new file mode 100644 (file)
index 0000000..bd12b31
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * include/asm-h8300/flat.h -- uClinux flat-format executables
+ */
+
+#ifndef __H8300_FLAT_H__
+#define __H8300_FLAT_H__
+
+#define        flat_argvp_envp_on_stack()              1
+#define        flat_old_ram_flag(flags)                1
+#define        flat_reloc_valid(reloc, size)           ((reloc) <= (size))
+#define        flat_set_persistent(relval, p)          0
+
+/*
+ * on the H8 a couple of the relocations have an instruction in the
+ * top byte.  As there can only be 24bits of address space,  we just
+ * always preserve that 8bits at the top,  when it isn't an instruction
+ * is is 0 (davidm@snapgear.com)
+ */
+
+#define        flat_get_relocate_addr(rel)             (rel)
+#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
+        (get_unaligned(rp) & ((flags & FLAT_FLAG_GOTPIC) ? 0xffffffff: 0x00ffffff))
+#define flat_put_addr_at_rp(rp, addr, rel) \
+       put_unaligned (((*(char *)(rp)) << 24) | ((addr) & 0x00ffffff), rp)
+
+#endif /* __H8300_FLAT_H__ */
diff --git a/arch/h8300/include/asm/ftrace.h b/arch/h8300/include/asm/ftrace.h
new file mode 100644 (file)
index 0000000..40a8c17
--- /dev/null
@@ -0,0 +1 @@
+/* empty */
diff --git a/arch/h8300/include/asm/futex.h b/arch/h8300/include/asm/futex.h
new file mode 100644 (file)
index 0000000..6a332a9
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _ASM_FUTEX_H
+#define _ASM_FUTEX_H
+
+#include <asm-generic/futex.h>
+
+#endif
diff --git a/arch/h8300/include/asm/gpio-internal.h b/arch/h8300/include/asm/gpio-internal.h
new file mode 100644 (file)
index 0000000..a714f0c
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef _H8300_GPIO_H
+#define _H8300_GPIO_H
+
+#define H8300_GPIO_P1 0
+#define H8300_GPIO_P2 1
+#define H8300_GPIO_P3 2
+#define H8300_GPIO_P4 3
+#define H8300_GPIO_P5 4
+#define H8300_GPIO_P6 5
+#define H8300_GPIO_P7 6
+#define H8300_GPIO_P8 7
+#define H8300_GPIO_P9 8
+#define H8300_GPIO_PA 9
+#define H8300_GPIO_PB 10
+#define H8300_GPIO_PC 11
+#define H8300_GPIO_PD 12
+#define H8300_GPIO_PE 13
+#define H8300_GPIO_PF 14
+#define H8300_GPIO_PG 15
+#define H8300_GPIO_PH 16
+
+#define H8300_GPIO_B7 0x80
+#define H8300_GPIO_B6 0x40
+#define H8300_GPIO_B5 0x20
+#define H8300_GPIO_B4 0x10
+#define H8300_GPIO_B3 0x08
+#define H8300_GPIO_B2 0x04
+#define H8300_GPIO_B1 0x02
+#define H8300_GPIO_B0 0x01
+
+#define H8300_GPIO_INPUT 0
+#define H8300_GPIO_OUTPUT 1
+
+#define H8300_GPIO_RESERVE(port, bits) \
+        h8300_reserved_gpio(port, bits)
+
+#define H8300_GPIO_FREE(port, bits) \
+        h8300_free_gpio(port, bits)
+
+#define H8300_GPIO_DDR(port, bit, dir) \
+        h8300_set_gpio_dir(((port) << 8) | (bit), dir)
+
+#define H8300_GPIO_GETDIR(port, bit) \
+        h8300_get_gpio_dir(((port) << 8) | (bit))
+
+extern int h8300_reserved_gpio(int port, int bits);
+extern int h8300_free_gpio(int port, int bits);
+extern int h8300_set_gpio_dir(int port_bit, int dir);
+extern int h8300_get_gpio_dir(int port_bit);
+extern int h8300_init_gpio(void);
+
+#endif
diff --git a/arch/h8300/include/asm/hardirq.h b/arch/h8300/include/asm/hardirq.h
new file mode 100644 (file)
index 0000000..c2e1aa0
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef __H8300_HARDIRQ_H
+#define __H8300_HARDIRQ_H
+
+#include <asm/irq.h>
+
+#define HARDIRQ_BITS   8
+
+/*
+ * The hardirq mask has to be large enough to have
+ * space for potentially all IRQ sources in the system
+ * nesting on a single CPU:
+ */
+#if (1 << HARDIRQ_BITS) < NR_IRQS
+# error HARDIRQ_BITS is too low!
+#endif
+
+#include <asm-generic/hardirq.h>
+
+#endif
diff --git a/arch/h8300/include/asm/hw_irq.h b/arch/h8300/include/asm/hw_irq.h
new file mode 100644 (file)
index 0000000..d75a5a1
--- /dev/null
@@ -0,0 +1 @@
+/* Do Nothing */
diff --git a/arch/h8300/include/asm/io.h b/arch/h8300/include/asm/io.h
new file mode 100644 (file)
index 0000000..31008a6
--- /dev/null
@@ -0,0 +1,361 @@
+#ifndef _H8300_IO_H
+#define _H8300_IO_H
+
+#ifdef __KERNEL__
+
+/*
+ * These are for ISA/PCI shared memory _only_ and should never be used
+ * on any other type of memory, including Zorro memory. They are meant to
+ * access the bus in the bus byte order which is little-endian!.
+ *
+ * readX/writeX() are used to access memory mapped devices. On some
+ * architectures the memory mapped IO stuff needs to be accessed
+ * differently. On the m68k architecture, we just read/write the
+ * memory location directly.
+ */
+/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates
+ * two accesses to memory, which may be undesirable for some devices.
+ */
+
+/*
+ * swap functions are sometimes needed to interface little-endian hardware
+ */
+
+static inline unsigned short _swapw(volatile unsigned short v)
+{
+#ifndef H8300_IO_NOSWAP
+       unsigned short r;
+       __asm__("xor.b %w0,%x0\n\t"
+               "xor.b %x0,%w0\n\t"
+               "xor.b %w0,%x0"
+               :"=r"(r)
+               :"0"(v));
+       return r;
+#else
+       return v;
+#endif
+}
+
+static inline unsigned long _swapl(volatile unsigned long v)
+{
+#ifndef H8300_IO_NOSWAP
+       unsigned long r;
+       __asm__("xor.b %w0,%x0\n\t"
+               "xor.b %x0,%w0\n\t"
+               "xor.b %w0,%x0\n\t"
+               "xor.w %e0,%f0\n\t"
+               "xor.w %f0,%e0\n\t"
+               "xor.w %e0,%f0\n\t"
+               "xor.b %w0,%x0\n\t"
+               "xor.b %x0,%w0\n\t"
+               "xor.b %w0,%x0"
+               :"=r"(r)
+               :"0"(v));
+       return r;
+#else
+       return v;
+#endif
+}
+
+#define readb(addr) \
+    ({ unsigned char __v = \
+     *(volatile unsigned char *)((unsigned long)(addr) & 0x00ffffff); \
+     __v; })
+#define readw(addr) \
+    ({ unsigned short __v = \
+     *(volatile unsigned short *)((unsigned long)(addr) & 0x00ffffff); \
+     __v; })
+#define readl(addr) \
+    ({ unsigned long __v = \
+     *(volatile unsigned long *)((unsigned long)(addr) & 0x00ffffff); \
+     __v; })
+
+#define writeb(b,addr) (void)((*(volatile unsigned char *) \
+                             ((unsigned long)(addr) & 0x00ffffff)) = (b))
+#define writew(b,addr) (void)((*(volatile unsigned short *) \
+                             ((unsigned long)(addr) & 0x00ffffff)) = (b))
+#define writel(b,addr) (void)((*(volatile unsigned long *) \
+                             ((unsigned long)(addr) & 0x00ffffff)) = (b))
+#define readb_relaxed(addr) readb(addr)
+#define readw_relaxed(addr) readw(addr)
+#define readl_relaxed(addr) readl(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
+
+#if defined(CONFIG_H83069)
+#define ABWCR  0xFEE020
+#elif defined(CONFIG_H8S2678)
+#define ABWCR  0xFFFEC0
+#endif
+
+static inline int h8300_buswidth(unsigned int addr)
+{
+       return (*(volatile unsigned char *)ABWCR & (1 << ((addr >> 21) & 7))) == 0;
+}
+
+static inline void io_outsb(unsigned int addr, const void *buf, int len)
+{
+       volatile unsigned char  *ap_b = (volatile unsigned char *) addr;
+       volatile unsigned short *ap_w = (volatile unsigned short *) addr;
+       unsigned char *bp = (unsigned char *) buf;
+
+       if(h8300_buswidth(addr) && (addr & 1)) {
+               while (len--)
+                       *ap_w = *bp++;
+       } else {
+               while (len--)
+                       *ap_b = *bp++;
+       }
+}
+
+static inline void io_outsw(unsigned int addr, const void *buf, int len)
+{
+       volatile unsigned short *ap = (volatile unsigned short *) addr;
+       unsigned short *bp = (unsigned short *) buf;
+       while (len--)
+               *ap = _swapw(*bp++);
+}
+
+static inline void io_outsl(unsigned int addr, const void *buf, int len)
+{
+       volatile unsigned long *ap = (volatile unsigned long *) addr;
+       unsigned long *bp = (unsigned long *) buf;
+       while (len--)
+               *ap = _swapl(*bp++);
+}
+
+static inline void io_outsw_noswap(unsigned int addr, const void *buf, int len)
+{
+       volatile unsigned short *ap = (volatile unsigned short *) addr;
+       unsigned short *bp = (unsigned short *) buf;
+       while (len--)
+               *ap = *bp++;
+}
+
+static inline void io_outsl_noswap(unsigned int addr, const void *buf, int len)
+{
+       volatile unsigned long *ap = (volatile unsigned long *) addr;
+       unsigned long *bp = (unsigned long *) buf;
+       while (len--)
+               *ap = *bp++;
+}
+
+static inline void io_insb(unsigned int addr, void *buf, int len)
+{
+       volatile unsigned char  *ap_b;
+       volatile unsigned short *ap_w;
+       unsigned char *bp = (unsigned char *) buf;
+
+       if(h8300_buswidth(addr)) {
+               ap_w = (volatile unsigned short *)(addr & ~1);
+               while (len--)
+                       *bp++ = *ap_w & 0xff;
+       } else {
+               ap_b = (volatile unsigned char *)addr;
+               while (len--)
+                       *bp++ = *ap_b;
+       }
+}
+
+static inline void io_insw(unsigned int addr, void *buf, int len)
+{
+       volatile unsigned short *ap = (volatile unsigned short *) addr;
+       unsigned short *bp = (unsigned short *) buf;
+       while (len--)
+               *bp++ = _swapw(*ap);
+}
+
+static inline void io_insl(unsigned int addr, void *buf, int len)
+{
+       volatile unsigned long *ap = (volatile unsigned long *) addr;
+       unsigned long *bp = (unsigned long *) buf;
+       while (len--)
+               *bp++ = _swapl(*ap);
+}
+
+static inline void io_insw_noswap(unsigned int addr, void *buf, int len)
+{
+       volatile unsigned short *ap = (volatile unsigned short *) addr;
+       unsigned short *bp = (unsigned short *) buf;
+       while (len--)
+               *bp++ = *ap;
+}
+
+static inline void io_insl_noswap(unsigned int addr, void *buf, int len)
+{
+       volatile unsigned long *ap = (volatile unsigned long *) addr;
+       unsigned long *bp = (unsigned long *) buf;
+       while (len--)
+               *bp++ = *ap;
+}
+
+/*
+ *     make the short names macros so specific devices
+ *     can override them as required
+ */
+
+#define memset_io(a,b,c)       memset((void *)(a),(b),(c))
+#define memcpy_fromio(a,b,c)   memcpy((a),(void *)(b),(c))
+#define memcpy_toio(a,b,c)     memcpy((void *)(a),(b),(c))
+
+#define mmiowb()
+
+#define inb(addr)    ((h8300_buswidth(addr))?readw((addr) & ~1) & 0xff:readb(addr))
+#define inw(addr)    _swapw(readw(addr))
+#define inl(addr)    _swapl(readl(addr))
+#define outb(x,addr) ((void)((h8300_buswidth(addr) && \
+                      ((addr) & 1))?writew(x,(addr) & ~1):writeb(x,addr)))
+#define outw(x,addr) ((void) writew(_swapw(x),addr))
+#define outl(x,addr) ((void) writel(_swapl(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)
+
+#define outsb(a,b,l) io_outsb(a,b,l)
+#define outsw(a,b,l) io_outsw(a,b,l)
+#define outsl(a,b,l) io_outsl(a,b,l)
+
+#define insb(a,b,l) io_insb(a,b,l)
+#define insw(a,b,l) io_insw(a,b,l)
+#define insl(a,b,l) io_insl(a,b,l)
+
+#define ioread8(a)             __raw_readb(a)
+#define ioread16(a)            __raw_readw(a)
+#define ioread32(a)            __raw_readl(a)
+
+#define iowrite8(v,a)          __raw_writeb((v),(a))
+#define iowrite16(v,a)         __raw_writew((v),(a))
+#define iowrite32(v,a)         __raw_writel((v),(a))
+#define IO_SPACE_LIMIT 0xffffff
+
+
+/* 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);
+
+static inline void *ioremap(unsigned long physaddr, unsigned long size)
+{
+       return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
+}
+static inline void *ioremap_nocache(unsigned long physaddr, unsigned long size)
+{
+       return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
+}
+static inline void *ioremap_writethrough(unsigned long physaddr, unsigned long size)
+{
+       return __ioremap(physaddr, size, IOMAP_WRITETHROUGH);
+}
+static inline void *ioremap_fullcache(unsigned long physaddr, unsigned long size)
+{
+       return __ioremap(physaddr, size, IOMAP_FULL_CACHING);
+}
+
+extern void iounmap(void *addr);
+
+/* H8/300 internal I/O functions */
+static __inline__ unsigned char ctrl_inb(unsigned long addr)
+{
+       return *(volatile unsigned char*)addr;
+}
+
+static __inline__ unsigned short ctrl_inw(unsigned long addr)
+{
+       return *(volatile unsigned short*)addr;
+}
+
+static __inline__ unsigned long ctrl_inl(unsigned long addr)
+{
+       return *(volatile unsigned long*)addr;
+}
+
+static __inline__ void ctrl_outb(unsigned char b, unsigned long addr)
+{
+       *(volatile unsigned char*)addr = b;
+}
+
+static __inline__ void ctrl_outw(unsigned short b, unsigned long addr)
+{
+       *(volatile unsigned short*)addr = b;
+}
+
+static __inline__ void ctrl_outl(unsigned long b, unsigned long addr)
+{
+        *(volatile unsigned long*)addr = b;
+}
+
+static __inline__ void ctrl_bclr(int b, unsigned long addr)
+{
+       if (__builtin_constant_p(b))
+               switch (b) {
+               case 0: __asm__("bclr #0,@%0"::"r"(addr)); break;
+               case 1: __asm__("bclr #1,@%0"::"r"(addr)); break;
+               case 2: __asm__("bclr #2,@%0"::"r"(addr)); break;
+               case 3: __asm__("bclr #3,@%0"::"r"(addr)); break;
+               case 4: __asm__("bclr #4,@%0"::"r"(addr)); break;
+               case 5: __asm__("bclr #5,@%0"::"r"(addr)); break;
+               case 6: __asm__("bclr #6,@%0"::"r"(addr)); break;
+               case 7: __asm__("bclr #7,@%0"::"r"(addr)); break;
+               }
+       else
+               __asm__("bclr %w0,@%1"::"r"(b), "r"(addr));
+}
+
+static __inline__ void ctrl_bset(int b, unsigned long addr)
+{
+       if (__builtin_constant_p(b))
+               switch (b) {
+               case 0: __asm__("bset #0,@%0"::"r"(addr)); break;
+               case 1: __asm__("bset #1,@%0"::"r"(addr)); break;
+               case 2: __asm__("bset #2,@%0"::"r"(addr)); break;
+               case 3: __asm__("bset #3,@%0"::"r"(addr)); break;
+               case 4: __asm__("bset #4,@%0"::"r"(addr)); break;
+               case 5: __asm__("bset #5,@%0"::"r"(addr)); break;
+               case 6: __asm__("bset #6,@%0"::"r"(addr)); break;
+               case 7: __asm__("bset #7,@%0"::"r"(addr)); break;
+               }
+       else
+               __asm__("bset %w0,@%1"::"r"(b), "r"(addr));
+}
+
+#if 0
+/* Pages to physical address... */
+#define page_to_phys(page)      ((page - mem_map) << PAGE_SHIFT)
+#define page_to_bus(page)       ((page - mem_map) << PAGE_SHIFT)
+#endif
+
+/*
+ * Macros used for converting between virtual and physical mappings.
+ */
+#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
+/*
+ * 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
+
+#endif /* __KERNEL__ */
+
+#endif /* _H8300_IO_H */
diff --git a/arch/h8300/include/asm/irq.h b/arch/h8300/include/asm/irq.h
new file mode 100644 (file)
index 0000000..66776a6
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef _H8300_IRQ_H_
+#define _H8300_IRQ_H_
+
+#include <linux/irqchip.h>
+
+#if defined(CONFIG_CPU_H8300H)
+#define NR_IRQS 64
+#define IRQ_CHIP &h8300h_irq_chip
+#define EXT_IRQ0 12
+#define EXT_IRQS 6
+#elif defined(CONFIG_CPU_H8S)
+#define NR_IRQS 128
+#define IRQ_CHIP &h8s_irq_chip
+#define EXT_IRQ0 16
+#define EXT_IRQS 16
+#endif
+
+static __inline__ int irq_canonicalize(int irq)
+{
+       return irq;
+}
+
+void h8300_init_ipr(void);
+extern struct irq_chip h8300h_irq_chip;
+extern struct irq_chip h8s_irq_chip;
+#endif /* _H8300_IRQ_H_ */
diff --git a/arch/h8300/include/asm/irq_regs.h b/arch/h8300/include/asm/irq_regs.h
new file mode 100644 (file)
index 0000000..3dd9c0b
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/irq_regs.h>
diff --git a/arch/h8300/include/asm/irqflags.h b/arch/h8300/include/asm/irqflags.h
new file mode 100644 (file)
index 0000000..ee04dcf
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _H8300_IRQFLAGS_H
+#define _H8300_IRQFLAGS_H
+
+#ifdef CONFIG_CPU_H8300H
+static inline unsigned long arch_local_save_flags(void)
+{
+       unsigned long flags;
+       asm volatile ("stc ccr,%w0" : "=r" (flags));
+       return flags;
+}
+
+static inline void arch_local_irq_disable(void)
+{
+       asm volatile ("orc  #0x80,ccr" : : : "memory");
+}
+
+static inline void arch_local_irq_enable(void)
+{
+       asm volatile ("andc #0x7f,ccr" : : : "memory");
+}
+
+static inline unsigned long arch_local_irq_save(void)
+{
+       unsigned long flags = arch_local_save_flags();
+       arch_local_irq_disable();
+       return flags;
+}
+
+static inline void arch_local_irq_restore(unsigned long flags)
+{
+       asm volatile ("ldc %w0,ccr" : : "r" (flags) : "memory");
+}
+#endif
+#ifdef CONFIG_CPU_H8S
+static inline unsigned long arch_local_save_flags(void)
+{
+       unsigned long flags;
+       asm volatile ("stc ccr,%w0\n\tstc exr,%x0" : "=r" (flags));
+       return flags;
+}
+
+static inline void arch_local_irq_disable(void)
+{
+       asm volatile ("orc  #0x80,ccr\n\torc #0x07,exr" : : : "memory");
+}
+
+static inline void arch_local_irq_enable(void)
+{
+       asm volatile ("andc #0x7f,ccr\n\tandc #0xf0,exr\n\t": : : "memory");
+}
+
+static inline unsigned long arch_local_irq_save(void)
+{
+       unsigned long flags = arch_local_save_flags();
+       arch_local_irq_disable();
+       return flags;
+}
+
+static inline void arch_local_irq_restore(unsigned long flags)
+{
+       asm volatile ("ldc %w0,ccr\n\tldc %x0,exr" : : "r" (flags) : "memory");
+}
+#endif
+
+static inline int arch_irqs_disabled_flags(unsigned long flags)
+{
+       return (flags & 0x80) == 0x80;
+}
+
+static inline int arch_irqs_disabled(void)
+{
+       return arch_irqs_disabled_flags(arch_local_save_flags());
+}
+
+#endif /* _H8300_IRQFLAGS_H */
diff --git a/arch/h8300/include/asm/kdebug.h b/arch/h8300/include/asm/kdebug.h
new file mode 100644 (file)
index 0000000..6ece1b0
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/kdebug.h>
diff --git a/arch/h8300/include/asm/kmap_types.h b/arch/h8300/include/asm/kmap_types.h
new file mode 100644 (file)
index 0000000..be12a71
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _ASM_H8300_KMAP_TYPES_H
+#define _ASM_H8300_KMAP_TYPES_H
+
+#include <asm-generic/kmap_types.h>
+
+#endif
diff --git a/arch/h8300/include/asm/local.h b/arch/h8300/include/asm/local.h
new file mode 100644 (file)
index 0000000..fdd4efe
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _H8300_LOCAL_H_
+#define _H8300_LOCAL_H_
+
+#include <asm-generic/local.h>
+
+#endif
diff --git a/arch/h8300/include/asm/local64.h b/arch/h8300/include/asm/local64.h
new file mode 100644 (file)
index 0000000..36c93b5
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/local64.h>
diff --git a/arch/h8300/include/asm/mc146818rtc.h b/arch/h8300/include/asm/mc146818rtc.h
new file mode 100644 (file)
index 0000000..ab9d964
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+ * Machine dependent access functions for RTC registers.
+ */
+#ifndef _H8300_MC146818RTC_H
+#define _H8300_MC146818RTC_H
+
+/* empty include file to satisfy the include in genrtc.c/ide-geometry.c */
+
+#endif /* _H8300_MC146818RTC_H */
diff --git a/arch/h8300/include/asm/mmu.h b/arch/h8300/include/asm/mmu.h
new file mode 100644 (file)
index 0000000..2caa6ed
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/mmu.h>
diff --git a/arch/h8300/include/asm/mmu_context.h b/arch/h8300/include/asm/mmu_context.h
new file mode 100644 (file)
index 0000000..7739fe1
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/mmu_context.h>
diff --git a/arch/h8300/include/asm/mutex.h b/arch/h8300/include/asm/mutex.h
new file mode 100644 (file)
index 0000000..458c1f7
--- /dev/null
@@ -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/arch/h8300/include/asm/page.h b/arch/h8300/include/asm/page.h
new file mode 100644 (file)
index 0000000..d98c96c
--- /dev/null
@@ -0,0 +1,5 @@
+#ifndef _H8300_PAGE_H
+#define _H8300_PAGE_H
+#include <asm-generic/page.h>
+#define MAP_NR(addr)           (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)
+#endif
diff --git a/arch/h8300/include/asm/page_offset.h b/arch/h8300/include/asm/page_offset.h
new file mode 100644 (file)
index 0000000..f870646
--- /dev/null
@@ -0,0 +1,3 @@
+
+#define PAGE_OFFSET_RAW                0x00000000
+
diff --git a/arch/h8300/include/asm/param.h b/arch/h8300/include/asm/param.h
new file mode 100644 (file)
index 0000000..965d454
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/param.h>
diff --git a/arch/h8300/include/asm/pci.h b/arch/h8300/include/asm/pci.h
new file mode 100644 (file)
index 0000000..0b2acaa
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _ASM_H8300_PCI_H
+#define _ASM_H8300_PCI_H
+
+/*
+ * asm-h8300/pci.h - H8/300 specific PCI declarations.
+ *
+ * Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+#define pcibios_assign_all_busses()    0
+
+static inline void pcibios_penalize_isa_irq(int irq, int active)
+{
+       /* We don't do dynamic PCI IRQ allocation */
+}
+
+#define PCI_DMA_BUS_IS_PHYS    (1)
+
+#endif /* _ASM_H8300_PCI_H */
diff --git a/arch/h8300/include/asm/percpu.h b/arch/h8300/include/asm/percpu.h
new file mode 100644 (file)
index 0000000..72c03e3
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ARCH_H8300_PERCPU__
+#define __ARCH_H8300_PERCPU__
+
+#include <asm-generic/percpu.h>
+
+#endif /* __ARCH_H8300_PERCPU__ */
diff --git a/arch/h8300/include/asm/pgalloc.h b/arch/h8300/include/asm/pgalloc.h
new file mode 100644 (file)
index 0000000..f261cb7
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/pgalloc.h>
diff --git a/arch/h8300/include/asm/pgtable.h b/arch/h8300/include/asm/pgtable.h
new file mode 100644 (file)
index 0000000..75d7702
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef _H8300_PGTABLE_H
+#define _H8300_PGTABLE_H
+#include <asm-generic/pgtable-nopud.h>
+#include <asm-generic/pgtable.h>
+#define pgtable_cache_init()   do { } while (0)
+extern void paging_init(void);
+#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 */
+#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 })
+#define kern_addr_valid(addr)  (1)
+
+static inline int pte_file(pte_t pte) { return 0; }
+#define swapper_pg_dir ((pgd_t *) 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))
+
+/*
+ * These would be in other places but having them here reduces the diffs.
+ */
+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)
+
+/*
+ * 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_cpu_mode()    do {} while (0)
+
+#endif /* _H8300_PGTABLE_H */
diff --git a/arch/h8300/include/asm/processor.h b/arch/h8300/include/asm/processor.h
new file mode 100644 (file)
index 0000000..d87ccb6
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * include/asm-h8300/processor.h
+ *
+ * Copyright (C) 2002 Yoshinori Sato
+ *
+ * Based on: linux/asm-m68nommu/processor.h
+ *
+ * Copyright (C) 1995 Hamish Macdonald
+ */
+
+#ifndef __ASM_H8300_PROCESSOR_H
+#define __ASM_H8300_PROCESSOR_H
+
+/*
+ * Default implementation of macro that returns current
+ * instruction pointer ("program counter").
+ */
+#define current_text_addr() ({ __label__ _l; _l: &&_l;})
+
+#include <linux/compiler.h>
+#include <asm/segment.h>
+#include <asm/ptrace.h>
+#include <asm/current.h>
+
+static inline unsigned long rdusp(void) {
+       extern unsigned int     _sw_usp;
+       return _sw_usp;
+}
+
+static inline void wrusp(unsigned long usp) {
+       extern unsigned int     _sw_usp;
+       _sw_usp = usp;
+}
+
+/*
+ * User space process size: 3.75GB. This is hardcoded into a few places,
+ * so don't change it unless you know what you are doing.
+ */
+#define TASK_SIZE      (0xFFFFFFFFUL)
+
+#ifdef __KERNEL__
+#define STACK_TOP      TASK_SIZE
+#define STACK_TOP_MAX  STACK_TOP
+#endif
+
+/*
+ * 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
+
+struct thread_struct {
+       unsigned long  ksp;             /* kernel stack pointer */
+       unsigned long  usp;             /* user stack pointer */
+       unsigned long  ccr;             /* saved status register */
+       unsigned long  esp0;            /* points to SR of stack frame */
+       struct {
+               unsigned short *addr;
+               unsigned short inst;
+       } breakinfo;
+};
+
+#define INIT_THREAD  {                                         \
+       .ksp  = sizeof(init_stack) + (unsigned long)init_stack, \
+       .usp  = 0,                                              \
+       .ccr  = PS_S,                                           \
+       .esp0 = 0,                                              \
+       .breakinfo = {                                          \
+               .addr = (unsigned short *)-1,                   \
+               .inst = 0                                       \
+       }                                                       \
+}
+
+/*
+ * Do necessary setup to start up a newly executed thread.
+ *
+ * pass the data segment into user programs if it exists,
+ * it can't hurt anything as far as I can tell
+ */
+#if defined(CONFIG_CPU_H8300H)
+#define start_thread(_regs, _pc, _usp)                         \
+do {                                                           \
+       (_regs)->pc = (_pc);                                    \
+       (_regs)->ccr = 0x00;       /* clear all flags */        \
+       (_regs)->er5 = current->mm->start_data; /* GOT base */  \
+       wrusp((unsigned long)(_usp) - sizeof(unsigned long)*3); \
+} while(0)
+#endif
+#if defined(CONFIG_CPU_H8S)
+#define start_thread(_regs, _pc, _usp)                         \
+do {                                                           \
+       (_regs)->pc = (_pc);                                    \
+       (_regs)->ccr = 0x00;       /* clear kernel flag */      \
+       (_regs)->exr = 0x78;       /* enable all interrupts */  \
+       (_regs)->er5 = current->mm->start_data; /* GOT base */  \
+       /* 14 = space for retaddr(4), vector(4), er0(4) and exr(2) on stack */ \
+       wrusp(((unsigned long)(_usp)) - 14);                    \
+} while(0)
+#endif
+
+/* Forward declaration, a strange C thing */
+struct task_struct;
+
+/* Free all resources held by a thread. */
+static inline void release_thread(struct task_struct *dead_task)
+{
+}
+
+/*
+ * Free current thread data structures etc..
+ */
+static inline void exit_thread(void)
+{
+}
+
+/*
+ * Return saved PC of a blocked thread.
+ */
+unsigned long thread_saved_pc(struct task_struct *tsk);
+unsigned long get_wchan(struct task_struct *p);
+
+#define        KSTK_EIP(tsk)   \
+    ({                 \
+       unsigned long eip = 0;   \
+       if ((tsk)->thread.esp0 > PAGE_SIZE && \
+           MAP_NR((tsk)->thread.esp0) < max_mapnr) \
+             eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \
+       eip; })
+#define        KSTK_ESP(tsk)   ((tsk) == current ? rdusp() : (tsk)->thread.usp)
+
+#define cpu_relax()    barrier()
+
+#define HARD_RESET_NOW() ({            \
+        local_irq_disable();           \
+        asm("jmp @@0");                        \
+})
+
+#endif
diff --git a/arch/h8300/include/asm/ptrace.h b/arch/h8300/include/asm/ptrace.h
new file mode 100644 (file)
index 0000000..c1826b9
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef _H8300_PTRACE_H
+#define _H8300_PTRACE_H
+
+#include <uapi/asm/ptrace.h>
+
+#ifndef __ASSEMBLY__
+#if defined(CONFIG_CPU_H8S)
+#endif
+#ifndef PS_S
+#define PS_S  (0x10)
+#endif
+
+#if defined(__H8300H__)
+#define H8300_REGS_NO 11
+#endif
+#if defined(__H8300S__)
+#define H8300_REGS_NO 12
+#endif
+
+/* Find the stack offset for a register, relative to thread.esp0. */
+#define PT_REG(reg)    ((long)&((struct pt_regs *)0)->reg)
+
+#define arch_has_single_step() (1)
+
+#define user_mode(regs) (!((regs)->ccr & PS_S))
+#define instruction_pointer(regs) ((regs)->pc)
+#define profile_pc(regs) instruction_pointer(regs)
+#define current_pt_regs() ((struct pt_regs *) \
+       (THREAD_SIZE + (unsigned long)current_thread_info()) - 1)
+#define signal_pt_regs() ((struct pt_regs *)current->thread.esp0)
+#define current_user_stack_pointer() rdusp()
+#endif /* __ASSEMBLY__ */
+#endif /* _H8300_PTRACE_H */
diff --git a/arch/h8300/include/asm/regs267x.h b/arch/h8300/include/asm/regs267x.h
new file mode 100644 (file)
index 0000000..1bff731
--- /dev/null
@@ -0,0 +1,336 @@
+/* internal Peripherals Register address define */
+/* CPU: H8/306x                                 */
+
+#if !defined(__REGS_H8S267x__)
+#define __REGS_H8S267x__ 
+
+#if defined(__KERNEL__)
+
+#define DASTCR 0xFEE01A
+#define DADR0  0xFFFFA4
+#define DADR1  0xFFFFA5
+#define DACR01 0xFFFFA6
+#define DADR2  0xFFFFA8
+#define DADR3  0xFFFFA9
+#define DACR23 0xFFFFAA
+
+#define ADDRA  0xFFFF90
+#define ADDRAH 0xFFFF90
+#define ADDRAL 0xFFFF91
+#define ADDRB  0xFFFF92
+#define ADDRBH 0xFFFF92
+#define ADDRBL 0xFFFF93
+#define ADDRC  0xFFFF94
+#define ADDRCH 0xFFFF94
+#define ADDRCL 0xFFFF95
+#define ADDRD  0xFFFF96
+#define ADDRDH 0xFFFF96
+#define ADDRDL 0xFFFF97
+#define ADDRE  0xFFFF98
+#define ADDREH 0xFFFF98
+#define ADDREL 0xFFFF99
+#define ADDRF  0xFFFF9A
+#define ADDRFH 0xFFFF9A
+#define ADDRFL 0xFFFF9B
+#define ADDRG  0xFFFF9C
+#define ADDRGH 0xFFFF9C
+#define ADDRGL 0xFFFF9D
+#define ADDRH  0xFFFF9E
+#define ADDRHH 0xFFFF9E
+#define ADDRHL 0xFFFF9F
+
+#define ADCSR  0xFFFFA0
+#define ADCR   0xFFFFA1
+
+#define ABWCR  0xFFFEC0
+#define ASTCR  0xFFFEC1
+#define WTCRAH 0xFFFEC2
+#define WTCRAL 0xFFFEC3
+#define WTCRBH 0xFFFEC4
+#define WTCRBL 0xFFFEC5
+#define RDNCR  0xFFFEC6
+#define CSACRH 0xFFFEC8
+#define CSACRL 0xFFFEC9
+#define BROMCRH 0xFFFECA
+#define BROMCRL 0xFFFECB
+#define BCR    0xFFFECC
+#define DRAMCR 0xFFFED0
+#define DRACCR 0xFFFED2
+#define REFCR  0xFFFED4
+#define RTCNT  0xFFFED6
+#define RTCOR  0xFFFED7
+
+#define MAR0AH  0xFFFEE0
+#define MAR0AL  0xFFFEE2
+#define IOAR0A  0xFFFEE4
+#define ETCR0A  0xFFFEE6
+#define MAR0BH  0xFFFEE8
+#define MAR0BL  0xFFFEEA
+#define IOAR0B  0xFFFEEC
+#define ETCR0B  0xFFFEEE
+#define MAR1AH  0xFFFEF0
+#define MAR1AL  0xFFFEF2
+#define IOAR1A  0xFFFEF4
+#define ETCR1A  0xFFFEF6
+#define MAR1BH  0xFFFEF8
+#define MAR1BL  0xFFFEFA
+#define IOAR1B  0xFFFEFC
+#define ETCR1B  0xFFFEFE
+#define DMAWER  0xFFFF20
+#define DMATCR  0xFFFF21
+#define DMACR0A 0xFFFF22
+#define DMACR0B 0xFFFF23
+#define DMACR1A 0xFFFF24
+#define DMACR1B 0xFFFF25
+#define DMABCRH 0xFFFF26
+#define DMABCRL 0xFFFF27
+
+#define EDSAR0  0xFFFDC0
+#define EDDAR0  0xFFFDC4
+#define EDTCR0  0xFFFDC8
+#define EDMDR0  0xFFFDCC
+#define EDMDR0H 0xFFFDCC
+#define EDMDR0L 0xFFFDCD
+#define EDACR0  0xFFFDCE
+#define EDSAR1  0xFFFDD0
+#define EDDAR1  0xFFFDD4
+#define EDTCR1  0xFFFDD8
+#define EDMDR1  0xFFFDDC
+#define EDMDR1H 0xFFFDDC
+#define EDMDR1L 0xFFFDDD
+#define EDACR1  0xFFFDDE
+#define EDSAR2  0xFFFDE0
+#define EDDAR2  0xFFFDE4
+#define EDTCR2  0xFFFDE8
+#define EDMDR2  0xFFFDEC
+#define EDMDR2H 0xFFFDEC
+#define EDMDR2L 0xFFFDED
+#define EDACR2  0xFFFDEE
+#define EDSAR3  0xFFFDF0
+#define EDDAR3  0xFFFDF4
+#define EDTCR3  0xFFFDF8
+#define EDMDR3  0xFFFDFC
+#define EDMDR3H 0xFFFDFC
+#define EDMDR3L 0xFFFDFD
+#define EDACR3  0xFFFDFE
+
+#define IPRA  0xFFFE00
+#define IPRB  0xFFFE02
+#define IPRC  0xFFFE04
+#define IPRD  0xFFFE06
+#define IPRE  0xFFFE08
+#define IPRF  0xFFFE0A
+#define IPRG  0xFFFE0C
+#define IPRH  0xFFFE0E
+#define IPRI  0xFFFE10
+#define IPRJ  0xFFFE12
+#define IPRK  0xFFFE14
+#define ITSR  0xFFFE16
+#define SSIER 0xFFFE18
+#define ISCRH 0xFFFE1A
+#define ISCRL 0xFFFE1C
+
+#define INTCR 0xFFFF31
+#define IER   0xFFFF32
+#define IERH  0xFFFF32
+#define IERL  0xFFFF33
+#define ISR   0xFFFF34
+#define ISRH  0xFFFF34
+#define ISRL  0xFFFF35
+
+#define P1DDR 0xFFFE20
+#define P2DDR 0xFFFE21
+#define P3DDR 0xFFFE22
+#define P4DDR 0xFFFE23
+#define P5DDR 0xFFFE24
+#define P6DDR 0xFFFE25
+#define P7DDR 0xFFFE26
+#define P8DDR 0xFFFE27
+#define P9DDR 0xFFFE28
+#define PADDR 0xFFFE29
+#define PBDDR 0xFFFE2A
+#define PCDDR 0xFFFE2B
+#define PDDDR 0xFFFE2C
+#define PEDDR 0xFFFE2D
+#define PFDDR 0xFFFE2E
+#define PGDDR 0xFFFE2F
+#define PHDDR 0xFFFF74
+
+#define PFCR0 0xFFFE32
+#define PFCR1 0xFFFE33
+#define PFCR2 0xFFFE34
+
+#define PAPCR 0xFFFE36
+#define PBPCR 0xFFFE37
+#define PCPCR 0xFFFE38
+#define PDPCR 0xFFFE39
+#define PEPCR 0xFFFE3A
+
+#define P3ODR 0xFFFE3C
+#define PAODR 0xFFFE3D
+
+#define P1DR  0xFFFF60
+#define P2DR  0xFFFF61
+#define P3DR  0xFFFF62
+#define P4DR  0xFFFF63
+#define P5DR  0xFFFF64
+#define P6DR  0xFFFF65
+#define P7DR  0xFFFF66
+#define P8DR  0xFFFF67
+#define P9DR  0xFFFF68
+#define PADR  0xFFFF69
+#define PBDR  0xFFFF6A
+#define PCDR  0xFFFF6B
+#define PDDR  0xFFFF6C
+#define PEDR  0xFFFF6D
+#define PFDR  0xFFFF6E
+#define PGDR  0xFFFF6F
+#define PHDR  0xFFFF72
+
+#define PORT1 0xFFFF50
+#define PORT2 0xFFFF51
+#define PORT3 0xFFFF52
+#define PORT4 0xFFFF53
+#define PORT5 0xFFFF54
+#define PORT6 0xFFFF55
+#define PORT7 0xFFFF56
+#define PORT8 0xFFFF57
+#define PORT9 0xFFFF58
+#define PORTA 0xFFFF59
+#define PORTB 0xFFFF5A
+#define PORTC 0xFFFF5B
+#define PORTD 0xFFFF5C
+#define PORTE 0xFFFF5D
+#define PORTF 0xFFFF5E
+#define PORTG 0xFFFF5F
+#define PORTH 0xFFFF70
+
+#define PCR   0xFFFF46
+#define PMR   0xFFFF47
+#define NDERH 0xFFFF48
+#define NDERL 0xFFFF49
+#define PODRH 0xFFFF4A
+#define PODRL 0xFFFF4B
+#define NDRH1 0xFFFF4C
+#define NDRL1 0xFFFF4D
+#define NDRH2 0xFFFF4E
+#define NDRL2 0xFFFF4F
+
+#define SMR0  0xFFFF78
+#define BRR0  0xFFFF79
+#define SCR0  0xFFFF7A
+#define TDR0  0xFFFF7B
+#define SSR0  0xFFFF7C
+#define RDR0  0xFFFF7D
+#define SCMR0 0xFFFF7E
+#define SMR1  0xFFFF80
+#define BRR1  0xFFFF81
+#define SCR1  0xFFFF82
+#define TDR1  0xFFFF83
+#define SSR1  0xFFFF84
+#define RDR1  0xFFFF85
+#define SCMR1 0xFFFF86
+#define SMR2  0xFFFF88
+#define BRR2  0xFFFF89
+#define SCR2  0xFFFF8A
+#define TDR2  0xFFFF8B
+#define SSR2  0xFFFF8C
+#define RDR2  0xFFFF8D
+#define SCMR2 0xFFFF8E
+
+#define IRCR0 0xFFFE1E
+#define SEMR  0xFFFDA8
+
+#define MDCR    0xFFFF3E
+#define SYSCR   0xFFFF3D
+#define MSTPCRH 0xFFFF40
+#define MSTPCRL 0xFFFF41
+#define FLMCR1  0xFFFFC8
+#define FLMCR2  0xFFFFC9
+#define EBR1    0xFFFFCA
+#define EBR2    0xFFFFCB
+#define CTGARC_RAMCR   0xFFFECE
+#define SBYCR   0xFFFF3A
+#define SCKCR   0xFFFF3B
+#define PLLCR   0xFFFF45
+
+#define TSTR   0xFFFFC0
+#define TSNC   0XFFFFC1
+
+#define TCR0   0xFFFFD0
+#define TMDR0  0xFFFFD1
+#define TIORH0 0xFFFFD2
+#define TIORL0 0xFFFFD3
+#define TIER0  0xFFFFD4
+#define TSR0   0xFFFFD5
+#define TCNT0  0xFFFFD6
+#define GRA0   0xFFFFD8
+#define GRB0   0xFFFFDA
+#define GRC0   0xFFFFDC
+#define GRD0   0xFFFFDE
+#define TCR1   0xFFFFE0
+#define TMDR1  0xFFFFE1
+#define TIORH1 0xFFFFE2
+#define TIORL1 0xFFFFE3
+#define TIER1  0xFFFFE4
+#define TSR1   0xFFFFE5
+#define TCNT1  0xFFFFE6
+#define GRA1   0xFFFFE8
+#define GRB1   0xFFFFEA
+#define TCR2   0xFFFFF0
+#define TMDR2  0xFFFFF1
+#define TIORH2 0xFFFFF2
+#define TIORL2 0xFFFFF3
+#define TIER2  0xFFFFF4
+#define TSR2   0xFFFFF5
+#define TCNT2  0xFFFFF6
+#define GRA2   0xFFFFF8
+#define GRB2   0xFFFFFA
+#define TCR3   0xFFFE80
+#define TMDR3  0xFFFE81
+#define TIORH3 0xFFFE82
+#define TIORL3 0xFFFE83
+#define TIER3  0xFFFE84
+#define TSR3   0xFFFE85
+#define TCNT3  0xFFFE86
+#define GRA3   0xFFFE88
+#define GRB3   0xFFFE8A
+#define GRC3   0xFFFE8C
+#define GRD3   0xFFFE8E
+#define TCR4   0xFFFE90
+#define TMDR4  0xFFFE91
+#define TIORH4 0xFFFE92
+#define TIORL4 0xFFFE93
+#define TIER4  0xFFFE94
+#define TSR4   0xFFFE95
+#define TCNT4  0xFFFE96
+#define GRA4   0xFFFE98
+#define GRB4   0xFFFE9A
+#define TCR5   0xFFFEA0
+#define TMDR5  0xFFFEA1
+#define TIORH5 0xFFFEA2
+#define TIORL5 0xFFFEA3
+#define TIER5  0xFFFEA4
+#define TSR5   0xFFFEA5
+#define TCNT5  0xFFFEA6
+#define GRA5   0xFFFEA8
+#define GRB5   0xFFFEAA
+
+#define _8TCR0   0xFFFFB0
+#define _8TCR1   0xFFFFB1
+#define _8TCSR0  0xFFFFB2
+#define _8TCSR1  0xFFFFB3
+#define _8TCORA0 0xFFFFB4
+#define _8TCORA1 0xFFFFB5
+#define _8TCORB0 0xFFFFB6
+#define _8TCORB1 0xFFFFB7
+#define _8TCNT0  0xFFFFB8
+#define _8TCNT1  0xFFFFB9
+
+#define TCSR    0xFFFFBC
+#define TCNT    0xFFFFBD
+#define RSTCSRW 0xFFFFBE
+#define RSTCSRR 0xFFFFBF
+
+#endif /* __KERNEL__ */
+#endif /* __REGS_H8S267x__ */
diff --git a/arch/h8300/include/asm/regs306x.h b/arch/h8300/include/asm/regs306x.h
new file mode 100644 (file)
index 0000000..027dd63
--- /dev/null
@@ -0,0 +1,212 @@
+/* internal Peripherals Register address define */
+/* CPU: H8/306x                                 */
+
+#if !defined(__REGS_H8306x__)
+#define __REGS_H8306x__ 
+
+#if defined(__KERNEL__)
+
+#define DASTCR 0xFEE01A
+#define DADR0  0xFEE09C
+#define DADR1  0xFEE09D
+#define DACR   0xFEE09E
+
+#define ADDRAH 0xFFFFE0
+#define ADDRAL 0xFFFFE1
+#define ADDRBH 0xFFFFE2
+#define ADDRBL 0xFFFFE3
+#define ADDRCH 0xFFFFE4
+#define ADDRCL 0xFFFFE5
+#define ADDRDH 0xFFFFE6
+#define ADDRDL 0xFFFFE7
+#define ADCSR  0xFFFFE8
+#define ADCR   0xFFFFE9
+
+#define BRCR   0xFEE013
+#define ADRCR  0xFEE01E
+#define CSCR   0xFEE01F
+#define ABWCR  0xFEE020
+#define ASTCR  0xFEE021
+#define WCRH   0xFEE022
+#define WCRL   0xFEE023
+#define BCR    0xFEE024
+#define DRCRA  0xFEE026
+#define DRCRB  0xFEE027
+#define RTMCSR 0xFEE028
+#define RTCNT  0xFEE029
+#define RTCOR  0xFEE02A
+
+#define MAR0AR  0xFFFF20
+#define MAR0AE  0xFFFF21
+#define MAR0AH  0xFFFF22
+#define MAR0AL  0xFFFF23
+#define ETCR0AL 0xFFFF24
+#define ETCR0AH 0xFFFF25
+#define IOAR0A  0xFFFF26
+#define DTCR0A  0xFFFF27
+#define MAR0BR  0xFFFF28
+#define MAR0BE  0xFFFF29
+#define MAR0BH  0xFFFF2A
+#define MAR0BL  0xFFFF2B
+#define ETCR0BL 0xFFFF2C
+#define ETCR0BH 0xFFFF2D
+#define IOAR0B  0xFFFF2E
+#define DTCR0B  0xFFFF2F
+#define MAR1AR  0xFFFF30
+#define MAR1AE  0xFFFF31
+#define MAR1AH  0xFFFF32
+#define MAR1AL  0xFFFF33
+#define ETCR1AL 0xFFFF34
+#define ETCR1AH 0xFFFF35
+#define IOAR1A  0xFFFF36
+#define DTCR1A  0xFFFF37
+#define MAR1BR  0xFFFF38
+#define MAR1BE  0xFFFF39
+#define MAR1BH  0xFFFF3A
+#define MAR1BL  0xFFFF3B
+#define ETCR1BL 0xFFFF3C
+#define ETCR1BH 0xFFFF3D
+#define IOAR1B  0xFFFF3E
+#define DTCR1B  0xFFFF3F
+
+#define ISCR 0xFEE014
+#define IER  0xFEE015
+#define ISR  0xFEE016
+#define IPRA 0xFEE018
+#define IPRB 0xFEE019
+
+#define P1DDR 0xFEE000
+#define P2DDR 0xFEE001
+#define P3DDR 0xFEE002
+#define P4DDR 0xFEE003
+#define P5DDR 0xFEE004
+#define P6DDR 0xFEE005
+/*#define P7DDR 0xFEE006*/
+#define P8DDR 0xFEE007
+#define P9DDR 0xFEE008
+#define PADDR 0xFEE009
+#define PBDDR 0xFEE00A
+
+#define P1DR  0xFFFFD0
+#define P2DR  0xFFFFD1
+#define P3DR  0xFFFFD2
+#define P4DR  0xFFFFD3
+#define P5DR  0xFFFFD4
+#define P6DR  0xFFFFD5
+/*#define P7DR  0xFFFFD6*/
+#define P8DR  0xFFFFD7
+#define P9DR  0xFFFFD8
+#define PADR  0xFFFFD9
+#define PBDR  0xFFFFDA
+
+#define P2CR  0xFEE03C
+#define P4CR  0xFEE03E
+#define P5CR  0xFEE03F
+
+#define SMR0  0xFFFFB0
+#define BRR0  0xFFFFB1
+#define SCR0  0xFFFFB2
+#define TDR0  0xFFFFB3
+#define SSR0  0xFFFFB4
+#define RDR0  0xFFFFB5
+#define SCMR0 0xFFFFB6
+#define SMR1  0xFFFFB8
+#define BRR1  0xFFFFB9
+#define SCR1  0xFFFFBA
+#define TDR1  0xFFFFBB
+#define SSR1  0xFFFFBC
+#define RDR1  0xFFFFBD
+#define SCMR1 0xFFFFBE
+#define SMR2  0xFFFFC0
+#define BRR2  0xFFFFC1
+#define SCR2  0xFFFFC2
+#define TDR2  0xFFFFC3
+#define SSR2  0xFFFFC4
+#define RDR2  0xFFFFC5
+#define SCMR2 0xFFFFC6
+
+#define MDCR   0xFEE011
+#define SYSCR  0xFEE012
+#define DIVCR  0xFEE01B
+#define MSTCRH 0xFEE01C
+#define MSTCRL 0xFEE01D
+#define FLMCR1 0xFEE030
+#define FLMCR2 0xFEE031
+#define EBR1   0xFEE032
+#define EBR2   0xFEE033
+#define RAMCR  0xFEE077
+
+#define TSTR   0xFFFF60
+#define TSNC   0XFFFF61
+#define TMDR   0xFFFF62
+#define TOLR   0xFFFF63
+#define TISRA  0xFFFF64
+#define TISRB  0xFFFF65
+#define TISRC  0xFFFF66
+#define TCR0   0xFFFF68
+#define TIOR0  0xFFFF69
+#define TCNT0H 0xFFFF6A
+#define TCNT0L 0xFFFF6B
+#define GRA0H  0xFFFF6C
+#define GRA0L  0xFFFF6D
+#define GRB0H  0xFFFF6E
+#define GRB0L  0xFFFF6F
+#define TCR1   0xFFFF70
+#define TIOR1  0xFFFF71
+#define TCNT1H 0xFFFF72
+#define TCNT1L 0xFFFF73
+#define GRA1H  0xFFFF74
+#define GRA1L  0xFFFF75
+#define GRB1H  0xFFFF76
+#define GRB1L  0xFFFF77
+#define TCR3   0xFFFF78
+#define TIOR3  0xFFFF79
+#define TCNT3H 0xFFFF7A
+#define TCNT3L 0xFFFF7B
+#define GRA3H  0xFFFF7C
+#define GRA3L  0xFFFF7D
+#define GRB3H  0xFFFF7E
+#define GRB3L  0xFFFF7F
+
+#define _8TCR0  0xFFFF80
+#define _8TCR1  0xFFFF81
+#define _8TCSR0 0xFFFF82
+#define _8TCSR1 0xFFFF83
+#define TCORA0 0xFFFF84
+#define TCORA1 0xFFFF85
+#define TCORB0 0xFFFF86
+#define TCORB1 0xFFFF87
+#define _8TCNT0 0xFFFF88
+#define _8TCNT1 0xFFFF89
+
+#define _8TCR2  0xFFFF90
+#define _8TCR3  0xFFFF91
+#define _8TCSR2 0xFFFF92
+#define _8TCSR3 0xFFFF93
+#define TCORA2 0xFFFF94
+#define TCORA3 0xFFFF95
+#define TCORB2 0xFFFF96
+#define TCORB3 0xFFFF97
+#define _8TCNT2 0xFFFF98
+#define _8TCNT3 0xFFFF99
+
+#define TCSR   0xFFFF8C
+#define TCNT   0xFFFF8D
+#define RSTCSR 0xFFFF8F
+
+#define TPMR  0xFFFFA0
+#define TPCR  0xFFFFA1
+#define NDERB 0xFFFFA2
+#define NDERA 0xFFFFA3
+#define NDRB1 0xFFFFA4
+#define NDRA1 0xFFFFA5
+#define NDRB2 0xFFFFA6
+#define NDRA2 0xFFFFA7
+
+#define TCSR    0xFFFF8C
+#define TCNT    0xFFFF8D
+#define RSTCSRW 0xFFFF8E
+#define RSTCSRR 0xFFFF8F
+
+#endif /* __KERNEL__ */
+#endif /* __REGS_H8306x__ */
diff --git a/arch/h8300/include/asm/scatterlist.h b/arch/h8300/include/asm/scatterlist.h
new file mode 100644 (file)
index 0000000..35d786f
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/scatterlist.h>
diff --git a/arch/h8300/include/asm/sections.h b/arch/h8300/include/asm/sections.h
new file mode 100644 (file)
index 0000000..a81743e
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _H8300_SECTIONS_H_
+#define _H8300_SECTIONS_H_
+
+#include <asm-generic/sections.h>
+
+#endif
diff --git a/arch/h8300/include/asm/segment.h b/arch/h8300/include/asm/segment.h
new file mode 100644 (file)
index 0000000..b79a82d
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef _H8300_SEGMENT_H
+#define _H8300_SEGMENT_H
+
+/* define constants */
+#define USER_DATA     (1)
+#ifndef __USER_DS
+#define __USER_DS     (USER_DATA)
+#endif
+#define USER_PROGRAM  (2)
+#define SUPER_DATA    (3)
+#ifndef __KERNEL_DS
+#define __KERNEL_DS   (SUPER_DATA)
+#endif
+#define SUPER_PROGRAM (4)
+
+#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 /* _H8300_SEGMENT_H */
diff --git a/arch/h8300/include/asm/sh_bios.h b/arch/h8300/include/asm/sh_bios.h
new file mode 100644 (file)
index 0000000..b6bb6e5
--- /dev/null
@@ -0,0 +1,29 @@
+/* eCos HAL interface header */
+
+#ifndef SH_BIOS_H
+#define SH_BIOS_H
+
+#define HAL_IF_VECTOR_TABLE 0xfffe20
+#define CALL_IF_SET_CONSOLE_COMM  13
+#define QUERY_CURRENT -1
+#define MANGLER       -3
+
+/* Checking for GDB stub active */
+/* suggestion Jonathan Larmour */
+static int sh_bios_in_gdb_mode(void)
+{
+       static int gdb_active = -1;
+       if (gdb_active == -1) {
+               int (*set_console_comm)(int);
+               set_console_comm = ((void **)HAL_IF_VECTOR_TABLE)[CALL_IF_SET_CONSOLE_COMM];
+               gdb_active = (set_console_comm(QUERY_CURRENT) == MANGLER);
+       }
+       return gdb_active;
+}
+
+static void sh_bios_gdb_detach(void)
+{
+
+}
+
+#endif
diff --git a/arch/h8300/include/asm/shmparam.h b/arch/h8300/include/asm/shmparam.h
new file mode 100644 (file)
index 0000000..93f30de
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/shmparam.h>
diff --git a/arch/h8300/include/asm/signal.h b/arch/h8300/include/asm/signal.h
new file mode 100644 (file)
index 0000000..6341e36
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef _H8300_SIGNAL_H
+#define _H8300_SIGNAL_H
+
+#include <uapi/asm/signal.h>
+
+/* 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;
+
+#define __ARCH_HAS_SA_RESTORER
+
+#include <asm/sigcontext.h>
+#undef __HAVE_ARCH_SIG_BITOPS
+
+#endif /* _H8300_SIGNAL_H */
diff --git a/arch/h8300/include/asm/smp.h b/arch/h8300/include/asm/smp.h
new file mode 100644 (file)
index 0000000..9e9bd7e
--- /dev/null
@@ -0,0 +1 @@
+/* nothing required here yet */
diff --git a/arch/h8300/include/asm/spinlock.h b/arch/h8300/include/asm/spinlock.h
new file mode 100644 (file)
index 0000000..d5407fa
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __H8300_SPINLOCK_H
+#define __H8300_SPINLOCK_H
+
+#error "H8/300 doesn't do SMP yet"
+
+#endif
diff --git a/arch/h8300/include/asm/string.h b/arch/h8300/include/asm/string.h
new file mode 100644 (file)
index 0000000..ca50348
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef _H8300_STRING_H_
+#define _H8300_STRING_H_
+
+#ifdef __KERNEL__ /* only set these up for kernel code */
+
+#include <asm/setup.h>
+#include <asm/page.h>
+
+#define __HAVE_ARCH_MEMSET
+extern void * memset(void * s, int c, size_t count);
+
+#define __HAVE_ARCH_MEMCPY
+extern void * memcpy(void *d, const void *s, size_t count);
+
+#else /* KERNEL */
+
+/*
+ *     let user libraries deal with these,
+ *     IMHO the kernel has no place defining these functions for user apps
+ */
+
+#define __HAVE_ARCH_STRCPY 1
+#define __HAVE_ARCH_STRNCPY 1
+#define __HAVE_ARCH_STRCAT 1
+#define __HAVE_ARCH_STRNCAT 1
+#define __HAVE_ARCH_STRCMP 1
+#define __HAVE_ARCH_STRNCMP 1
+#define __HAVE_ARCH_STRNICMP 1
+#define __HAVE_ARCH_STRCHR 1
+#define __HAVE_ARCH_STRRCHR 1
+#define __HAVE_ARCH_STRSTR 1
+#define __HAVE_ARCH_STRLEN 1
+#define __HAVE_ARCH_STRNLEN 1
+#define __HAVE_ARCH_MEMSET 1
+#define __HAVE_ARCH_MEMCPY 1
+#define __HAVE_ARCH_MEMMOVE 1
+#define __HAVE_ARCH_MEMSCAN 1
+#define __HAVE_ARCH_MEMCMP 1
+#define __HAVE_ARCH_MEMCHR 1
+#define __HAVE_ARCH_STRTOK 1
+
+#endif /* KERNEL */
+
+#endif /* _M68K_STRING_H_ */
diff --git a/arch/h8300/include/asm/switch_to.h b/arch/h8300/include/asm/switch_to.h
new file mode 100644 (file)
index 0000000..6ae8261
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef _H8300_SWITCH_TO_H
+#define _H8300_SWITCH_TO_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.
+ */
+/*
+ * switch_to() saves the extra registers, that are not saved
+ * automatically by SAVE_SWITCH_STACK in resume(), ie. d0-d5 and
+ * a0-a1. Some of these are used by schedule() and its predecessors
+ * and so we might get see unexpected behaviors when a task returns
+ * with unexpected register values.
+ *
+ * syscall stores these registers itself and none of them are used
+ * by syscall after the function in the syscall has been called.
+ *
+ * Beware that resume now expects *next to be in d1 and the offset of
+ * tss to be in a1. This saves a few instructions as we no longer have
+ * to push them onto the stack and read them back right after.
+ *
+ * 02/17/96 - Jes Sorensen (jds@kom.auc.dk)
+ *
+ * Changed 96/09/19 by Andreas Schwab
+ * pass prev in a0, next in a1, offset of tss in d1, and whether
+ * the mm structures are shared in d2 (to avoid atc flushing).
+ *
+ * H8/300 Porting 2002/09/04 Yoshinori Sato
+ */
+
+asmlinkage void resume(void);
+#define switch_to(prev,next,last) \
+do {                         \
+  void *_last;                                             \
+  __asm__ __volatile__(                                            \
+                       "mov.l  %1, er0\n\t"                \
+                       "mov.l  %2, er1\n\t"                \
+                        "mov.l  %3, er2\n\t"                \
+                       "jsr @_resume\n\t"                  \
+                        "mov.l  er2,%0\n\t"                 \
+                      : "=r" (_last)                       \
+                      : "r" (&(prev->thread)),             \
+                        "r" (&(next->thread)),             \
+                         "g" (prev)                         \
+                      : "cc", "er0", "er1", "er2", "er3"); \
+  (last) = _last;                                          \
+} while(0)
+
+#endif /* _H8300_SWITCH_TO_H */
diff --git a/arch/h8300/include/asm/target_time.h b/arch/h8300/include/asm/target_time.h
new file mode 100644 (file)
index 0000000..9f2a9aa
--- /dev/null
@@ -0,0 +1,4 @@
+extern int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *));
+extern void platform_timer_eoi(void);
+extern void platform_gettod(unsigned int *year, unsigned int *mon, unsigned int *day, 
+                            unsigned int *hour, unsigned int *min, unsigned int *sec);
diff --git a/arch/h8300/include/asm/termios.h b/arch/h8300/include/asm/termios.h
new file mode 100644 (file)
index 0000000..280d78a
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/termios.h>
diff --git a/arch/h8300/include/asm/thread_info.h b/arch/h8300/include/asm/thread_info.h
new file mode 100644 (file)
index 0000000..ec2f777
--- /dev/null
@@ -0,0 +1,103 @@
+/* thread_info.h: h8300 low-level thread information
+ * adapted from the i386 and PPC versions by Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * Copyright (C) 2002  David Howells (dhowells@redhat.com)
+ * - Incorporating suggestions made by Linus Torvalds and Dave Miller
+ */
+
+#ifndef _ASM_THREAD_INFO_H
+#define _ASM_THREAD_INFO_H
+
+#include <asm/page.h>
+
+#ifdef __KERNEL__
+
+#ifndef __ASSEMBLY__
+
+/*
+ * low level task data.
+ * If you change this, change the TI_* offsets below to match.
+ */
+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 = INIT_PREEMPT_COUNT,    \
+       .restart_block  = {                     \
+               .fn = do_no_restart_syscall,    \
+       },                                      \
+}
+
+#define init_thread_info       (init_thread_union.thread_info)
+#define init_stack             (init_thread_union.stack)
+
+
+/*
+ * Size of kernel stack for each process. This must be a power of 2...
+ */
+#define THREAD_SIZE_ORDER      1
+#define THREAD_SIZE            8192    /* 2 pages */
+
+
+/* how to get the thread information struct from C */
+static inline struct thread_info *current_thread_info(void)
+{
+       struct thread_info *ti;
+       __asm__(
+               "mov.l  sp, %0 \n\t"
+               "and.l  %1, %0"
+               : "=&r"(ti)
+               : "i" (~(THREAD_SIZE-1))
+               );
+       return ti;
+}
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * Offsets in thread_info structure, used in assembly code
+ */
+#define TI_TASK                0
+#define TI_EXECDOMAIN  4
+#define TI_FLAGS       8
+#define TI_CPU         12
+#define TI_PRE_COUNT   16
+
+#define        PREEMPT_ACTIVE  0x4000000
+
+/*
+ * thread information flag bit numbers
+ */
+#define TIF_SYSCALL_TRACE      0       /* syscall trace active */
+#define TIF_SIGPENDING         1       /* signal pending */
+#define TIF_NEED_RESCHED       2       /* rescheduling necessary */
+#define TIF_MEMDIE             4       /* is terminating due to OOM killer */
+#define TIF_RESTORE_SIGMASK    5       /* restore signal mask in do_signal() */
+#define TIF_NOTIFY_RESUME      6       /* callback before returning to user */
+
+/* as above, but as bit values */
+#define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
+#define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
+#define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
+#define _TIF_NOTIFY_RESUME     (1 << TIF_NOTIFY_RESUME)
+
+#define _TIF_WORK_MASK         (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
+                                _TIF_NOTIFY_RESUME)
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_THREAD_INFO_H */
diff --git a/arch/h8300/include/asm/timer.h b/arch/h8300/include/asm/timer.h
new file mode 100644 (file)
index 0000000..b552d90
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef __H8300_TIMER_H
+#define __H8300_TIMER_H
+
+unsigned long get_cpu_clock(void);
+
+#define TIMER_FREQ get_cpu_clock() /* Timer input freq. */
+
+#define MODE_CS 0
+#define MODE_CED 1
+
+#define DIV_8 0
+#define DIV_64 1
+#define DIC_8192 2
+
+struct h8300_timer8_config {
+       int mode;
+       int div;
+       int rating;
+};
+
+struct h8300_timer16_config {
+       int rating;
+       __u8 enable;
+       __u8 imfa;
+       __u8 imiea;
+};
+
+struct h8300_tpu_config {
+       int rating;
+};
+#endif
diff --git a/arch/h8300/include/asm/timer16.h b/arch/h8300/include/asm/timer16.h
new file mode 100644 (file)
index 0000000..c10bcc2
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _ASM_H8300_TIMER16_H_
+#define _ASM_H8300_TIMER16_H_
+
+struct h8300_timer16_data {
+       __u32 common;
+       __u32 base;
+       __u8 irqs[3];
+       __u8 enable;
+       __u8 imfa;
+       __u8 imie;
+};
+
+#endif
diff --git a/arch/h8300/include/asm/timex.h b/arch/h8300/include/asm/timex.h
new file mode 100644 (file)
index 0000000..23e6701
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * linux/include/asm-h8300/timex.h
+ *
+ * H8/300 architecture timex specifications
+ */
+#ifndef _ASM_H8300_TIMEX_H
+#define _ASM_H8300_TIMEX_H
+
+#define CLOCK_TICK_RATE (CONFIG_CPU_CLOCK*1000/8192) /* Timer input freq. */
+
+typedef unsigned long cycles_t;
+extern short h8300_timer_count;
+
+static inline cycles_t get_cycles(void)
+{
+       return 0;
+}
+
+#endif
diff --git a/arch/h8300/include/asm/tlb.h b/arch/h8300/include/asm/tlb.h
new file mode 100644 (file)
index 0000000..7f07430
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef __H8300_TLB_H__
+#define __H8300_TLB_H__
+
+#define tlb_flush(tlb) do { } while(0)
+
+#include <asm-generic/tlb.h>
+
+#endif
diff --git a/arch/h8300/include/asm/tlbflush.h b/arch/h8300/include/asm/tlbflush.h
new file mode 100644 (file)
index 0000000..f1a06c0
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/tlbflush.h>
diff --git a/arch/h8300/include/asm/topology.h b/arch/h8300/include/asm/topology.h
new file mode 100644 (file)
index 0000000..fdc1219
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _ASM_H8300_TOPOLOGY_H
+#define _ASM_H8300_TOPOLOGY_H
+
+#include <asm-generic/topology.h>
+
+#endif /* _ASM_H8300_TOPOLOGY_H */
diff --git a/arch/h8300/include/asm/traps.h b/arch/h8300/include/asm/traps.h
new file mode 100644 (file)
index 0000000..460d5e6
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ *  linux/include/asm-h8300/traps.h
+ *
+ *  Copyright (C) 2003 Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * 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.
+ */
+
+#ifndef _H8300_TRAPS_H
+#define _H8300_TRAPS_H
+
+extern void _system_call(void);
+extern void _interrupt_entry(void);
+extern void _trace_break(void);
+extern void _nmi(void);
+
+#define JMP_OP 0x5a000000
+#define JSR_OP 0x5e000000
+#define VECTOR(address) ((JMP_OP)|((unsigned long)address))
+#define REDIRECT(address) ((JSR_OP)|((unsigned long)address))
+
+#define TRACE_VEC 5
+
+#define TRAP0_VEC 8
+#define TRAP1_VEC 9
+#define TRAP2_VEC 10
+#define TRAP3_VEC 11
+
+#endif /* _H8300_TRAPS_H */
diff --git a/arch/h8300/include/asm/types.h b/arch/h8300/include/asm/types.h
new file mode 100644 (file)
index 0000000..b9e79bc
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/types.h>
diff --git a/arch/h8300/include/asm/uaccess.h b/arch/h8300/include/asm/uaccess.h
new file mode 100644 (file)
index 0000000..e6f9c3f
--- /dev/null
@@ -0,0 +1,137 @@
+#ifndef __H8300_UACCESS_H
+#define __H8300_UACCESS_H
+
+/*
+ * User space memory access functions
+ */
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+
+#include <asm/segment.h>
+
+#define VERIFY_READ    0
+#define VERIFY_WRITE   1
+
+/* We let the MMU do all checking */
+#define access_ok(type, addr, size) __access_ok((unsigned long)addr,size)
+static inline int __access_ok(unsigned long addr, unsigned long size)
+{
+#define        RANGE_CHECK_OK(addr, size, lower, upper) \
+       (((addr) >= (lower)) && (((addr) + (size)) < (upper)))
+
+       extern unsigned long  _ramend;
+       return(RANGE_CHECK_OK(addr, size, 0L, (unsigned long)&_ramend));
+}
+
+/*
+ * 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.
+ */
+
+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:                                            \
+       *(ptr) = (__pu_val);                            \
+       break;                                          \
+    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))
+
+/*
+ * 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 get_user(x, ptr)                                       \
+({                                                             \
+    unsigned long long __gu_val;                               \
+    int __gu_err = 0;                                          \
+    switch (sizeof(*(ptr))) {                                  \
+    case 1:                                                    \
+             __gu_val = *((u8 *)(ptr));                        \
+             break;                                            \
+    case 2:                                                    \
+             __gu_val = *((u16 *)ptr);                         \
+             break;                                            \
+    case 4:                                                    \
+             __gu_val = *((u32 *)ptr);                         \
+             break;                                            \
+    case 8:                                                    \
+             memcpy((void *)&__gu_val, ptr, sizeof(*(ptr)));   \
+             break;                                            \
+    default:                                                   \
+       __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; })
+
+unsigned long clear_user(void __user *addr, unsigned long size);
+#define strncpy_from_user(s, d, n) strncpy(s, d, n)
+#define strnlen_user(s, n) strnlen(s, n)
+
+#define __clear_user   clear_user
+
+#endif /* _H8300_UACCESS_H */
diff --git a/arch/h8300/include/asm/ucontext.h b/arch/h8300/include/asm/ucontext.h
new file mode 100644 (file)
index 0000000..9bc07b9
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/ucontext.h>
diff --git a/arch/h8300/include/asm/unaligned.h b/arch/h8300/include/asm/unaligned.h
new file mode 100644 (file)
index 0000000..b8d06c7
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _ASM_H8300_UNALIGNED_H
+#define _ASM_H8300_UNALIGNED_H
+
+#include <linux/unaligned/be_memmove.h>
+#include <linux/unaligned/le_byteshift.h>
+#include <linux/unaligned/generic.h>
+
+#define get_unaligned  __get_unaligned_be
+#define put_unaligned  __put_unaligned_be
+
+#endif /* _ASM_H8300_UNALIGNED_H */
diff --git a/arch/h8300/include/asm/unistd.h b/arch/h8300/include/asm/unistd.h
new file mode 100644 (file)
index 0000000..3d1fe8c
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef _ASM_H8300_UNISTD_H_
+#define _ASM_H8300_UNISTD_H_
+
+#include <uapi/asm/unistd.h>
+
+#define NR_syscalls 347
+
+#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_IPC
+#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_OLD_MMAP
+#define __ARCH_WANT_SYS_OLD_SELECT
+#define __ARCH_WANT_SYS_OLDUMOUNT
+#define __ARCH_WANT_SYS_SIGPENDING
+#define __ARCH_WANT_SYS_SIGPROCMASK
+#define __ARCH_WANT_SYS_FORK
+#define __ARCH_WANT_SYS_VFORK
+#define __ARCH_WANT_SYS_CLONE
+
+#endif /* _ASM_H8300_UNISTD_H_ */
diff --git a/arch/h8300/include/asm/user.h b/arch/h8300/include/asm/user.h
new file mode 100644 (file)
index 0000000..14a9e18
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _H8300_USER_H
+#define _H8300_USER_H
+
+#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.
+*/
+
+/* This is the old layout of "struct pt_regs" as of Linux 1.x, and
+   is still the layout used by user (the new pt_regs doesn't have
+   all registers). */
+struct user_regs_struct {
+       long er1,er2,er3,er4,er5,er6;
+       long er0;
+       long usp;
+       long orig_er0;
+       short ccr;
+       long pc;
+};
+
+       
+/* 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.... */
+/* 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 */
+  unsigned long u_ar0;         /* Used by gdb to help find the values for */
+                               /* the registers. */
+  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/arch/h8300/include/uapi/asm/Kbuild b/arch/h8300/include/uapi/asm/Kbuild
new file mode 100644 (file)
index 0000000..040178c
--- /dev/null
@@ -0,0 +1,34 @@
+# UAPI Header export list
+include include/uapi/asm-generic/Kbuild.asm
+
+header-y += auxvec.h
+header-y += bitsperlong.h
+header-y += byteorder.h
+header-y += errno.h
+header-y += fcntl.h
+header-y += ioctl.h
+header-y += ioctls.h
+header-y += ipcbuf.h
+header-y += kvm_para.h
+header-y += mman.h
+header-y += msgbuf.h
+header-y += param.h
+header-y += poll.h
+header-y += posix_types.h
+header-y += ptrace.h
+header-y += resource.h
+header-y += sembuf.h
+header-y += setup.h
+header-y += shmbuf.h
+header-y += sigcontext.h
+header-y += siginfo.h
+header-y += signal.h
+header-y += socket.h
+header-y += sockios.h
+header-y += stat.h
+header-y += statfs.h
+header-y += swab.h
+header-y += termbits.h
+header-y += termios.h
+header-y += types.h
+header-y += unistd.h
diff --git a/arch/h8300/include/uapi/asm/auxvec.h b/arch/h8300/include/uapi/asm/auxvec.h
new file mode 100644 (file)
index 0000000..1d36fe3
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef __ASMH8300_AUXVEC_H
+#define __ASMH8300_AUXVEC_H
+
+#endif
diff --git a/arch/h8300/include/uapi/asm/bitsperlong.h b/arch/h8300/include/uapi/asm/bitsperlong.h
new file mode 100644 (file)
index 0000000..6dc0bb0
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/bitsperlong.h>
diff --git a/arch/h8300/include/uapi/asm/byteorder.h b/arch/h8300/include/uapi/asm/byteorder.h
new file mode 100644 (file)
index 0000000..13539da
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _H8300_BYTEORDER_H
+#define _H8300_BYTEORDER_H
+
+#include <linux/byteorder/big_endian.h>
+
+#endif /* _H8300_BYTEORDER_H */
diff --git a/arch/h8300/include/uapi/asm/errno.h b/arch/h8300/include/uapi/asm/errno.h
new file mode 100644 (file)
index 0000000..0c2f564
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _H8300_ERRNO_H
+#define _H8300_ERRNO_H
+
+#include <asm-generic/errno.h>
+
+#endif /* _H8300_ERRNO_H */
diff --git a/arch/h8300/include/uapi/asm/fcntl.h b/arch/h8300/include/uapi/asm/fcntl.h
new file mode 100644 (file)
index 0000000..1952cb2
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _H8300_FCNTL_H
+#define _H8300_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 /* _H8300_FCNTL_H */
diff --git a/arch/h8300/include/uapi/asm/ioctl.h b/arch/h8300/include/uapi/asm/ioctl.h
new file mode 100644 (file)
index 0000000..b279fe0
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/ioctl.h>
diff --git a/arch/h8300/include/uapi/asm/ioctls.h b/arch/h8300/include/uapi/asm/ioctls.h
new file mode 100644 (file)
index 0000000..ec34c76
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/ioctls.h>
diff --git a/arch/h8300/include/uapi/asm/ipcbuf.h b/arch/h8300/include/uapi/asm/ipcbuf.h
new file mode 100644 (file)
index 0000000..84c7e51
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/ipcbuf.h>
diff --git a/arch/h8300/include/uapi/asm/kvm_para.h b/arch/h8300/include/uapi/asm/kvm_para.h
new file mode 100644 (file)
index 0000000..14fab8f
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/kvm_para.h>
diff --git a/arch/h8300/include/uapi/asm/mman.h b/arch/h8300/include/uapi/asm/mman.h
new file mode 100644 (file)
index 0000000..8eebf89
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/mman.h>
diff --git a/arch/h8300/include/uapi/asm/msgbuf.h b/arch/h8300/include/uapi/asm/msgbuf.h
new file mode 100644 (file)
index 0000000..809134c
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/msgbuf.h>
diff --git a/arch/h8300/include/uapi/asm/param.h b/arch/h8300/include/uapi/asm/param.h
new file mode 100644 (file)
index 0000000..3dd18ae
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _UAPI_H8300_PARAM_H
+#define _UAPI_H8300_PARAM_H
+
+#ifndef __KERNEL__
+#define HZ             100
+#endif
+
+#define EXEC_PAGESIZE  4096
+
+#ifndef NOGROUP
+#define NOGROUP                (-1)
+#endif
+
+#define MAXHOSTNAMELEN 64      /* max length of hostname */
+
+#endif /* _UAPI_H8300_PARAM_H */
diff --git a/arch/h8300/include/uapi/asm/poll.h b/arch/h8300/include/uapi/asm/poll.h
new file mode 100644 (file)
index 0000000..f61540c
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __H8300_POLL_H
+#define __H8300_POLL_H
+
+#define POLLWRNORM     POLLOUT
+#define POLLWRBAND     256
+
+#include <asm-generic/poll.h>
+
+#undef POLLREMOVE
+
+#endif
diff --git a/arch/h8300/include/uapi/asm/posix_types.h b/arch/h8300/include/uapi/asm/posix_types.h
new file mode 100644 (file)
index 0000000..22cae62
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/posix_types.h>
diff --git a/arch/h8300/include/uapi/asm/ptrace.h b/arch/h8300/include/uapi/asm/ptrace.h
new file mode 100644 (file)
index 0000000..ef39ec5
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef _UAPI_H8300_PTRACE_H
+#define _UAPI_H8300_PTRACE_H
+
+#ifndef __ASSEMBLY__
+
+#define PT_ER1    0
+#define PT_ER2    1
+#define PT_ER3    2
+#define PT_ER4    3
+#define PT_ER5    4
+#define PT_ER6    5
+#define PT_ER0    6
+#define PT_ORIG_ER0       7
+#define PT_CCR    8
+#define PT_PC     9
+#define PT_USP    10
+#define PT_EXR     12
+
+/* this struct defines the way the registers are stored on the
+   stack during a system call. */
+
+struct pt_regs {
+       long     retpc;
+       long     er4;
+       long     er5;
+       long     er6;
+       long     er3;
+       long     er2;
+       long     er1;
+       long     orig_er0;
+       unsigned short ccr;
+       long     er0;
+       long     vector;
+#if defined(CONFIG_CPU_H8S)
+       unsigned short exr;
+#endif
+       unsigned long  pc;
+} __attribute__((aligned(2),packed));
+
+#define PTRACE_GETREGS            12
+#define PTRACE_SETREGS            13
+
+#endif /* __ASSEMBLY__ */
+#endif /* _UAPI_H8300_PTRACE_H */
diff --git a/arch/h8300/include/uapi/asm/resource.h b/arch/h8300/include/uapi/asm/resource.h
new file mode 100644 (file)
index 0000000..46c5f43
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _H8300_RESOURCE_H
+#define _H8300_RESOURCE_H
+
+#include <asm-generic/resource.h>
+
+#endif /* _H8300_RESOURCE_H */
diff --git a/arch/h8300/include/uapi/asm/sembuf.h b/arch/h8300/include/uapi/asm/sembuf.h
new file mode 100644 (file)
index 0000000..7673b83
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/sembuf.h>
diff --git a/arch/h8300/include/uapi/asm/setup.h b/arch/h8300/include/uapi/asm/setup.h
new file mode 100644 (file)
index 0000000..e2c600e
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __H8300_SETUP_H
+#define __H8300_SETUP_H
+
+#define COMMAND_LINE_SIZE      512
+
+#endif
diff --git a/arch/h8300/include/uapi/asm/shmbuf.h b/arch/h8300/include/uapi/asm/shmbuf.h
new file mode 100644 (file)
index 0000000..a39cb7e
--- /dev/null
@@ -0,0 +1,2 @@
+#include <asm-generic/shmbuf.h>
+
diff --git a/arch/h8300/include/uapi/asm/sigcontext.h b/arch/h8300/include/uapi/asm/sigcontext.h
new file mode 100644 (file)
index 0000000..e4b8150
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef _ASM_H8300_SIGCONTEXT_H
+#define _ASM_H8300_SIGCONTEXT_H
+
+struct sigcontext {
+       unsigned long  sc_mask;         /* old sigmask */
+       unsigned long  sc_usp;          /* old user stack pointer */
+       unsigned long  sc_er0;
+       unsigned long  sc_er1;
+       unsigned long  sc_er2;
+       unsigned long  sc_er3;
+       unsigned long  sc_er4;
+       unsigned long  sc_er5;
+       unsigned long  sc_er6;
+       unsigned short sc_ccr;
+       unsigned long  sc_pc;
+};
+
+#endif
diff --git a/arch/h8300/include/uapi/asm/siginfo.h b/arch/h8300/include/uapi/asm/siginfo.h
new file mode 100644 (file)
index 0000000..bc8fbea
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _H8300_SIGINFO_H
+#define _H8300_SIGINFO_H
+
+#include <asm-generic/siginfo.h>
+
+#endif
diff --git a/arch/h8300/include/uapi/asm/signal.h b/arch/h8300/include/uapi/asm/signal.h
new file mode 100644 (file)
index 0000000..af3a6c3
--- /dev/null
@@ -0,0 +1,115 @@
+#ifndef _UAPI_H8300_SIGNAL_H
+#define _UAPI_H8300_SIGNAL_H
+
+#include <linux/types.h>
+
+/* Avoid too many header ordering problems.  */
+struct siginfo;
+
+#ifndef __KERNEL__
+/* 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
+
+#define SA_RESTORER    0x04000000
+
+#define MINSIGSTKSZ    2048
+#define SIGSTKSZ       8192
+
+#include <asm-generic/signal-defs.h>
+
+#ifndef __KERNEL__
+/* 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;
+
+
+#endif /* _UAPI_H8300_SIGNAL_H */
diff --git a/arch/h8300/include/uapi/asm/socket.h b/arch/h8300/include/uapi/asm/socket.h
new file mode 100644 (file)
index 0000000..6b71384
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/socket.h>
diff --git a/arch/h8300/include/uapi/asm/sockios.h b/arch/h8300/include/uapi/asm/sockios.h
new file mode 100644 (file)
index 0000000..def6d47
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/sockios.h>
diff --git a/arch/h8300/include/uapi/asm/stat.h b/arch/h8300/include/uapi/asm/stat.h
new file mode 100644 (file)
index 0000000..489e182
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _H8300_STAT_H
+#define _H8300_STAT_H
+
+#include <asm-generic/stat.h>
+
+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;
+};
+
+#endif /* _H8300_STAT_H */
diff --git a/arch/h8300/include/uapi/asm/statfs.h b/arch/h8300/include/uapi/asm/statfs.h
new file mode 100644 (file)
index 0000000..b96efa7
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _H8300_STATFS_H
+#define _H8300_STATFS_H
+
+#include <asm-generic/statfs.h>
+
+#endif /* _H8300_STATFS_H */
diff --git a/arch/h8300/include/uapi/asm/swab.h b/arch/h8300/include/uapi/asm/swab.h
new file mode 100644 (file)
index 0000000..7847e56
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/swab.h>
diff --git a/arch/h8300/include/uapi/asm/termbits.h b/arch/h8300/include/uapi/asm/termbits.h
new file mode 100644 (file)
index 0000000..3935b10
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/termbits.h>
diff --git a/arch/h8300/include/uapi/asm/termios.h b/arch/h8300/include/uapi/asm/termios.h
new file mode 100644 (file)
index 0000000..5a67d7e
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef _UAPI_H8300_TERMIOS_H
+#define _UAPI_H8300_TERMIOS_H
+
+#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 */
+};
+
+
+/* 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 */
+
+
+#endif /* _UAPI_H8300_TERMIOS_H */
diff --git a/arch/h8300/include/uapi/asm/types.h b/arch/h8300/include/uapi/asm/types.h
new file mode 100644 (file)
index 0000000..9ec9d4c
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/int-ll64.h>
diff --git a/arch/h8300/include/uapi/asm/unistd.h b/arch/h8300/include/uapi/asm/unistd.h
new file mode 100644 (file)
index 0000000..8cb5d42
--- /dev/null
@@ -0,0 +1,330 @@
+#ifndef _UAPI_ASM_H8300_UNISTD_H_
+#define _UAPI_ASM_H8300_UNISTD_H_
+
+/*
+ * This file contains the system call numbers.
+ */
+
+#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_lchown             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
+#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
+#define __NR_vhangup           111
+#define __NR_idle              112
+#define __NR_vm86old           113
+#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_modify_ldt                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
+#define __NR_msync             144
+#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_vm86              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_pread64           180
+#define __NR_pwrite64          181
+#define __NR_chown             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_lchown32          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_chown32           212
+#define __NR_setuid32          213
+#define __NR_setgid32          214
+#define __NR_setfsuid32                215
+#define __NR_setfsgid32                216
+#define __NR_pivot_root                217
+#define __NR_mincore           218
+#define __NR_madvise           219
+#define __NR_madvise1          219
+#define __NR_getdents64                220
+#define __NR_fcntl64           221
+/* 223 is unused */
+#define __NR_gettid            224
+#define __NR_readahead         225
+#define __NR_setxattr          226
+#define __NR_lsetxattr         227
+#define __NR_fsetxattr         228
+#define __NR_getxattr          229
+#define __NR_lgetxattr         230
+#define __NR_fgetxattr         231
+#define __NR_listxattr         232
+#define __NR_llistxattr                233
+#define __NR_flistxattr                234
+#define __NR_removexattr       235
+#define __NR_lremovexattr      236
+#define __NR_fremovexattr      237
+#define __NR_tkill             238
+#define __NR_sendfile64                239
+#define __NR_futex             240
+#define __NR_sched_setaffinity 241
+#define __NR_sched_getaffinity 242
+#define __NR_set_thread_area   243
+#define __NR_get_thread_area   244
+#define __NR_io_setup          245
+#define __NR_io_destroy                246
+#define __NR_io_getevents      247
+#define __NR_io_submit         248
+#define __NR_io_cancel         249
+#define __NR_fadvise64         250
+/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */
+#define __NR_exit_group                252
+#define __NR_lookup_dcookie    253
+#define __NR_epoll_create      254
+#define __NR_epoll_ctl         255
+#define __NR_epoll_wait                256
+#define __NR_remap_file_pages  257
+#define __NR_set_tid_address   258
+#define __NR_timer_create      259
+#define __NR_timer_settime     (__NR_timer_create+1)
+#define __NR_timer_gettime     (__NR_timer_create+2)
+#define __NR_timer_getoverrun  (__NR_timer_create+3)
+#define __NR_timer_delete      (__NR_timer_create+4)
+#define __NR_clock_settime     (__NR_timer_create+5)
+#define __NR_clock_gettime     (__NR_timer_create+6)
+#define __NR_clock_getres      (__NR_timer_create+7)
+#define __NR_clock_nanosleep   (__NR_timer_create+8)
+#define __NR_statfs64          268
+#define __NR_fstatfs64         269
+#define __NR_tgkill            270
+#define __NR_utimes            271
+#define __NR_fadvise64_64      272
+#define __NR_vserver           273
+#define __NR_mbind             274
+#define __NR_get_mempolicy     275
+#define __NR_set_mempolicy     276
+#define __NR_mq_open           277
+#define __NR_mq_unlink         (__NR_mq_open+1)
+#define __NR_mq_timedsend      (__NR_mq_open+2)
+#define __NR_mq_timedreceive   (__NR_mq_open+3)
+#define __NR_mq_notify         (__NR_mq_open+4)
+#define __NR_mq_getsetattr     (__NR_mq_open+5)
+#define __NR_kexec_load                283
+#define __NR_waitid            284
+/* #define __NR_sys_setaltroot 285 */
+#define __NR_add_key           286
+#define __NR_request_key       287
+#define __NR_keyctl            288
+#define __NR_ioprio_set                289
+#define __NR_ioprio_get                290
+#define __NR_inotify_init      291
+#define __NR_inotify_add_watch 292
+#define __NR_inotify_rm_watch  293
+#define __NR_migrate_pages     294
+#define __NR_openat            295
+#define __NR_mkdirat           296
+#define __NR_mknodat           297
+#define __NR_fchownat          298
+#define __NR_futimesat         299
+#define __NR_fstatat64         300
+#define __NR_unlinkat          301
+#define __NR_renameat          302
+#define __NR_linkat            303
+#define __NR_symlinkat         304
+#define __NR_readlinkat                305
+#define __NR_fchmodat          306
+#define __NR_faccessat         307
+#define __NR_pselect6          308
+#define __NR_ppoll             309
+#define __NR_unshare           310
+#define __NR_set_robust_list   311
+#define __NR_get_robust_list   312
+#define __NR_splice            313
+#define __NR_sync_file_range   314
+#define __NR_tee               315
+#define __NR_vmsplice          316
+#define __NR_move_pages                317
+#define __NR_getcpu            318
+#define __NR_epoll_pwait       319
+#define __NR_setns             320
+
+#endif /* _UAPI_ASM_H8300_UNISTD_H_ */
diff --git a/arch/h8300/kernel/Makefile b/arch/h8300/kernel/Makefile
new file mode 100644 (file)
index 0000000..a26fcaf
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# Makefile for the linux kernel.
+#
+
+extra-y := vmlinux.lds
+
+obj-y := process.o traps.o ptrace.o \
+        sys_h8300.o time.o signal.o \
+         setup.o syscalls.o irq.o \
+        entry.o timer/
+
+obj-$(CONFIG_ROMKERNEL) += head_rom.o
+obj-$(CONFIG_RAMKERNEL) += head_ram.o
+obj-$(CONFIG_CPU_H8300H) += ptrace_h.o irq_h.o
+obj-$(CONFIG_CPU_H8S) += ptrace_s.o irq_s.o
+
+obj-$(CONFIG_MODULES) += module.o h8300_ksyms.o 
+obj-$(CONFIG_H8300H_SIM) += sim-console.o
+obj-$(CONFIG_H8S_SIM) += sim-console.o
+
+obj-$(CONFIG_H83069) += cpu/h83069/
+obj-$(CONFIG_H8S2678) += cpu/h8s2678/
+
diff --git a/arch/h8300/kernel/asm-offsets.c b/arch/h8300/kernel/asm-offsets.c
new file mode 100644 (file)
index 0000000..0491fb0
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * 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 <linux/hardirq.h>
+#include <linux/kbuild.h>
+#include <asm/irq.h>
+#include <asm/ptrace.h>
+
+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 irq_cpustat_t struct */
+       DEFINE(CPUSTAT_SOFTIRQ_PENDING, offsetof(irq_cpustat_t, __softirq_pending));
+
+       /* offsets into the thread struct */
+       DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
+       DEFINE(THREAD_USP, offsetof(struct thread_struct, usp));
+       DEFINE(THREAD_CCR, offsetof(struct thread_struct, ccr));
+
+       /* offsets into the pt_regs struct */
+       DEFINE(LER0,  offsetof(struct pt_regs, er0)      - sizeof(long));
+       DEFINE(LER1,  offsetof(struct pt_regs, er1)      - sizeof(long));
+       DEFINE(LER2,  offsetof(struct pt_regs, er2)      - sizeof(long));
+       DEFINE(LER3,  offsetof(struct pt_regs, er3)      - sizeof(long));
+       DEFINE(LER4,  offsetof(struct pt_regs, er4)      - sizeof(long));
+       DEFINE(LER5,  offsetof(struct pt_regs, er5)      - sizeof(long));
+       DEFINE(LER6,  offsetof(struct pt_regs, er6)      - sizeof(long));
+       DEFINE(LORIG, offsetof(struct pt_regs, orig_er0) - sizeof(long));
+       DEFINE(LCCR,  offsetof(struct pt_regs, ccr)      - sizeof(long));
+       DEFINE(LVEC,  offsetof(struct pt_regs, vector)   - sizeof(long));
+#if defined(__H8300S__)
+       DEFINE(LEXR,  offsetof(struct pt_regs, exr)      - sizeof(long));
+#endif
+       DEFINE(LRET,  offsetof(struct pt_regs, pc)       - sizeof(long));
+
+       DEFINE(PT_PTRACED, PT_PTRACED);
+
+       return 0;
+}
diff --git a/arch/h8300/kernel/cpu/h83069/Makefile b/arch/h8300/kernel/cpu/h83069/Makefile
new file mode 100644 (file)
index 0000000..49d283e
--- /dev/null
@@ -0,0 +1 @@
+obj-y = setup.o
diff --git a/arch/h8300/kernel/cpu/h83069/setup.c b/arch/h8300/kernel/cpu/h83069/setup.c
new file mode 100644 (file)
index 0000000..6586ecc
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * H8/3069 Internal peripheral setup
+ *
+ *  Copyright (C) 2009  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * 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/platform_device.h>
+#include <linux/serial_sci.h>
+#include <asm/timer.h>
+
+static struct plat_sci_port sci_platform_data0 = {
+       .mapbase        = 0xffffb0,
+       .flags          = UPF_BOOT_AUTOCONF,
+       .scscr          = SCSCR_RE | SCSCR_TE,
+       .scbrr_algo_id  = SCBRR_ALGO_5,
+       .type           = PORT_SCI,
+       .irqs           = { 52, 53, 54, 0 },
+};
+
+static struct plat_sci_port sci_platform_data1 = {
+       .mapbase        = 0xffffb8,
+       .flags          = UPF_BOOT_AUTOCONF,
+       .scscr          = SCSCR_RE | SCSCR_TE,
+       .scbrr_algo_id  = SCBRR_ALGO_5,
+       .type           = PORT_SCI,
+       .irqs           = { 56, 57, 58, 0 },
+};
+
+static struct platform_device sci0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &sci_platform_data0,
+       },
+};
+
+static struct platform_device sci1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &sci_platform_data1,
+       },
+};
+
+static struct h8300_timer8_config timer8_platform_data = {
+       .mode   = MODE_CS,
+       .div    = DIV_64,
+       .rating = 200,
+};
+
+static struct resource tm8_unit0_resources[] = {
+       [0] = {
+               .name   = "8bit timer 0",
+               .start  = 0xffff80,
+               .end    = 0xffff89,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 36,
+               .end    = 43,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device tm8_unit0_device = {
+       .name           = "h8300_8timer",
+       .id             = 0,
+       .dev = {
+               .platform_data  = &timer8_platform_data,
+       },
+       .resource       = tm8_unit0_resources,
+       .num_resources  = ARRAY_SIZE(tm8_unit0_resources),
+};
+
+static struct resource tm8_unit1_resources[] = {
+       [0] = {
+               .name   = "8bit timer 1",
+               .start  = 0xffff90,
+               .end    = 0xffff99,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 44,
+               .end    = 51,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device tm8_unit1_device = {
+       .name           = "h8300_8timer",
+       .id             = 1,
+       .dev = {
+               .platform_data  = &timer8_platform_data,
+       },
+       .resource       = tm8_unit1_resources,
+       .num_resources  = ARRAY_SIZE(tm8_unit1_resources),
+};
+
+
+static struct h8300_timer16_config timer16data0 = {
+       .rating = 200,
+       .enable = 0,
+       .imfa   = 0,
+       .imiea  = 4,
+};
+
+static struct h8300_timer16_config timer16data1 = {
+       .rating = 200,
+       .enable = 1,
+       .imfa   = 1,
+       .imiea  = 5,
+};
+
+static struct h8300_timer16_config timer16data2 = {
+       .rating = 200,
+       .enable = 2,
+       .imfa   = 2,
+       .imiea  = 6,
+};
+
+static struct resource tm16ch0_resources[] = {
+       [0] = {
+               .name   = "16bit timer 0",
+               .start  = 0xffff68,
+               .end    = 0xffff6f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 0xffff60,
+               .end    = 0xffff66,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 24,
+               .end    = 26,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct resource tm16ch1_resources[] = {
+       [0] = {
+               .name   = "16bit timer 1",
+               .start  = 0xffff70,
+               .end    = 0xffff77,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 0xffff60,
+               .end    = 0xffff66,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 28,
+               .end    = 30,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct resource tm16ch2_resources[] = {
+       [0] = {
+               .name   = "16bit timer 2",
+               .start  = 0xffff78,
+               .end    = 0xffff7f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 0xffff60,
+               .end    = 0xffff66,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 32,
+               .end    = 34,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device timer16_ch0_device = {
+       .name   = "h8300h-16timer",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &timer16data0,
+       },
+       .resource       = tm16ch0_resources,
+       .num_resources  = ARRAY_SIZE(tm16ch0_resources),
+};
+
+static struct platform_device timer16_ch1_device = {
+       .name   = "h8300h-16timer",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &timer16data1,
+       },
+       .resource       = tm16ch1_resources,
+       .num_resources  = ARRAY_SIZE(tm16ch1_resources),
+};
+
+static struct platform_device timer16_ch2_device = {
+       .name   = "h8300h-16timer",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &timer16data2,
+       },
+       .resource       = tm16ch2_resources,
+       .num_resources  = ARRAY_SIZE(tm16ch2_resources),
+};
+
+static struct platform_device *devices[] __initdata = {
+       &tm8_unit0_device,
+       &tm8_unit1_device,
+       &timer16_ch0_device,
+       &timer16_ch1_device,
+       &timer16_ch2_device,
+       &sci0_device,
+       &sci1_device,
+};
+
+static struct platform_device *early_devices[] __initdata = {
+       &timer16_ch0_device,
+       &timer16_ch1_device,
+       &timer16_ch2_device,
+       &sci0_device,
+       &sci1_device,
+};
+
+static int __init devices_register(void)
+{
+       return platform_add_devices(devices,
+                                   ARRAY_SIZE(devices));
+}
+
+arch_initcall(devices_register);
+
+void __init early_device_register(void)
+{
+       early_platform_add_devices(early_devices,
+                                  ARRAY_SIZE(devices));
+}
diff --git a/arch/h8300/kernel/cpu/h8s2678/Makefile b/arch/h8300/kernel/cpu/h8s2678/Makefile
new file mode 100644 (file)
index 0000000..49d283e
--- /dev/null
@@ -0,0 +1 @@
+obj-y = setup.o
diff --git a/arch/h8300/kernel/cpu/h8s2678/setup.c b/arch/h8300/kernel/cpu/h8s2678/setup.c
new file mode 100644 (file)
index 0000000..34c6b47
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * H8S2678 Internal peripheral setup
+ *
+ *  Copyright (C) 2014  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * 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/platform_device.h>
+#include <linux/serial_sci.h>
+#include <asm/timer.h>
+
+static struct plat_sci_port sci_platform_data0 = {
+       .mapbase        = 0xffff78,
+       .flags          = UPF_BOOT_AUTOCONF,
+       .scscr          = SCSCR_RE | SCSCR_TE,
+       .scbrr_algo_id  = SCBRR_ALGO_5,
+       .type           = PORT_SCI,
+       .irqs           = { 88, 89, 90, 0 },
+};
+
+static struct plat_sci_port sci_platform_data1 = {
+       .mapbase        = 0xffff80,
+       .flags          = UPF_BOOT_AUTOCONF,
+       .scscr          = SCSCR_RE | SCSCR_TE,
+       .scbrr_algo_id  = SCBRR_ALGO_5,
+       .type           = PORT_SCI,
+       .irqs           = { 92, 93, 94, 0 },
+};
+
+static struct plat_sci_port sci_platform_data2 = {
+       .mapbase        = 0xffff88,
+       .flags          = UPF_BOOT_AUTOCONF,
+       .scscr          = SCSCR_RE | SCSCR_TE,
+       .scbrr_algo_id  = SCBRR_ALGO_5,
+       .type           = PORT_SCI,
+       .irqs           = { 96, 97, 98, 0 },
+};
+
+static struct platform_device sci0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &sci_platform_data0,
+       },
+};
+
+static struct platform_device sci1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &sci_platform_data1,
+       },
+};
+
+static struct platform_device sci2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &sci_platform_data2,
+       },
+};
+
+static struct h8300_timer8_config timer8_platform_data = {
+       .mode   = MODE_CED,
+       .div    = DIV_8,
+       .rating = 200,
+};
+
+static struct resource tm8_unit0_resources[] = {
+       [0] = {
+               .name   = "8bit timer 0",
+               .start  = 0xffffb0,
+               .end    = 0xffffb9,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 72,
+               .end    = 79,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device tm8_unit0_device = {
+       .name           = "h8300_8timer",
+       .id             = 0,
+       .dev = {
+               .platform_data  = &timer8_platform_data,
+       },
+       .resource       = tm8_unit0_resources,
+       .num_resources  = ARRAY_SIZE(tm8_unit0_resources),
+};
+
+static struct h8300_tpu_config tpu12data = {
+       .rating = 200,
+};
+
+static struct h8300_tpu_config tpu45data = {
+       .rating = 200,
+};
+
+static struct resource tpu12_resources[] = {
+       [0] = {
+               .name   = "tpu ch1-2",
+               .start  = 0xffffe0,
+               .end    = 0xffffef,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 0xfffff0,
+               .end    = 0xfffffb,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct resource tpu45_resources[] = {
+       [0] = {
+               .name   = "tpu ch4-5",
+               .start  = 0xfffe90,
+               .end    = 0xfffe9f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 0xfffea0,
+               .end    = 0xfffeab,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device tpu12_device = {
+       .name   = "h8s tpu",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &tpu12data,
+       },
+       .resource       = tpu12_resources,
+       .num_resources  = ARRAY_SIZE(tpu12_resources),
+};
+
+static struct platform_device tpu45_device = {
+       .name   = "h8s tpu",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &tpu45data,
+       },
+       .resource       = tpu45_resources,
+       .num_resources  = ARRAY_SIZE(tpu45_resources),
+};
+
+static struct platform_device *devices[] __initdata = {
+       &tm8_unit0_device,
+       &tpu12_device,
+       &tpu45_device,
+       &sci0_device,
+       &sci1_device,
+       &sci2_device,
+};
+
+static struct platform_device *early_devices[] __initdata = {
+       &tm8_unit0_device,
+       &sci0_device,
+       &sci1_device,
+       &sci2_device,
+};
+
+static int __init devices_register(void)
+{
+       return platform_add_devices(devices,
+                                   ARRAY_SIZE(devices));
+}
+arch_initcall(devices_register);
+
+void __init early_device_register(void)
+{
+       early_platform_add_devices(early_devices,
+                                  ARRAY_SIZE(devices));
+}
diff --git a/arch/h8300/kernel/entry.S b/arch/h8300/kernel/entry.S
new file mode 100644 (file)
index 0000000..11502c4
--- /dev/null
@@ -0,0 +1,413 @@
+/* -*- mode: asm -*-
+ *
+ *  linux/arch/h8300/platform/h8300h/entry.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *  David McCullough <davidm@snapgear.com>
+ *
+ */
+
+/*
+ *  entry.S
+ *  include exception/interrupt gateway
+ *          system call entry
+ */
+
+#include <linux/sys.h>
+#include <asm/unistd.h>
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/thread_info.h>
+#include <asm/errno.h>
+
+#if defined(CONFIG_CPU_H8300H)
+#define USERRET 8
+INTERRUPTS = 64
+       .h8300h
+       .macro  SHLL2 reg
+       shll.l  \reg
+       shll.l  \reg
+       .endm
+       .macro  SHLR2 reg
+       shlr.l  \reg
+       shlr.l  \reg
+       .endm
+       .macro  SAVEREGS
+       mov.l   er0,@-sp
+       mov.l   er1,@-sp
+       mov.l   er2,@-sp
+       mov.l   er3,@-sp
+       .endm
+       .macro  RESTOREREGS
+       mov.l   @sp+,er3
+       mov.l   @sp+,er2
+       .endm
+       .macro  SAVEEXR
+       .endm
+       .macro  RESTOREEXR
+       .endm
+#endif
+#if defined(CONFIG_CPU_H8S)
+#define USERRET 10
+#define USEREXR 8
+INTERRUPTS = 128
+       .h8300s
+       .macro  SHLL2 reg
+       shll.l  #2,\reg
+       .endm
+       .macro  SHLR2 reg
+       shlr.l  #2,\reg
+       .endm
+       .macro  SAVEREGS
+       stm.l   er0-er3,@-sp
+       .endm
+       .macro  RESTOREREGS
+       ldm.l   @sp+,er2-er3
+       .endm
+       .macro  SAVEEXR
+       mov.w   @(USEREXR:16,er0),r1
+       mov.w   r1,@(LEXR-LER3:16,sp)           /* copy EXR */
+       .endm
+       .macro  RESTOREEXR
+       mov.w   @(LEXR-LER1:16,sp),r1           /* restore EXR */
+       mov.b   r1l,r1h
+       mov.w   r1,@(USEREXR:16,er0)
+       .endm
+#endif
+
+
+/* CPU context save/restore macros. */
+
+       .macro  SAVE_ALL
+       mov.l   er0,@-sp
+       stc     ccr,r0l                         /* check kernel mode */
+       btst    #4,r0l
+       bne     5f
+
+       /* user mode */
+       mov.l   sp,@_sw_usp
+       mov.l   @sp,er0                         /* restore saved er0 */
+       orc     #0x10,ccr                       /* switch kernel stack */
+       mov.l   @_sw_ksp,sp
+       sub.l   #(LRET-LORIG),sp                /* allocate LORIG - LRET */
+       SAVEREGS
+       mov.l   @_sw_usp,er0
+       mov.l   @(USERRET:16,er0),er1           /* copy the RET addr */
+       mov.l   er1,@(LRET-LER3:16,sp)
+       SAVEEXR
+
+       mov.l   @(LORIG-LER3:16,sp),er0
+       mov.l   er0,@(LER0-LER3:16,sp)          /* copy ER0 */
+       mov.w   e1,r1                           /* e1 highbyte = ccr */
+       and     #0xef,r1h                       /* mask mode? flag */
+       bra     6f
+5:
+       /* kernel mode */
+       mov.l   @sp,er0                         /* restore saved er0 */
+       subs    #2,sp                           /* set dummy ccr */
+       SAVEREGS
+       mov.w   @(LRET-LER3:16,sp),r1           /* copy old ccr */
+6:
+       mov.b   r1h,r1l
+       mov.b   #0,r1h
+       mov.w   r1,@(LCCR-LER3:16,sp)           /* set ccr */
+       mov.l   er6,@-sp                        /* syscall arg #6 */
+       mov.l   er5,@-sp                        /* syscall arg #5 */
+       mov.l   er4,@-sp                        /* syscall arg #4 */
+       .endm                                   /* r1 = ccr */
+
+       .macro  RESTORE_ALL
+       mov.l   @sp+,er4
+       mov.l   @sp+,er5
+       mov.l   @sp+,er6
+       RESTOREREGS
+       mov.w   @(LCCR-LER1:16,sp),r0           /* check kernel mode */
+       btst    #4,r0l
+       bne     7f
+
+       orc     #0xc0,ccr
+       mov.l   @_sw_usp,er0
+       mov.l   @(LER0-LER1:16,sp),er1          /* restore ER0 */
+       mov.l   er1,@er0
+       RESTOREEXR
+       mov.w   @(LCCR-LER1:16,sp),r1           /* restore the RET addr */
+       mov.b   r1l,r1h
+       mov.b   @(LRET+1-LER1:16,sp),r1l
+       mov.w   r1,e1
+       mov.w   @(LRET+2-LER1:16,sp),r1
+       mov.l   er1,@(USERRET:16,er0)
+
+       mov.l   @sp+,er1
+       add.l   #(LRET-LER1),sp                 /* remove LORIG - LRET */
+       mov.l   sp,@_sw_ksp
+       andc    #0xef,ccr                       /* switch to user mode */
+       mov.l   er0,sp
+       bra     8f
+7:
+       mov.l   @sp+,er1
+       adds    #4,sp
+       adds    #2,sp
+8:
+       mov.l   @sp+,er0
+       adds    #4,sp                           /* remove the sw created LVEC */
+       rte
+       .endm
+
+.globl _system_call
+.globl ret_from_exception
+.globl ret_from_fork
+.globl ret_from_kernel_thread
+.globl ret_from_interrupt
+.globl _interrupt_redirect_table
+.globl _sw_ksp,_sw_usp
+.globl _resume
+.globl _interrupt_entry
+.globl _trace_break
+.globl _nmi
+
+#if defined(CONFIG_ROMKERNEL)
+       .section .int_redirect,"ax"
+_interrupt_redirect_table:
+#if defined(CONFIG_CPU_H8300H)
+       .rept   7
+       .long   0
+       .endr
+#endif
+#if defined(CONFIG_CPU_H8S)
+       .rept   5
+       .long   0
+       .endr
+       jmp     @_trace_break
+       .long   0
+#endif
+
+       jsr     @_interrupt_entry               /* NMI */
+       jmp     @_system_call                   /* TRAPA #0 (System call) */
+       .long   0
+       .long   0
+       jmp     @_trace_break                   /* TRAPA #3 (breakpoint) */
+       .rept   INTERRUPTS-12
+       jsr     @_interrupt_entry
+       .endr
+#endif
+#if defined(CONFIG_RAMKERNEL)
+.globl _interrupt_redirect_table
+       .section .bss
+_interrupt_redirect_table:
+       .space  4
+#endif
+
+       .section .text
+       .align  2
+_interrupt_entry:
+       SAVE_ALL
+       mov.l   sp,er0
+       add.l   #LVEC,er0
+       btst    #4,r1l
+       bne     1f
+       /* user LVEC */
+       mov.l   @_sw_usp,er0
+       adds    #4,er0
+1:
+       mov.l   @er0,er0                        /* LVEC address */
+#if defined(CONFIG_ROMKERNEL)
+       sub.l   #_interrupt_redirect_table,er0
+#endif
+#if defined(CONFIG_RAMKERNEL)
+       mov.l   @_interrupt_redirect_table,er1
+       sub.l   er1,er0
+#endif
+       SHLR2   er0
+       dec.l   #1,er0
+       mov.l   sp,er1
+       subs    #4,er1                          /* adjust ret_pc */
+#if defined(CONFIG_CPU_H8S)
+       orc     #7,exr
+       andc    #0x7f,ccr
+#endif 
+       jsr     @do_IRQ
+       jmp     @ret_from_interrupt
+
+_system_call:
+       subs    #4,sp                           /* dummy LVEC */
+       SAVE_ALL
+       andc    #0xbf,ccr
+       mov.l   er0,er4
+
+       /* save top of frame */
+       mov.l   sp,er0
+       jsr     @set_esp0
+       mov.l   sp,er2
+       and.w   #0xe000,r2
+       mov.b   @((TI_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
+       btst    #(TIF_SYSCALL_TRACE & 7),r2l
+       beq     1f
+       jsr     @do_syscall_trace
+1:
+       cmp.l   #NR_syscalls,er4
+       bcc     badsys
+       SHLL2   er4
+       mov.l   #_sys_call_table,er0
+       add.l   er4,er0
+       mov.l   @er0,er4
+       beq     ret_from_exception:16
+       mov.l   @(LER1:16,sp),er0
+       mov.l   @(LER2:16,sp),er1
+       mov.l   @(LER3:16,sp),er2
+       jsr     @er4
+       mov.l   er0,@(LER0:16,sp)               /* save the return value */
+       mov.l   sp,er2
+       and.w   #0xe000,r2
+       mov.b   @((TI_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
+       btst    #(TIF_SYSCALL_TRACE & 7),r2l
+       beq     2f
+       jsr     @do_syscall_trace
+2:
+       orc     #0xc0,ccr
+       bra     resume_userspace
+
+badsys:
+       mov.l   #-ENOSYS,er0
+       mov.l   er0,@(LER0:16,sp)
+       bra     resume_userspace
+
+#if !defined(CONFIG_PREEMPT)
+#define resume_kernel restore_all
+#endif
+
+ret_from_exception:
+#if defined(CONFIG_PREEMPT)
+       orc     #0xc0,ccr
+#endif
+ret_from_interrupt:
+       mov.b   @(LCCR+1:16,sp),r0l
+       btst    #4,r0l
+       bne     resume_kernel:8         /* return from kernel */
+resume_userspace:
+       andc    #0xbf,ccr
+       mov.l   sp,er4
+       and.w   #0xe000,r4              /* er4 <- current thread info */
+       mov.l   @(TI_FLAGS:16,er4),er1
+       and.l   #_TIF_WORK_MASK,er1
+       beq     restore_all:8
+work_pending:
+       btst    #TIF_NEED_RESCHED,r1l
+       bne     work_resched:8
+       /* work notifysig */
+       mov.l   sp,er0
+       subs    #4,er0                  /* er0: pt_regs */
+       jsr     @do_notify_resume
+       bra     restore_all:8
+work_resched:
+       mov.l   sp,er0
+       jsr     @set_esp0
+       jsr     @schedule
+       bra     resume_userspace:8
+restore_all:
+       RESTORE_ALL                     /* Does RTE */
+
+#if defined(CONFIG_PREEMPT)
+resume_kernel:
+       mov.l   @(TI_PRE_COUNT:16,er4),er0
+       bne     restore_all:8
+need_resched:
+       mov.l   @(TI_FLAGS:16,er4),er0
+       btst    #TIF_NEED_RESCHED,r0l
+       beq     restore_all:8
+       mov.b   @(LCCR+1:16,sp),r0l     /* Interrupt Enabled? */
+       bmi     restore_all:8
+       mov.l   #PREEMPT_ACTIVE,er0
+       mov.l   er0,@(TI_PRE_COUNT:16,er4)
+       andc    #0xbf,ccr
+       mov.l   sp,er0
+       jsr     @set_esp0
+       jsr     @schedule
+       orc     #0xc0,ccr
+       bra     need_resched:8
+#endif
+
+ret_from_fork:
+       mov.l   er2,er0
+       jsr     @schedule_tail
+       jmp     @ret_from_exception
+
+ret_from_kernel_thread:
+       mov.l   er2,er0
+       jsr     @schedule_tail
+       mov.l   @(LER4:16,sp),er0
+       mov.l   @(LER5:16,sp),er1
+       jsr     @er1
+       jmp     @ret_from_exception
+
+_resume:
+       /*
+        * Beware - when entering resume, offset of tss is in d1,
+        * prev (the current task) is in a0, next (the new task)
+        * is in a1 and d2.b is non-zero if the mm structure is
+        * shared between the tasks, so don't change these
+        * registers until their contents are no longer needed.
+        */
+
+       /* save sr */
+       sub.w   r3,r3
+       stc     ccr,r3l
+       mov.w   r3,@(THREAD_CCR+2:16,er0)
+
+       /* disable interrupts */
+       orc     #0xc0,ccr
+       mov.l   @_sw_usp,er3
+       mov.l   er3,@(THREAD_USP:16,er0)
+       mov.l   sp,@(THREAD_KSP:16,er0)
+
+       /* Skip address space switching if they are the same. */
+       /* FIXME: what did we hack out of here, this does nothing! */
+
+       mov.l   @(THREAD_USP:16,er1),er0
+       mov.l   er0,@_sw_usp
+       mov.l   @(THREAD_KSP:16,er1),sp
+
+       /* restore status register */
+       mov.w   @(THREAD_CCR+2:16,er1),r3
+
+       ldc     r3l,ccr
+       rts
+
+_trace_break:
+       subs    #4,sp
+       SAVE_ALL
+       sub.l   er1,er1
+       dec.l   #1,er1
+       mov.l   er1,@(LORIG,sp)
+       mov.l   sp,er0
+       jsr     @set_esp0
+       mov.l   @_sw_usp,er0
+       mov.l   @er0,er1
+       mov.w   @(-2:16,er1),r2
+       cmp.w   #0x5730,r2
+       beq     1f
+       subs    #2,er1
+       mov.l   er1,@er0
+1:
+       and.w   #0xff,e1
+       mov.l   er1,er0
+       jsr     @trace_trap
+       jmp     @ret_from_exception
+
+_nmi:
+       subs    #4, sp
+       mov.l   er0, @-sp
+       mov.l   @_interrupt_redirect_table, er0
+       add.l   #8*4, er0
+       mov.l   er0, @(4,sp)
+       mov.l   @sp+, er0
+       jmp     @_interrupt_entry
+
+       .section        .bss
+_sw_ksp:
+       .space  4
+_sw_usp:
+       .space  4
+
+       .end
diff --git a/arch/h8300/kernel/gpio.c b/arch/h8300/kernel/gpio.c
new file mode 100644 (file)
index 0000000..084bfd0
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ *  linux/arch/h8300/kernel/gpio.c
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ */
+
+/*
+ * Internal I/O Port Management
+ */
+
+#include <linux/stddef.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+
+#define _(addr) (volatile unsigned char *)(addr)
+#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
+#include <asm/regs306x.h>
+static volatile unsigned char *ddrs[] = {
+       _(P1DDR),_(P2DDR),_(P3DDR),_(P4DDR),_(P5DDR),_(P6DDR),
+       NULL,    _(P8DDR),_(P9DDR),_(PADDR),_(PBDDR),
+};
+#define MAX_PORT 11
+#endif
+
+ #if defined(CONFIG_H83002) || defined(CONFIG_H8048)
+/* Fix me!! */
+#include <asm/regs306x.h>
+static volatile unsigned char *ddrs[] = {
+       _(P1DDR),_(P2DDR),_(P3DDR),_(P4DDR),_(P5DDR),_(P6DDR),
+       NULL,    _(P8DDR),_(P9DDR),_(PADDR),_(PBDDR),
+};
+#define MAX_PORT 11
+#endif
+
+#if defined(CONFIG_H8S2678)
+#include <asm/regs267x.h>
+static volatile unsigned char *ddrs[] = {
+       _(P1DDR),_(P2DDR),_(P3DDR),NULL    ,_(P5DDR),_(P6DDR),
+       _(P7DDR),_(P8DDR),NULL,    _(PADDR),_(PBDDR),_(PCDDR),
+       _(PDDDR),_(PEDDR),_(PFDDR),_(PGDDR),_(PHDDR),
+       _(PADDR),_(PBDDR),_(PCDDR),_(PDDDR),_(PEDDR),_(PFDDR),
+       _(PGDDR),_(PHDDR)
+};
+#define MAX_PORT 17
+#endif
+#undef _
+#if !defined(P1DDR)
+#error Unsuppoted CPU Selection
+#endif
+
+static struct {
+       unsigned char used;
+       unsigned char ddr;
+} gpio_regs[MAX_PORT];
+
+extern char *_platform_gpio_table(int length);
+
+int h8300_reserved_gpio(int port, unsigned int bits)
+{
+       unsigned char *used;
+
+       if (port < 0 || port >= MAX_PORT)
+               return -1;
+       used = &(gpio_regs[port].used);
+       if ((*used & bits) != 0)
+               return 0;
+       *used |= bits;
+       return 1;
+}
+
+int h8300_free_gpio(int port, unsigned int bits)
+{
+       unsigned char *used;
+
+       if (port < 0 || port >= MAX_PORT)
+               return -1;
+       used = &(gpio_regs[port].used);
+       if ((*used & bits) != bits)
+               return 0;
+       *used &= (~bits);
+       return 1;
+}
+
+int h8300_set_gpio_dir(int port_bit,int dir)
+{
+       int port = (port_bit >> 8) & 0xff;
+       int bit  = port_bit & 0xff;
+
+       if (ddrs[port] == NULL)
+               return 0;
+       if (gpio_regs[port].used & bit) {
+               if (dir)
+                       gpio_regs[port].ddr |= bit;
+               else
+                       gpio_regs[port].ddr &= ~bit;
+               *ddrs[port] = gpio_regs[port].ddr;
+               return 1;
+       } else
+               return 0;
+}
+
+int h8300_get_gpio_dir(int port_bit)
+{
+       int port = (port_bit >> 8) & 0xff;
+       int bit  = port_bit & 0xff;
+
+       if (ddrs[port] == NULL)
+               return 0;
+       if (gpio_regs[port].used & bit) {
+               return (gpio_regs[port].ddr & bit) != 0;
+       } else
+               return -1;
+}
+
+#if defined(CONFIG_PROC_FS)
+static char *port_status(int portno)
+{
+       static char result[10];
+       static const char io[2]={'I','O'};
+       char *rp;
+       int c;
+       unsigned char used,ddr;
+       
+       used = gpio_regs[portno].used;
+       ddr  = gpio_regs[portno].ddr;
+       result[8]='\0';
+       rp = result + 7;
+       for (c = 8; c > 0; c--,rp--,used >>= 1, ddr >>= 1)
+               if (used & 0x01)
+                       *rp = io[ ddr & 0x01];
+               else    
+                       *rp = '-';
+       return result;
+}
+
+static int gpio_proc_show(struct seq_file *m, void *v)
+{
+       static const char port_name[]="123456789ABCDEFGH";
+       int c;
+
+       for (c = 0; c < MAX_PORT; c++) {
+               if (ddrs[c] == NULL)
+                       continue;
+               seq_printf(m, "P%c: %s\n", port_name[c], port_status(c));
+       }
+       return 0;
+}
+
+static int gpio_proc_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, gpio_proc_show, PDE_DATA(inode));
+}
+
+static const struct file_operations gpio_proc_fops = {
+       .open           = gpio_proc_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static __init int register_proc(void)
+{
+       return proc_create("gpio", S_IRUGO, NULL, &gpio_proc_fops) != NULL;
+}
+
+__initcall(register_proc);
+#endif
+
+void __init h8300_gpio_init(void)
+{
+       memcpy(gpio_regs,_platform_gpio_table(sizeof(gpio_regs)),sizeof(gpio_regs));
+}
diff --git a/arch/h8300/kernel/h8300_ksyms.c b/arch/h8300/kernel/h8300_ksyms.c
new file mode 100644 (file)
index 0000000..53d7c0e
--- /dev/null
@@ -0,0 +1,100 @@
+#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/checksum.h>
+#include <asm/current.h>
+#include <asm/gpio.h>
+
+//asmlinkage long long __ashrdi3 (long long, int);
+//asmlinkage long long __lshrdi3 (long long, int);
+extern char h8300_debug_device[];
+
+/* platform dependent support */
+
+EXPORT_SYMBOL(strnlen);
+EXPORT_SYMBOL(strrchr);
+EXPORT_SYMBOL(strstr);
+EXPORT_SYMBOL(strchr);
+EXPORT_SYMBOL(strcat);
+EXPORT_SYMBOL(strlen);
+EXPORT_SYMBOL(strcmp);
+EXPORT_SYMBOL(strncmp);
+
+EXPORT_SYMBOL(ip_fast_csum);
+
+EXPORT_SYMBOL(enable_irq);
+EXPORT_SYMBOL(disable_irq);
+
+/* Networking helper routines. */
+EXPORT_SYMBOL(csum_partial_copy_nocheck);
+
+/* The following are special because they're not called
+   explicitly (the C compiler generates them).  Fortunately,
+   their interface isn't gonna change any time soon now, so
+   it's OK to leave it out of version control.  */
+//EXPORT_SYMBOL(__ashrdi3);
+//EXPORT_SYMBOL(__lshrdi3);
+EXPORT_SYMBOL(memcpy);
+EXPORT_SYMBOL(memset);
+EXPORT_SYMBOL(memcmp);
+EXPORT_SYMBOL(memscan);
+EXPORT_SYMBOL(memmove);
+
+/*
+ * 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);
+
+EXPORT_SYMBOL(h8300_reserved_gpio);
+EXPORT_SYMBOL(h8300_free_gpio);
+EXPORT_SYMBOL(h8300_set_gpio_dir);
diff --git a/arch/h8300/kernel/head_ram.S b/arch/h8300/kernel/head_ram.S
new file mode 100644 (file)
index 0000000..57fb053
--- /dev/null
@@ -0,0 +1,59 @@
+
+#include <linux/sys.h>
+#include <linux/init.h>
+#include <asm/unistd.h>
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/thread_info.h>
+#include <asm/errno.h>
+
+#if defined(CONFIG_CPU_H8300H)
+       .h8300h
+#include <asm/regs306x.h>
+#define IRAMTOP 0xffff20
+#endif
+#if defined(CONFIG_CPU_H8S)
+       .h8300s
+#include <asm/regs267x.h>
+#define IRAMTOP 0xffc000
+#endif
+
+       __HEAD
+       .global _start
+_start:        
+       mov.l   #IRAMTOP,sp
+       /* .bss clear */
+       mov.l   #_sbss,er5
+       mov.l   #_ebss,er4
+       sub.l   er5,er4
+       shlr    er4
+       shlr    er4
+       sub.l   er0,er0
+1:     
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+
+       /* linux kernel start */
+#if defined(CONFIG_CPU_H8300H)
+       ldc     #0xd0,ccr       /* running kernel */
+       mov.l   #SYSCR,er0
+       bclr    #3,@er0
+#endif
+#if defined(CONFIG_CPU_H8S)
+       ldc     #0x07,exr
+       bclr    #4,@INTCR:8
+       bset    #5,@INTCR:8     /* Interrupt mode 2 */
+       ldc     #0x10,ccr       /* running kernel */
+#endif
+       mov.l   #init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @start_kernel
+
+1:
+       bra     1b
+
+       .end
diff --git a/arch/h8300/kernel/head_rom.S b/arch/h8300/kernel/head_rom.S
new file mode 100644 (file)
index 0000000..f08dc03
--- /dev/null
@@ -0,0 +1,95 @@
+#include <linux/init.h>
+#include <asm/thread_info.h>
+
+#if defined(CONFIG_CPU_H8300H)
+       .h8300h
+#include <asm/regs306x.h>
+#define IRAMTOP 0xffff20
+#endif
+#if defined(CONFIG_CPU_H8S)
+       .h8300s
+#include <asm/regs267x.h>
+#define IRAMTOP 0xffc000
+#endif
+
+       __HEAD
+       .global _start
+_start:        
+       mov.l   #IRAMTOP,sp
+#if !defined(CONFIG_H8300H_SIM) && \
+    !defined(CONFIG_H8S_SIM)
+       jsr     @lowlevel_init
+       
+       /* copy .data */
+       mov.l   #_begin_data,er5
+       mov.l   #_sdata,er6
+       mov.l   #_edata,er4
+       sub.l   er6,er4
+       shlr.l  er4
+       shlr.l  er4
+1:     
+       mov.l   @er5+,er0
+       mov.l   er0,@er6
+       adds    #4,er6
+       dec.l   #1,er4
+       bne     1b      
+       /* .bss clear */
+       mov.l   #_sbss,er5
+       mov.l   #_ebss,er4
+       sub.l   er5,er4
+       shlr    er4
+       shlr    er4
+       sub.l   er0,er0
+1:     
+       mov.l   er0,@er5
+       adds    #4,er5
+       dec.l   #1,er4
+       bne     1b
+#else
+       /* get cmdline from gdb */
+       jsr     @0xcc
+       ;; er0 - argc
+       ;; er1 - argv
+       mov.l   #command_line,er3
+       adds    #4,er1
+       dec.l   #1,er0
+       beq     4f
+1:
+       mov.l   @er1+,er2
+2:     
+       mov.b   @er2+,r4l
+       beq     3f
+       mov.b   r4l,@er3
+       adds    #1,er3
+       bra     2b
+3:
+       mov.b   #' ',r4l
+       mov.b   r4l,@er3
+       adds    #1,er3
+       dec.l   #1,er0
+       bne     1b
+       subs    #1,er3
+       mov.b   #0,r4l
+       mov.b   r4l,@er3
+4:
+#endif
+       /* linux kernel start */
+#if defined(CONFIG_CPU_H8300H)
+       ldc     #0xd0,ccr       /* running kernel */
+       mov.l   #SYSCR,er0
+       bclr    #3,@er0
+#endif
+#if defined(CONFIG_CPU_H8S)
+       ldc     #0x07,exr
+       bclr    #4,@INTCR:8
+       bset    #5,@INTCR:8     /* Interrupt mode 2 */
+       ldc     #0x10,ccr       /* running kernel */
+#endif
+       mov.l   #init_thread_union,sp
+       add.l   #0x2000,sp
+       jsr     @start_kernel
+
+1:
+       bra     1b
+
+       .end
diff --git a/arch/h8300/kernel/irq.c b/arch/h8300/kernel/irq.c
new file mode 100644 (file)
index 0000000..d5513a9
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * linux/arch/h8300/kernel/irq.c
+ *
+ * Copyright 2014 Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <asm/traps.h>
+
+#ifdef CONFIG_RAMKERNEL
+#define CPU_VECTOR ((unsigned long *)0x000000)
+#define ADDR_MASK (0xffffff)
+
+extern unsigned long *_interrupt_redirect_table;
+void _interrupt_entry(void);
+
+typedef void (*h8300_vector)(void);
+
+static const h8300_vector __initconst trap_table[] = {
+       0, 0, 0, 0, 
+       _trace_break,
+       0, 0, 
+       _nmi, 
+       _system_call,
+       0, 0,
+       _trace_break,
+};
+
+static unsigned long __init *get_vector_address(void)
+{
+       unsigned long *rom_vector = CPU_VECTOR;
+       unsigned long base,tmp;
+       int vec_no;
+
+       base = rom_vector[EXT_IRQ0] & ADDR_MASK;
+
+       /* check romvector format */
+       for (vec_no = EXT_IRQ0 + 1; vec_no <= EXT_IRQ0+EXT_IRQS; vec_no++) {
+               if ((base+(vec_no - EXT_IRQ0)*4) != (rom_vector[vec_no] & ADDR_MASK))
+                       return NULL;
+       }
+
+       /* ramvector base address */
+       base -= EXT_IRQ0*4;
+
+       /* writerble? */
+       tmp = ~(*(volatile unsigned long *)base);
+       (*(volatile unsigned long *)base) = tmp;
+       if ((*(volatile unsigned long *)base) != tmp)
+               return NULL;
+       return (unsigned long *)base;
+}
+
+static void __init setup_vector(void)
+{
+       int i;
+       unsigned long *ramvec,*ramvec_p;
+       const h8300_vector *trap_entry;
+
+       ramvec = get_vector_address();
+       if (ramvec == NULL)
+               panic("interrupt vector serup failed.");
+       else
+               pr_debug("virtual vector at 0x%p\n", ramvec);
+
+       /* create redirect table */
+       ramvec_p = ramvec;
+       trap_entry = trap_table;
+       for ( i = 0; i < NR_IRQS; i++) {
+               if ( i < 12 ) {
+                       if (*trap_entry)
+                               *ramvec_p = VECTOR(*trap_entry);
+                       ramvec_p++;
+                       trap_entry++;
+               } else
+                       *ramvec_p++ = REDIRECT(_interrupt_entry);
+       }
+       _interrupt_redirect_table = ramvec;
+}
+#else
+void setup_vector(void)
+{
+       /* noting do */
+}
+#endif
+
+void __init init_IRQ(void)
+{
+       int c;
+
+       setup_vector();
+       h8300_init_ipr();
+
+       for (c = 0; c < NR_IRQS; c++)
+               irq_set_chip_and_handler(c, IRQ_CHIP, handle_simple_irq);
+}
+
+asmlinkage void do_IRQ(int irq)
+{
+       irq_enter();
+       generic_handle_irq(irq);
+       irq_exit();
+}
diff --git a/arch/h8300/kernel/irq_h.c b/arch/h8300/kernel/irq_h.c
new file mode 100644 (file)
index 0000000..c4df1be
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * linux/arch/h8300/kernel/irq_h.c
+ *
+ * Copyright 2014 Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <asm/io.h>
+
+const static char ipr_bit[] = {
+        7,  6,  5,  5,
+        4,  4,  4,  4,  3,  3,  3,  3,
+        2,  2,  2,  2,  1,  1,  1,  1,
+        0,  0,  0,  0, 15, 15, 15, 15,
+       14, 14, 14, 14, 13, 13, 13, 13,
+       -1, -1, -1, -1, 11, 11, 11, 11,
+       10, 10, 10, 10,  9,  9,  9,  9,
+};
+
+#define IPR 0xffee18
+
+static void h8300h_disable_irq(struct irq_data *data)
+{
+       int bit;
+       unsigned int addr;
+       int irq = data->irq - 12;
+       if ((bit = ipr_bit[irq]) >= 0) {
+               addr = IPR + (irq >> 3);
+               ctrl_bclr(bit & 7, addr);
+       }
+}
+
+static void h8300h_enable_irq(struct irq_data *data)
+{
+       int bit;
+       unsigned int addr;
+       int irq = data->irq - 12;
+       if ((bit = ipr_bit[irq]) >= 0) {
+               addr = IPR + (irq >> 3);
+               ctrl_bset(bit & 7, addr);
+       }
+}
+
+struct irq_chip h8300h_irq_chip = {
+       .name           = "H8/300H-INTC",
+       .irq_enable     = h8300h_enable_irq,
+       .irq_disable    = h8300h_disable_irq,
+};
+
+void __init h8300_init_ipr(void)
+{
+       ctrl_outb(0xff, IPR +0);
+       ctrl_outb(0xee, IPR + 1);
+}
diff --git a/arch/h8300/kernel/irq_s.c b/arch/h8300/kernel/irq_s.c
new file mode 100644 (file)
index 0000000..c4e7e0b
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * linux/arch/h8300/kernel/irq_s.c
+ *
+ * Copyright 2014 Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+#include <linux/irq.h>
+#include <asm/io.h>
+#define IPRA 0xfffe00
+
+const static unsigned char ipr_table[] = {
+       0x03, 0x02, 0x01, 0x00, 0x13, 0x12, 0x11, 0x10, /* 16 - 23 */
+       0x23, 0x22, 0x21, 0x20, 0x33, 0x32, 0x31, 0x30, /* 24 - 31 */
+       0x43, 0x42, 0x41, 0x40, 0x53, 0x53, 0x52, 0x52, /* 32 - 39 */
+       0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, /* 40 - 47 */
+       0x50, 0x50, 0x50, 0x50, 0x63, 0x63, 0x63, 0x63, /* 48 - 55 */
+       0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, /* 56 - 63 */
+       0x61, 0x61, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, /* 64 - 71 */
+       0x73, 0x73, 0x73, 0x73, 0x72, 0x72, 0x72, 0x72, /* 72 - 79 */
+       0x71, 0x71, 0x71, 0x71, 0x70, 0x83, 0x82, 0x81, /* 80 - 87 */
+       0x80, 0x80, 0x80, 0x80, 0x93, 0x93, 0x93, 0x93, /* 88 - 95 */
+       0x92, 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x91, /* 96 - 103 */
+       0x90, 0x90, 0x90, 0x90, 0xa3, 0xa3, 0xa3, 0xa3, /* 104 - 111 */
+       0xa2, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, /* 112 - 119 */
+       0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, /* 120 - 127 */
+};
+
+static void h8s_disable_irq(struct irq_data *data)
+{
+       int pos;
+       unsigned int addr;
+       unsigned short pri;
+       int irq = data->irq;
+       addr = IPRA + ((ipr_table[irq - 16] & 0xf0) >> 3);
+       pos = (ipr_table[irq - 16] & 0x0f) * 4;
+       pri = ~(0x000f << pos);
+       pri &= ctrl_inw(addr);
+       ctrl_outw(pri, addr);
+}
+
+static void h8s_enable_irq(struct irq_data *data)
+{
+       int pos;
+       unsigned int addr;
+       unsigned short pri;
+       int irq = data->irq;
+       addr = IPRA + ((ipr_table[irq - 16] & 0xf0) >> 3);
+       pos = (ipr_table[irq - 16] & 0x0f) * 4;
+       pri = ~(0x000f << pos);
+       pri &= ctrl_inw(addr);
+       pri |= 1 << pos;
+       ctrl_outw(pri, addr);
+}
+
+struct irq_chip h8s_irq_chip = {
+       .name           = "H8S-INTC",
+       .irq_enable     = h8s_enable_irq,
+       .irq_disable    = h8s_disable_irq,
+};
+
+void __init h8300_init_ipr(void)
+{
+       int n;
+       /* IPRA to IPRK */
+       for (n = 0; n <= 'k' - 'a'; n++)
+               ctrl_outw(0x1111, IPRA + (n * 2));
+}
diff --git a/arch/h8300/kernel/module.c b/arch/h8300/kernel/module.c
new file mode 100644 (file)
index 0000000..1d526e0
--- /dev/null
@@ -0,0 +1,75 @@
+#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
+
+int apply_relocate_add(Elf32_Shdr *sechdrs,
+                      const char *strtab,
+                      unsigned int symindex,
+                      unsigned int relsec,
+                      struct module *me)
+{
+       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 *loc = (uint32_t *)(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_H8_DIR24R8:
+                       loc = (uint32_t *)((uint32_t)loc - 1);
+                       *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
+                       break;
+               case R_H8_DIR24A8:
+                       if (ELF32_R_SYM(rela[i].r_info))
+                               *loc += v;
+                       break;
+               case R_H8_DIR32:
+               case R_H8_DIR32A16:
+                       *loc += v;
+                       break;
+               case R_H8_PCREL16:
+                       v -= (unsigned long)loc + 2;
+                       if ((Elf32_Sword)v > 0x7fff || 
+                           (Elf32_Sword)v < -(Elf32_Sword)0x8000)
+                               goto overflow;
+                       else 
+                               *(unsigned short *)loc = v;
+                       break;
+               case R_H8_PCREL8:
+                       v -= (unsigned long)loc + 1;
+                       if ((Elf32_Sword)v > 0x7f || 
+                           (Elf32_Sword)v < -(Elf32_Sword)0x80)
+                               goto overflow;
+                       else 
+                               *(unsigned char *)loc = v;
+                       break;
+               default:
+                       printk(KERN_ERR "module %s: Unknown relocation: %u\n",
+                              me->name, ELF32_R_TYPE(rela[i].r_info));
+                       return -ENOEXEC;
+               }
+       }
+       return 0;
+ overflow:
+       printk(KERN_ERR "module %s: relocation offset overflow: %08x\n",
+              me->name, rela[i].r_offset);
+       return -ENOEXEC;
+}
diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c
new file mode 100644 (file)
index 0000000..da152cd
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ *  linux/arch/h8300/kernel/process.c
+ *
+ * Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/kernel/process.c
+ *
+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>,
+ *                      Kenneth Albanowski <kjahds@kjahds.com>,
+ *                      The Silver Hammer Group, Ltd.
+ *
+ *  linux/arch/m68k/kernel/process.c
+ *
+ *  Copyright (C) 1995  Hamish Macdonald
+ *
+ *  68060 fixes by Jesper Skov
+ */
+
+/*
+ * This file handles the architecture-dependent parts of process handling..
+ */
+
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/user.h>
+#include <linux/interrupt.h>
+#include <linux/reboot.h>
+#include <linux/fs.h>
+#include <linux/slab.h>
+#include <linux/rcupdate.h>
+
+#include <asm/uaccess.h>
+#include <asm/traps.h>
+#include <asm/setup.h>
+#include <asm/pgtable.h>
+
+void (*pm_power_off)(void) = NULL;
+EXPORT_SYMBOL(pm_power_off);
+
+asmlinkage void ret_from_fork(void);
+asmlinkage void ret_from_kernel_thread(void);
+
+/*
+ * The idle loop on an H8/300..
+ */
+#if !defined(CONFIG_H8300H_SIM) && !defined(CONFIG_H8S_SIM)
+void arch_cpu_idle(void)
+{
+       local_irq_enable();
+       /* XXX: race here! What if need_resched() gets set now? */
+       __asm__("sleep");
+}
+#endif
+
+void machine_restart(char * __unused)
+{
+       local_irq_disable();
+       __asm__("jmp @@0"); 
+}
+
+void machine_halt(void)
+{
+       local_irq_disable();
+       __asm__("sleep");
+       for (;;);
+}
+
+void machine_power_off(void)
+{
+       local_irq_disable();
+       __asm__("sleep");
+       for (;;);
+}
+
+void show_regs(struct pt_regs * regs)
+{
+       show_regs_print_info(KERN_DEFAULT);
+
+       printk("\nPC: %08lx  Status: %02x",
+              regs->pc, regs->ccr);
+       printk("\nORIG_ER0: %08lx ER0: %08lx ER1: %08lx",
+              regs->orig_er0, regs->er0, regs->er1);
+       printk("\nER2: %08lx ER3: %08lx ER4: %08lx ER5: %08lx",
+              regs->er2, regs->er3, regs->er4, regs->er5);
+       printk("\nER6' %08lx ",regs->er6);
+       if (user_mode(regs))
+               printk("USP: %08lx\n", rdusp());
+       else
+               printk("\n");
+}
+
+void flush_thread(void)
+{
+}
+
+int copy_thread(unsigned long clone_flags,
+                unsigned long usp, unsigned long topstk,
+                struct task_struct * p)
+{
+       struct pt_regs * childregs;
+
+       childregs = (struct pt_regs *) (THREAD_SIZE + task_stack_page(p)) - 1;
+
+       if (unlikely(p->flags & PF_KTHREAD)) {
+               memset(childregs, 0, sizeof(struct pt_regs));
+               childregs->retpc = (unsigned long) ret_from_kernel_thread;
+               childregs->er4 = topstk; /* arg */
+               childregs->er5 = usp; /* fn */
+       }  else {
+               *childregs = *current_pt_regs();
+               childregs->er0 = 0;
+               childregs->retpc = (unsigned long) ret_from_fork;
+               p->thread.usp = usp ?: rdusp();
+       }
+       p->thread.ksp = (unsigned long)childregs;
+
+       return 0;
+}
+
+unsigned long thread_saved_pc(struct task_struct *tsk)
+{
+       return ((struct pt_regs *)tsk->thread.esp0)->pc;
+}
+
+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 pt_regs *)p->thread.ksp)->er6;
+       do {
+               if (fp < stack_page+sizeof(struct thread_info) ||
+                   fp >= 8184+stack_page)
+                       return 0;
+               pc = ((unsigned long *)fp)[1];
+               if (!in_sched_functions(pc))
+                       return pc;
+               fp = *(unsigned long *) fp;
+       } while (count++ < 16);
+       return 0;
+}
diff --git a/arch/h8300/kernel/ptrace_h.c b/arch/h8300/kernel/ptrace_h.c
new file mode 100644 (file)
index 0000000..4f1ed02
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/ptrace_h8300h.c
+ *    ptrace cpu depend helper functions
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * 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/linkage.h>
+#include <linux/sched.h>
+#include <asm/ptrace.h>
+
+#define CCR_MASK 0x6f    /* mode/imask not set */
+#define BREAKINST 0x5730 /* trapa #3 */
+
+/* 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 const int h8300_register_offset[] = {
+       PT_REG(er1), PT_REG(er2), PT_REG(er3), PT_REG(er4),
+       PT_REG(er5), PT_REG(er6), PT_REG(er0), PT_REG(orig_er0),
+       PT_REG(ccr), PT_REG(pc)
+};
+
+/* read register */
+long h8300_get_reg(struct task_struct *task, int regno)
+{
+       switch (regno) {
+       case PT_USP:
+               return task->thread.usp + sizeof(long)*2;
+       case PT_CCR:
+           return *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+       default:
+           return *(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]);
+       }
+}
+
+/* write register */
+int h8300_put_reg(struct task_struct *task, int regno, unsigned long data)
+{
+       unsigned short oldccr;
+       switch (regno) {
+       case PT_USP:
+               task->thread.usp = data - sizeof(long)*2;
+       case PT_CCR:
+               oldccr = *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+               oldccr &= ~CCR_MASK;
+               data &= CCR_MASK;
+               data |= oldccr;
+               *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+               break;
+       default:
+               *(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+               break;
+       }
+       return 0;
+}
+
+/* disable singlestep */
+void user_disable_single_step(struct task_struct *child)
+{
+       if((long)child->thread.breakinfo.addr != -1L) {
+               *child->thread.breakinfo.addr = child->thread.breakinfo.inst;
+               child->thread.breakinfo.addr = (unsigned short *)-1L;
+       }
+}
+
+/* calculate next pc */
+enum jump_type {none,    /* normal instruction */
+               jabs,    /* absolute address jump */
+               ind,     /* indirect address jump */
+               ret,     /* return to subrutine */
+               reg,     /* register indexed jump */
+               relb,    /* pc relative jump (byte offset) */
+               relw,    /* pc relative jump (word offset) */
+               };
+
+/* opcode decode table define
+   ptn: opcode pattern
+   msk: opcode bitmask
+   len: instruction length (<0 next table index)
+   jmp: jump operation mode */
+struct optable {
+       unsigned char bitpattern;
+       unsigned char bitmask;
+       signed char length;
+       signed char type;
+} __attribute__((aligned(1),packed));
+
+#define OPTABLE(ptn,msk,len,jmp)   \
+        {                          \
+               .bitpattern = ptn, \
+               .bitmask    = msk, \
+               .length     = len, \
+               .type       = jmp, \
+       }
+
+static const struct optable optable_0[] = {
+       OPTABLE(0x00,0xff, 1,none), /* 0x00 */
+       OPTABLE(0x01,0xff,-1,none), /* 0x01 */
+       OPTABLE(0x02,0xfe, 1,none), /* 0x02-0x03 */
+       OPTABLE(0x04,0xee, 1,none), /* 0x04-0x05/0x14-0x15 */
+       OPTABLE(0x06,0xfe, 1,none), /* 0x06-0x07 */
+       OPTABLE(0x08,0xea, 1,none), /* 0x08-0x09/0x0c-0x0d/0x18-0x19/0x1c-0x1d */
+       OPTABLE(0x0a,0xee, 1,none), /* 0x0a-0x0b/0x1a-0x1b */
+       OPTABLE(0x0e,0xee, 1,none), /* 0x0e-0x0f/0x1e-0x1f */
+       OPTABLE(0x10,0xfc, 1,none), /* 0x10-0x13 */
+       OPTABLE(0x16,0xfe, 1,none), /* 0x16-0x17 */
+       OPTABLE(0x20,0xe0, 1,none), /* 0x20-0x3f */
+       OPTABLE(0x40,0xf0, 1,relb), /* 0x40-0x4f */
+       OPTABLE(0x50,0xfc, 1,none), /* 0x50-0x53 */
+       OPTABLE(0x54,0xfd, 1,ret ), /* 0x54/0x56 */
+       OPTABLE(0x55,0xff, 1,relb), /* 0x55 */
+       OPTABLE(0x57,0xff, 1,none), /* 0x57 */
+       OPTABLE(0x58,0xfb, 2,relw), /* 0x58/0x5c */
+       OPTABLE(0x59,0xfb, 1,reg ), /* 0x59/0x5b */
+       OPTABLE(0x5a,0xfb, 2,jabs), /* 0x5a/0x5e */
+       OPTABLE(0x5b,0xfb, 2,ind ), /* 0x5b/0x5f */
+       OPTABLE(0x60,0xe8, 1,none), /* 0x60-0x67/0x70-0x77 */
+       OPTABLE(0x68,0xfa, 1,none), /* 0x68-0x69/0x6c-0x6d */
+       OPTABLE(0x6a,0xfe,-2,none), /* 0x6a-0x6b */
+       OPTABLE(0x6e,0xfe, 2,none), /* 0x6e-0x6f */
+       OPTABLE(0x78,0xff, 4,none), /* 0x78 */
+       OPTABLE(0x79,0xff, 2,none), /* 0x79 */
+       OPTABLE(0x7a,0xff, 3,none), /* 0x7a */
+       OPTABLE(0x7b,0xff, 2,none), /* 0x7b */
+       OPTABLE(0x7c,0xfc, 2,none), /* 0x7c-0x7f */
+       OPTABLE(0x80,0x80, 1,none), /* 0x80-0xff */
+};
+
+static const struct optable optable_1[] = {
+       OPTABLE(0x00,0xff,-3,none), /* 0x0100 */
+       OPTABLE(0x40,0xf0,-3,none), /* 0x0140-0x14f */
+       OPTABLE(0x80,0xf0, 1,none), /* 0x0180-0x018f */
+       OPTABLE(0xc0,0xc0, 2,none), /* 0x01c0-0x01ff */
+};
+
+static const struct optable optable_2[] = {
+       OPTABLE(0x00,0x20, 2,none), /* 0x6a0?/0x6a8?/0x6b0?/0x6b8? */
+       OPTABLE(0x20,0x20, 3,none), /* 0x6a2?/0x6aa?/0x6b2?/0x6ba? */
+};
+
+static const struct optable optable_3[] = {
+       OPTABLE(0x69,0xfb, 2,none), /* 0x010069/0x01006d/014069/0x01406d */
+       OPTABLE(0x6b,0xff,-4,none), /* 0x01006b/0x01406b */
+       OPTABLE(0x6f,0xff, 3,none), /* 0x01006f/0x01406f */
+       OPTABLE(0x78,0xff, 5,none), /* 0x010078/0x014078 */
+};
+
+static const struct optable optable_4[] = {
+       OPTABLE(0x00,0x78, 3,none), /* 0x0100690?/0x01006d0?/0140690/0x01406d0?/0x0100698?/0x01006d8?/0140698?/0x01406d8? */
+       OPTABLE(0x20,0x78, 4,none), /* 0x0100692?/0x01006d2?/0140692/0x01406d2?/0x010069a?/0x01006da?/014069a?/0x01406da? */
+};
+
+static const struct optables_list {
+       const struct optable *ptr;
+       int size;
+} optables[] = {
+#define OPTABLES(no)                                                   \
+        {                                                              \
+               .ptr  = optable_##no,                                  \
+               .size = sizeof(optable_##no) / sizeof(struct optable), \
+       }
+       OPTABLES(0),
+       OPTABLES(1),
+       OPTABLES(2),
+       OPTABLES(3),
+       OPTABLES(4),
+
+};
+
+const unsigned char condmask[] = {
+       0x00,0x40,0x01,0x04,0x02,0x08,0x10,0x20
+};
+
+static int isbranch(struct task_struct *task,int reson)
+{
+       unsigned char cond = h8300_get_reg(task, PT_CCR);
+       /* encode complex conditions */
+       /* B4: N^V
+          B5: Z|(N^V)
+          B6: C|Z */
+       __asm__("bld #3,%w0\n\t"
+               "bxor #1,%w0\n\t"
+               "bst #4,%w0\n\t"
+               "bor #2,%w0\n\t"
+               "bst #5,%w0\n\t"
+               "bld #2,%w0\n\t"
+               "bor #0,%w0\n\t"
+               "bst #6,%w0\n\t"
+               :"=&r"(cond)::"cc");
+       cond &= condmask[reson >> 1];
+       if (!(reson & 1))
+               return cond == 0;
+       else
+               return cond != 0;
+}
+
+static unsigned short *getnextpc(struct task_struct *child, unsigned short *pc)
+{
+       const struct optable *op;
+       unsigned char *fetch_p;
+       unsigned char inst;
+       unsigned long addr;
+       unsigned long *sp;
+       int op_len,regno;
+       op = optables[0].ptr;
+       op_len = optables[0].size;
+       fetch_p = (unsigned char *)pc;
+       inst = *fetch_p++;
+       do {
+               if ((inst & op->bitmask) == op->bitpattern) {
+                       if (op->length < 0) {
+                               op = optables[-op->length].ptr;
+                               op_len = optables[-op->length].size + 1;
+                               inst = *fetch_p++;
+                       } else {
+                               switch (op->type) {
+                               case none:
+                                       return pc + op->length;
+                               case jabs:
+                                       addr = *(unsigned long *)pc;
+                                       return (unsigned short *)(addr & 0x00ffffff);
+                               case ind:
+                                       addr = *pc & 0xff;
+                                       return (unsigned short *)(*(unsigned long *)addr);
+                               case ret:
+                                       sp = (unsigned long *)h8300_get_reg(child, PT_USP);
+                                       /* user stack frames
+                                          |   er0  | temporary saved
+                                          +--------+
+                                          |   exp  | exception stack frames
+                                          +--------+
+                                          | ret pc | userspace return address
+                                       */
+                                       return (unsigned short *)(*(sp+2) & 0x00ffffff);
+                               case reg:
+                                       regno = (*pc >> 4) & 0x07;
+                                       if (regno == 0)
+                                               addr = h8300_get_reg(child, PT_ER0);
+                                       else
+                                               addr = h8300_get_reg(child, regno-1+PT_ER1);
+                                       return (unsigned short *)addr;
+                               case relb:
+                                       if (inst == 0x55 || isbranch(child,inst & 0x0f))
+                                               pc = (unsigned short *)((unsigned long)pc +
+                                                                      ((signed char)(*fetch_p)));
+                                       return pc+1; /* skip myself */
+                               case relw:
+                                       if (inst == 0x5c || isbranch(child,(*fetch_p & 0xf0) >> 4))
+                                               pc = (unsigned short *)((unsigned long)pc +
+                                                                      ((signed short)(*(pc+1))));
+                                       return pc+2; /* skip myself */
+                               }
+                       }
+               } else
+                       op++;
+       } while(--op_len > 0);
+       return NULL;
+}
+
+/* Set breakpoint(s) to simulate a single step from the current PC.  */
+
+void user_enable_single_step(struct task_struct *child)
+{
+       unsigned short *nextpc;
+       nextpc = getnextpc(child,(unsigned short *)h8300_get_reg(child, PT_PC));
+       child->thread.breakinfo.addr = nextpc;
+       child->thread.breakinfo.inst = *nextpc;
+       *nextpc = BREAKINST;
+}
+
+asmlinkage void trace_trap(unsigned long bp)
+{
+       if ((unsigned long)current->thread.breakinfo.addr == bp) {
+               user_disable_single_step(current);
+               force_sig(SIGTRAP,current);
+       } else
+               force_sig(SIGILL,current);
+}
+
diff --git a/arch/h8300/kernel/ptrace_s.c b/arch/h8300/kernel/ptrace_s.c
new file mode 100644 (file)
index 0000000..c058ab1
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ *  linux/arch/h8300/platform/h8s/ptrace_h8s.c
+ *    ptrace cpu depend helper functions
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * 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/linkage.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <asm/ptrace.h>
+
+#define CCR_MASK  0x6f
+#define EXR_TRACE 0x80
+
+/* 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 const int h8300_register_offset[] = {
+       PT_REG(er1), PT_REG(er2), PT_REG(er3), PT_REG(er4),
+       PT_REG(er5), PT_REG(er6), PT_REG(er0), PT_REG(orig_er0),
+       PT_REG(ccr), PT_REG(pc),  0,           PT_REG(exr)
+};
+
+/* read register */
+long h8300_get_reg(struct task_struct *task, int regno)
+{
+       switch (regno) {
+       case PT_USP:
+               return task->thread.usp + sizeof(long)*2 + 2;
+       case PT_CCR:
+       case PT_EXR:
+           return *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+       default:
+           return *(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]);
+       }
+}
+
+/* write register */
+int h8300_put_reg(struct task_struct *task, int regno, unsigned long data)
+{
+       unsigned short oldccr;
+       switch (regno) {
+       case PT_USP:
+               task->thread.usp = data - sizeof(long)*2 - 2;
+       case PT_CCR:
+               oldccr = *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+               oldccr &= ~CCR_MASK;
+               data &= CCR_MASK;
+               data |= oldccr;
+               *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+               break;
+       case PT_EXR:
+               /* exr modify not support */
+               return -EIO;
+       default:
+               *(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+               break;
+       }
+       return 0;
+}
+
+/* disable singlestep */
+void user_disable_single_step(struct task_struct *child)
+{
+       *(unsigned short *)(child->thread.esp0 + h8300_register_offset[PT_EXR]) &= ~EXR_TRACE;
+}
+
+/* enable singlestep */
+void user_enable_single_step(struct task_struct *child)
+{
+       *(unsigned short *)(child->thread.esp0 + h8300_register_offset[PT_EXR]) |= EXR_TRACE;
+}
+
+asmlinkage void trace_trap(unsigned long bp)
+{
+       (void)bp;
+       force_sig(SIGTRAP,current);
+}
+
diff --git a/arch/h8300/kernel/setup.c b/arch/h8300/kernel/setup.c
new file mode 100644 (file)
index 0000000..be469a3
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ *  linux/arch/h8300/kernel/setup.c
+ *
+ *  Copyright (C) 2001-2014 Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+/*
+ * This file handles the architecture-dependent parts of system setup
+ */
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/mm.h>
+#include <linux/fs.h>
+#include <linux/console.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/bootmem.h>
+#include <linux/seq_file.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <asm/setup.h>
+#include <asm/irq.h>
+#include <asm/pgtable.h>
+#include <asm/sections.h>
+#include <asm/bootparams.h>
+
+#if defined(CONFIG_CPU_H8300H)
+#define CPU "H8/300H"
+#include <asm/regs306x.h>
+#endif
+
+#if defined(CONFIG_CPU_H8S)
+#define CPU "H8S"
+#include <asm/regs267x.h>
+#endif
+
+struct bootparams bootparams;
+unsigned long rom_length;
+unsigned long memory_start;
+unsigned long memory_end;
+
+char __initdata command_line[COMMAND_LINE_SIZE];
+
+extern unsigned long _ramend;
+void early_device_register(void);
+void sim_console_register(void);
+
+void __init setup_arch(char **cmdline_p)
+{
+       int bootmap_size;
+
+#if defined(CONFIG_ROMKERNEL)
+       bootparams.ram_end = CONFIG_RAMBASE + CONFIG_RAMSIZE;
+       bootparams.clock_freq = CONFIG_CPU_CLOCK;
+#endif
+
+       memory_start = (unsigned long) &_ramend;
+
+       memory_start = PAGE_ALIGN(memory_start);
+       memory_end = bootparams.ram_end;
+
+       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; 
+
+       pr_notice("\r\n\nuClinux " CPU "\n");
+       pr_notice("Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");
+
+       strcpy(boot_command_line, command_line);
+       *cmdline_p = command_line;
+
+       parse_early_param();
+
+       /*
+        * 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, BOOTMEM_DEFAULT);
+
+       early_device_register();
+#if defined(CONFIG_H8300H_SIM) || defined(CONFIG_H8S_SIM)
+       sim_console_register();
+#endif
+       early_platform_driver_probe("earlyprintk", 1, 0);
+       /*
+        * get kmalloc into gear
+        */
+       paging_init();
+}
+
+/*
+ *     Get CPU information for use by the procfs.
+ */
+
+static int show_cpuinfo(struct seq_file *m, void *v)
+{
+    char *cpu;
+    int mode;
+    u_long clockfreq;
+
+    cpu = CPU;
+    mode = *(volatile unsigned char *)MDCR & 0x07;
+
+    clockfreq = bootparams.clock_freq;
+
+    seq_printf(m,  "CPU:\t\t%s (mode:%d)\n"
+                  "Clock:\t\t%lu.%1luMHz\n"
+                  "BogoMips:\t%lu.%02lu\n"
+                  "Calibration:\t%lu loops\n",
+                  cpu,mode,
+                  clockfreq/1000,clockfreq%1000,
+                  (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100,
+                  (loops_per_jiffy*HZ));
+
+    return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+       return *pos < NR_CPUS ? ((void *) 0x12345678) : NULL;
+}
+
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+       ++*pos;
+       return c_start(m, pos);
+}
+
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+
+const struct seq_operations cpuinfo_op = {
+       .start  = c_start,
+       .next   = c_next,
+       .stop   = c_stop,
+       .show   = show_cpuinfo,
+};
+
+unsigned int get_cpu_clock(void)
+{
+       return bootparams.clock_freq;
+}
diff --git a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c
new file mode 100644 (file)
index 0000000..a65ff3b
--- /dev/null
@@ -0,0 +1,444 @@
+/*
+ *  linux/arch/h8300/kernel/signal.c
+ *
+ *  Copyright (C) 1991, 1992  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.
+ */
+
+/*
+ * uClinux H8/300 support by Yoshinori Sato <ysato@users.sourceforge.jp>
+ *                and David McCullough <davidm@snapgear.com>
+ *
+ * Based on
+ * Linux/m68k by Hamish Macdonald
+ */
+
+/*
+ * ++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!
+ */
+
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/signal.h>
+#include <linux/syscalls.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/personality.h>
+#include <linux/tty.h>
+#include <linux/binfmts.h>
+#include <linux/tracehook.h>
+
+#include <asm/setup.h>
+#include <asm/uaccess.h>
+#include <asm/pgtable.h>
+#include <asm/traps.h>
+#include <asm/ucontext.h>
+
+/*
+ * 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
+{
+       long dummy_er0;
+       long dummy_vector;
+#if defined(CONFIG_CPU_H8S)
+       short dummy_exr;
+#endif
+       long dummy_pc;
+       char *pretcode;
+       unsigned char retcode[8];
+       unsigned long extramask[_NSIG_WORDS-1];
+       struct sigcontext sc;
+       int sig;
+} __attribute__((aligned(2),packed));
+
+struct rt_sigframe
+{
+       long dummy_er0;
+       long dummy_vector;
+#if defined(CONFIG_CPU_H8S)
+       short dummy_exr;
+#endif
+       long dummy_pc;
+       char *pretcode;
+       struct siginfo *pinfo;
+       void *puc;
+       unsigned char retcode[8];
+       struct siginfo info;
+       struct ucontext uc;
+       int sig;
+} __attribute__((aligned(2),packed));
+
+static inline int
+restore_sigcontext(struct sigcontext *usc, int *pd0)
+{
+       struct pt_regs *regs = current_pt_regs();
+       int err = 0;
+       unsigned int ccr;
+       unsigned int usp;
+       unsigned int er0;
+
+       /* Always make any pending restarted system calls return -EINTR */
+       current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
+#define COPY(r) err |= __get_user(regs->r, &usc->sc_##r)    /* restore passed registers */
+       COPY(er1);
+       COPY(er2);
+       COPY(er3);
+       COPY(er5);
+       COPY(pc);
+       ccr = regs->ccr & 0x10;
+       COPY(ccr);
+#undef COPY
+       regs->ccr &= 0xef;
+       regs->ccr |= ccr;
+       regs->orig_er0 = -1;            /* disable syscall checks */
+       err |= __get_user(usp, &usc->sc_usp);
+       wrusp(usp);
+
+       err |= __get_user(er0, &usc->sc_er0);
+       *pd0 = er0;
+       return err;
+}
+
+asmlinkage int sys_sigreturn(void)
+{
+       unsigned long usp = rdusp();
+       struct sigframe *frame = (struct sigframe *)(usp - 4);
+       sigset_t set;
+       int er0;
+
+       if (!access_ok(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;
+
+       set_current_blocked(&set);
+       
+       if (restore_sigcontext(&frame->sc, &er0))
+               goto badframe;
+       return er0;
+
+badframe:
+       force_sig(SIGSEGV, current);
+       return 0;
+}
+
+asmlinkage int sys_rt_sigreturn(void)
+{
+       unsigned long usp = rdusp();
+       struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4);
+       sigset_t set;
+       int er0;
+
+       if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
+               goto badframe;
+       if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
+               goto badframe;
+
+       set_current_blocked(&set);
+       
+       if (restore_sigcontext(&frame->uc.uc_mcontext, &er0))
+               goto badframe;
+
+       if (restore_altstack(&frame->uc.uc_stack))
+               goto badframe;
+
+       return er0;
+
+badframe:
+       force_sig(SIGSEGV, current);
+       return 0;
+}
+
+static int setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
+                            unsigned long mask)
+{
+       int err = 0;
+
+       err |= __put_user(regs->er0, &sc->sc_er0);
+       err |= __put_user(regs->er1, &sc->sc_er1);
+       err |= __put_user(regs->er2, &sc->sc_er2);
+       err |= __put_user(regs->er3, &sc->sc_er3);
+       err |= __put_user(regs->er4, &sc->sc_er4);
+       err |= __put_user(regs->er5, &sc->sc_er5);
+       err |= __put_user(regs->er6, &sc->sc_er6);
+       err |= __put_user(rdusp(),   &sc->sc_usp);
+       err |= __put_user(regs->pc,  &sc->sc_pc);
+       err |= __put_user(regs->ccr, &sc->sc_ccr);
+       err |= __put_user(mask,      &sc->sc_mask);
+
+       return err;
+}
+
+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 = rdusp();
+
+       /* This is the X/Open sanctioned signal stack switching.  */
+       if (ka->sa.sa_flags & SA_ONSTACK) {
+               if (!sas_ss_flags(usp))
+                       usp = current->sas_ss_sp + current->sas_ss_size;
+       }
+       return (void *)((usp - frame_size) & -8UL);
+}
+
+static int setup_frame (int sig, struct k_sigaction *ka,
+                        sigset_t *set, struct pt_regs *regs)
+{
+       struct sigframe *frame;
+       int err = 0;
+       int usig;
+       unsigned char *ret;
+
+       frame = get_sigframe(ka, regs, sizeof(*frame));
+
+       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+               goto give_sigsegv;
+
+       usig = current_thread_info()->exec_domain
+               && current_thread_info()->exec_domain->signal_invmap
+               && sig < 32
+               ? current_thread_info()->exec_domain->signal_invmap[sig]
+               : sig;
+
+       err |= __put_user(usig, &frame->sig);
+       if (err)
+               goto give_sigsegv;
+
+       err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
+       if (err)
+               goto give_sigsegv;
+
+       if (_NSIG_WORDS > 1) {
+               err |= copy_to_user(frame->extramask, &set->sig[1],
+                                   sizeof(frame->extramask));
+               if (err)
+                       goto give_sigsegv;
+       }
+
+       ret = frame->retcode;
+       if (ka->sa.sa_flags & SA_RESTORER)
+               ret = (unsigned char *)(ka->sa.sa_restorer);
+       else {
+               /* sub.l er0,er0; mov.b #__NR_sigreturn,r0l; trapa #0 */
+               err |= __put_user(0x1a80f800 + (__NR_sigreturn & 0xff),
+                                 (unsigned long *)(frame->retcode + 0));
+               err |= __put_user(0x5700, (unsigned short *)(frame->retcode + 4));
+       }
+
+       /* Set up to return from userspace.  */
+       err |= __put_user(ret, &frame->pretcode);
+
+       if (err)
+               goto give_sigsegv;
+
+       /* Set up registers for signal handler */
+       wrusp ((unsigned long) frame);
+       regs->pc = (unsigned long) ka->sa.sa_handler;
+       regs->er0 = (current_thread_info()->exec_domain
+                          && current_thread_info()->exec_domain->signal_invmap
+                          && sig < 32
+                          ? current_thread_info()->exec_domain->signal_invmap[sig]
+                         : sig);
+       regs->er1 = (unsigned long)&(frame->sc);
+       regs->er5 = current->mm->start_data;    /* GOT base */
+
+       return 0;
+
+give_sigsegv:
+       force_sigsegv(sig, current);
+       return -EFAULT;
+}
+
+static int 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;
+       int usig;
+       unsigned char *ret;
+
+       frame = get_sigframe(ka, regs, sizeof(*frame));
+
+       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+               goto give_sigsegv;
+
+       usig = current_thread_info()->exec_domain
+               && current_thread_info()->exec_domain->signal_invmap
+               && sig < 32
+               ? current_thread_info()->exec_domain->signal_invmap[sig]
+               : sig;
+
+       err |= __put_user(usig, &frame->sig);
+       if (err)
+               goto give_sigsegv;
+
+       err |= __put_user(&frame->info, &frame->pinfo);
+       err |= __put_user(&frame->uc, &frame->puc);
+       err |= copy_siginfo_to_user(&frame->info, info);
+       if (err)
+               goto give_sigsegv;
+
+       /* Create the ucontext.  */
+       err |= __put_user(0, &frame->uc.uc_flags);
+       err |= __put_user(0, &frame->uc.uc_link);
+       err |= __save_altstack(&frame->uc.uc_stack, rdusp());
+       err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
+       err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
+       if (err)
+               goto give_sigsegv;
+
+       /* Set up to return from userspace.  */
+       ret = frame->retcode;
+       if (ka->sa.sa_flags & SA_RESTORER)
+               ret = (unsigned char *)(ka->sa.sa_restorer);
+       else {
+               /* sub.l er0,er0; mov.b #__NR_sigreturn,r0l; trapa #0 */
+               err |= __put_user(0x1a80f800 + (__NR_sigreturn & 0xff),
+                                 (unsigned long *)(frame->retcode + 0));
+               err |= __put_user(0x5700, (unsigned short *)(frame->retcode + 4));
+       }
+       err |= __put_user(ret, &frame->pretcode);
+
+       if (err)
+               goto give_sigsegv;
+
+       /* Set up registers for signal handler */
+       wrusp ((unsigned long) frame);
+       regs->pc  = (unsigned long) ka->sa.sa_handler;
+       regs->er0 = (current_thread_info()->exec_domain
+                    && current_thread_info()->exec_domain->signal_invmap
+                    && sig < 32
+                    ? current_thread_info()->exec_domain->signal_invmap[sig]
+                    : sig);
+       regs->er1 = (unsigned long)&(frame->info);
+       regs->er2 = (unsigned long)&frame->uc;
+       regs->er5 = current->mm->start_data;    /* GOT base */
+
+       return 0;
+
+give_sigsegv:
+       force_sigsegv(sig, current);
+       return -EFAULT;
+}
+
+/*
+ * OK, we're invoking a handler
+ */
+static void
+handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
+             struct pt_regs * regs)
+{
+       sigset_t *oldset = sigmask_to_save();
+       int ret;
+       /* are we from a system call? */
+       if (regs->orig_er0 >= 0) {
+               switch (regs->er0) {
+                       case -ERESTART_RESTARTBLOCK:
+                       case -ERESTARTNOHAND:
+                               regs->er0 = -EINTR;
+                               break;
+
+                       case -ERESTARTSYS:
+                               if (!(ka->sa.sa_flags & SA_RESTART)) {
+                                       regs->er0 = -EINTR;
+                                       break;
+                               }
+                       /* fallthrough */
+                       case -ERESTARTNOINTR:
+                               regs->er0 = regs->orig_er0;
+                               regs->pc -= 2;
+               }
+       }
+
+       /* set up the stack frame */
+       if (ka->sa.sa_flags & SA_SIGINFO)
+               ret = setup_rt_frame(sig, ka, info, oldset, regs);
+       else
+               ret = setup_frame(sig, ka, oldset, regs);
+
+       if (!ret)
+               signal_delivered(sig, info, ka, regs, 0);
+}
+
+/*
+ * 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.
+ */
+static void do_signal(struct pt_regs *regs)
+{
+       siginfo_t info;
+       int signr;
+       struct k_sigaction ka;
+
+       /*
+        * 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 ((regs->ccr & 0x10))
+               return;
+
+       current->thread.esp0 = (unsigned long) regs;
+
+       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+       if (signr > 0) {
+               /* Whee!  Actually deliver the signal.  */
+               handle_signal(signr, &info, &ka, regs);
+               return;
+       }
+       /* Did we come from a system call? */
+       if (regs->orig_er0 >= 0) {
+               /* Restart the system call - no handlers present */
+               if (regs->er0 == -ERESTARTNOHAND ||
+                   regs->er0 == -ERESTARTSYS ||
+                   regs->er0 == -ERESTARTNOINTR) {
+                       regs->er0 = regs->orig_er0;
+                       regs->pc -= 2;
+               }
+               if (regs->er0 == -ERESTART_RESTARTBLOCK){
+                       regs->er0 = __NR_restart_syscall;
+                       regs->pc -= 2;
+               }
+       }
+
+       /* If there's no signal to deliver, we just restore the saved mask.  */
+       restore_saved_sigmask();
+}
+
+asmlinkage void do_notify_resume(struct pt_regs *regs, u32 thread_info_flags)
+{
+       if (thread_info_flags & _TIF_SIGPENDING)
+               do_signal(regs);
+
+       if (thread_info_flags & _TIF_NOTIFY_RESUME) {
+               clear_thread_flag(TIF_NOTIFY_RESUME);
+               tracehook_notify_resume(regs);
+       }
+}
diff --git a/arch/h8300/kernel/sim-console.c b/arch/h8300/kernel/sim-console.c
new file mode 100644 (file)
index 0000000..c93813b
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * arch/h8300/kernel/early_printk.c
+ *
+ *  Copyright (C) 2009 Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * 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/console.h>
+#include <linux/tty.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+
+static void sim_write(struct console *co, const char *ptr,
+                                unsigned len)
+{
+       register const int fd __asm__("er0") = 1; /* stdout */
+       register const char *_ptr __asm__("er1") = ptr;
+       register const unsigned _len __asm__("er2") = len;
+       __asm__(".byte 0x5e,0x00,0x00,0xc7\n\t" /* jsr @0xc7 (sys_write) */
+               ::"g"(fd),"g"(_ptr),"g"(_len));
+}
+
+static struct console sim_console = {
+       .name           = "sim_console",
+       .write          = sim_write,
+       .setup          = NULL,
+       .flags          = CON_PRINTBUFFER,
+       .index          = -1,
+};
+
+static char sim_console_buf[32];
+
+static int sim_probe(struct platform_device *pdev)
+{
+       if (sim_console.data)
+               return -EEXIST;
+
+       if (!strstr(sim_console_buf, "keep"))
+               sim_console.flags |= CON_BOOT;
+
+       register_console(&sim_console);
+       return 0;
+}
+
+static int sim_remove(struct platform_device *pdev)
+{
+       return 0;
+}
+
+static struct platform_driver sim_driver = {
+       .probe          = sim_probe,
+       .remove         = sim_remove,
+       .driver         = {
+               .name   = "h8300-sim",
+               .owner  = THIS_MODULE,
+       },
+};
+
+early_platform_init_buffer("earlyprintk", &sim_driver,
+                          sim_console_buf, ARRAY_SIZE(sim_console_buf));
+
+static struct platform_device sim_console_device = {
+       .name           = "h8300-sim",
+       .id             = 0,
+};
+
+static struct platform_device *devices[] __initdata = {
+       &sim_console_device,
+};
+
+void __init sim_console_register(void)
+{
+       early_platform_add_devices(devices,
+                                  ARRAY_SIZE(devices));
+}
diff --git a/arch/h8300/kernel/sys_h8300.c b/arch/h8300/kernel/sys_h8300.c
new file mode 100644 (file)
index 0000000..d01e746
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * linux/arch/h8300/kernel/sys_h8300.c
+ *
+ * This file contains various random system calls that
+ * have a non-standard calling sequence on the H8/300
+ * platform.
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/smp.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/fs.h>
+#include <linux/ipc.h>
+
+#include <asm/setup.h>
+#include <asm/uaccess.h>
+#include <asm/traps.h>
+#include <asm/unistd.h>
+
+/* sys_cacheflush -- no support.  */
+asmlinkage int
+sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
+{
+       return -EINVAL;
+}
+
+asmlinkage int sys_getpagesize(void)
+{
+       return PAGE_SIZE;
+}
+
+#if defined(CONFIG_SYSCALL_PRINT)
+asmlinkage void syscall_print(void *dummy,...)
+{
+       struct pt_regs *regs = (struct pt_regs *) ((unsigned char *)&dummy-4);
+       printk("call %06lx:%ld 1:%08lx,2:%08lx,3:%08lx,ret:%08lx\n",
+               ((regs->pc)&0xffffff)-2,regs->orig_er0,regs->er1,regs->er2,regs->er3,regs->er0);
+}
+#endif
diff --git a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S
new file mode 100644 (file)
index 0000000..e8c5620
--- /dev/null
@@ -0,0 +1,340 @@
+/* Systemcall Entry Table */
+#include <linux/sys.h>
+#include <asm/linkage.h>
+#include <asm/unistd.h>
+       
+       .global _sys_call_table
+
+#define CALL(x)        .long x
+
+.globl _sys_call_table
+
+#if defined(CONFIG_CPU_H8300H)
+       .h8300h
+#endif
+#if defined(CONFIG_CPU_H8S)
+       .h8300s
+#endif
+       .section .text
+       .align  2
+_sys_call_table:
+       CALL(sys_ni_syscall)            /* 0  -  old "setup()" system call*/
+       CALL(sys_exit)
+       CALL(sys_fork)
+       CALL(sys_read)
+       CALL(sys_write)
+       CALL(sys_open)                  /* 5 */
+       CALL(sys_close)
+       CALL(sys_waitpid)
+       CALL(sys_creat)
+       CALL(sys_link)
+       CALL(sys_unlink)                /* 10 */
+       CALL(sys_execve)
+       CALL(sys_chdir)
+       CALL(sys_time)
+       CALL(sys_mknod)
+       CALL(sys_chmod)                 /* 15 */
+       CALL(sys_chown16)
+       CALL(sys_ni_syscall)            /* old break syscall holder */
+       CALL(sys_stat)
+       CALL(sys_lseek)
+       CALL(sys_getpid)                /* 20 */
+       CALL(sys_mount)
+       CALL(sys_oldumount)
+       CALL(sys_setuid16)
+       CALL(sys_getuid16)
+       CALL(sys_stime)                 /* 25 */
+       CALL(sys_ptrace)
+       CALL(sys_alarm)
+       CALL(sys_fstat)
+       CALL(sys_pause)
+       CALL(sys_utime)                 /* 30 */
+       CALL(sys_ni_syscall)            /* old stty syscall holder */
+       CALL(sys_ni_syscall)            /* old gtty syscall holder */
+       CALL(sys_access)
+       CALL(sys_nice)
+       CALL(sys_ni_syscall)            /* 35 old ftime syscall holder */
+       CALL(sys_sync)
+       CALL(sys_kill)
+       CALL(sys_rename)
+       CALL(sys_mkdir)
+       CALL(sys_rmdir)                 /* 40 */
+       CALL(sys_dup)
+       CALL(sys_pipe)
+       CALL(sys_times)
+       CALL(sys_ni_syscall)            /* old prof syscall holder */
+       CALL(sys_brk)                   /* 45 */
+       CALL(sys_setgid16)
+       CALL(sys_getgid16)
+       CALL(sys_signal)
+       CALL(sys_geteuid16)
+       CALL(sys_getegid16)             /* 50 */
+       CALL(sys_acct)
+       CALL(sys_umount)                /* recycled never used phys() */
+       CALL(sys_ni_syscall)            /* old lock syscall holder */
+       CALL(sys_ioctl)
+       CALL(sys_fcntl)                 /* 55 */
+       CALL(sys_ni_syscall)            /* old mpx syscall holder */
+       CALL(sys_setpgid)
+       CALL(sys_ni_syscall)            /* old ulimit syscall holder */
+       CALL(sys_ni_syscall)
+       CALL(sys_umask)                 /* 60 */
+       CALL(sys_chroot)
+       CALL(sys_ustat)
+       CALL(sys_dup2)
+       CALL(sys_getppid)
+       CALL(sys_getpgrp)               /* 65 */
+       CALL(sys_setsid)
+       CALL(sys_ni_syscall)
+       CALL(sys_sgetmask)
+       CALL(sys_ssetmask)
+       CALL(sys_setreuid16)            /* 70 */
+       CALL(sys_setregid16)
+       CALL(sys_ni_syscall)
+       CALL(sys_sigpending)
+       CALL(sys_sethostname)
+       CALL(sys_setrlimit)             /* 75 */
+       CALL(sys_old_getrlimit)
+       CALL(sys_getrusage)
+       CALL(sys_gettimeofday)
+       CALL(sys_settimeofday)
+       CALL(sys_getgroups16)           /* 80 */
+       CALL(sys_setgroups16)
+       CALL(sys_old_select)
+       CALL(sys_symlink)
+       CALL(sys_lstat)
+       CALL(sys_readlink)              /* 85 */
+       CALL(sys_uselib)
+       CALL(sys_swapon)
+       CALL(sys_reboot)
+       CALL(sys_old_readdir)
+       CALL(sys_old_mmap)              /* 90 */
+       CALL(sys_munmap)
+       CALL(sys_truncate)
+       CALL(sys_ftruncate)
+       CALL(sys_fchmod)
+       CALL(sys_fchown16)              /* 95 */
+       CALL(sys_getpriority)
+       CALL(sys_setpriority)
+       CALL(sys_ni_syscall)            /* old profil syscall holder */
+       CALL(sys_statfs)
+       CALL(sys_fstatfs)               /* 100 */
+       CALL(sys_ni_syscall)            /* ioperm for i386 */
+       CALL(sys_socketcall)
+       CALL(sys_syslog)
+       CALL(sys_setitimer)
+       CALL(sys_getitimer)             /* 105 */
+       CALL(sys_newstat)
+       CALL(sys_newlstat)
+       CALL(sys_newfstat)
+       CALL(sys_ni_syscall)
+       CALL(sys_ni_syscall)            /* iopl for i386 */ /* 110 */
+       CALL(sys_vhangup)
+       CALL(sys_ni_syscall)            /* obsolete idle() syscall */
+       CALL(sys_ni_syscall)            /* vm86old for i386 */
+       CALL(sys_wait4)
+       CALL(sys_swapoff)               /* 115 */
+       CALL(sys_sysinfo)
+       CALL(sys_ipc)
+       CALL(sys_fsync)
+       CALL(sys_sigreturn)
+       CALL(sys_clone)                 /* 120 */
+       CALL(sys_setdomainname)
+       CALL(sys_newuname)
+       CALL(sys_cacheflush)            /* modify_ldt for i386 */
+       CALL(sys_adjtimex)
+       CALL(sys_ni_syscall)            /* 125 sys_mprotect */
+       CALL(sys_sigprocmask)
+       CALL(sys_ni_syscall)            /* sys_create_module */
+       CALL(sys_init_module)
+       CALL(sys_delete_module)
+       CALL(sys_ni_syscall)            /* 130 sys_get_kernel_syms */
+       CALL(sys_quotactl)
+       CALL(sys_getpgid)
+       CALL(sys_fchdir)
+       CALL(sys_bdflush)
+       CALL(sys_sysfs)                 /* 135 */
+       CALL(sys_personality)
+       CALL(sys_ni_syscall)            /* for afs_syscall */
+       CALL(sys_setfsuid16)
+       CALL(sys_setfsgid16)
+       CALL(sys_llseek)                /* 140 */
+       CALL(sys_getdents)
+       CALL(sys_select)
+       CALL(sys_flock)
+       CALL(sys_ni_syscall)            /* sys_msync */
+       CALL(sys_readv)                 /* 145 */
+       CALL(sys_writev)
+       CALL(sys_getsid)
+       CALL(sys_fdatasync)
+       CALL(sys_sysctl)
+       CALL(sys_ni_syscall)            /* 150 sys_mlock */
+       CALL(sys_ni_syscall)            /* sys_munlock */
+       CALL(sys_ni_syscall)            /* sys_mlockall */
+       CALL(sys_ni_syscall)            /* sys_munlockall */
+       CALL(sys_sched_setparam)
+       CALL(sys_sched_getparam)        /* 155 */
+       CALL(sys_sched_setscheduler)
+       CALL(sys_sched_getscheduler)
+       CALL(sys_sched_yield)
+       CALL(sys_sched_get_priority_max)
+       CALL(sys_sched_get_priority_min)  /* 160 */
+       CALL(sys_sched_rr_get_interval)
+       CALL(sys_nanosleep)
+       CALL(sys_ni_syscall)            /* sys_mremap */
+       CALL(sys_setresuid16)
+       CALL(sys_getresuid16)           /* 165 */
+       CALL(sys_ni_syscall)            /* for vm86 */
+       CALL(sys_ni_syscall)            /* sys_query_module */
+       CALL(sys_poll)
+       CALL(sys_ni_syscall)            /* old nfsservctl */
+       CALL(sys_setresgid16)           /* 170 */
+       CALL(sys_getresgid16)
+       CALL(sys_prctl)
+       CALL(sys_rt_sigreturn)
+       CALL(sys_rt_sigaction)
+       CALL(sys_rt_sigprocmask)        /* 175 */
+       CALL(sys_rt_sigpending)
+       CALL(sys_rt_sigtimedwait)
+       CALL(sys_rt_sigqueueinfo)
+       CALL(sys_rt_sigsuspend)
+       CALL(sys_pread64)               /* 180 */
+       CALL(sys_pwrite64)
+       CALL(sys_lchown16);
+       CALL(sys_getcwd)
+       CALL(sys_capget)
+       CALL(sys_capset)                /* 185 */
+       CALL(sys_sigaltstack)
+       CALL(sys_sendfile)
+       CALL(sys_ni_syscall)            /* streams1 */
+       CALL(sys_ni_syscall)            /* streams2 */
+       CALL(sys_vfork)                 /* 190 */
+       CALL(sys_getrlimit)
+       CALL(sys_mmap_pgoff)
+       CALL(sys_truncate64)
+       CALL(sys_ftruncate64)
+       CALL(sys_stat64)                /* 195 */
+       CALL(sys_lstat64)
+       CALL(sys_fstat64)
+       CALL(sys_chown)
+       CALL(sys_getuid)
+       CALL(sys_getgid)                /* 200 */
+       CALL(sys_geteuid)
+       CALL(sys_getegid)
+       CALL(sys_setreuid)
+       CALL(sys_setregid)
+       CALL(sys_getgroups)             /* 205 */
+       CALL(sys_setgroups)
+       CALL(sys_fchown)
+       CALL(sys_setresuid)
+       CALL(sys_getresuid)
+       CALL(sys_setresgid)             /* 210 */
+       CALL(sys_getresgid)
+       CALL(sys_lchown)
+       CALL(sys_setuid)
+       CALL(sys_setgid)
+       CALL(sys_setfsuid)              /* 215 */
+       CALL(sys_setfsgid)
+       CALL(sys_pivot_root)
+       CALL(sys_ni_syscall)
+       CALL(sys_ni_syscall)
+       CALL(sys_getdents64)            /* 220 */
+       CALL(sys_fcntl64)
+       CALL(sys_ni_syscall)            /* reserved TUX */
+       CALL(sys_ni_syscall)            /* reserved Security */
+       CALL(sys_gettid)
+       CALL(sys_readahead)             /* 225 */
+       CALL(sys_setxattr)
+       CALL(sys_lsetxattr)
+       CALL(sys_fsetxattr)
+       CALL(sys_getxattr)
+       CALL(sys_lgetxattr)             /* 230 */
+       CALL(sys_fgetxattr)
+       CALL(sys_listxattr)
+       CALL(sys_llistxattr)
+       CALL(sys_flistxattr)
+       CALL(sys_removexattr)           /* 235 */
+       CALL(sys_lremovexattr)
+       CALL(sys_fremovexattr)
+       CALL(sys_tkill)
+       CALL(sys_sendfile64)
+       CALL(sys_futex)                 /* 240 */
+       CALL(sys_sched_setaffinity)
+       CALL(sys_sched_getaffinity)
+       CALL(sys_ni_syscall)
+       CALL(sys_ni_syscall)
+       CALL(sys_io_setup)              /* 245 */
+       CALL(sys_io_destroy)
+       CALL(sys_io_getevents)
+       CALL(sys_io_submit)
+       CALL(sys_io_cancel)
+       CALL(sys_fadvise64)             /* 250 */
+       CALL(sys_ni_syscall)
+       CALL(sys_exit_group)
+       CALL(sys_lookup_dcookie)
+       CALL(sys_epoll_create)
+       CALL(sys_epoll_ctl)             /* 255 */
+       CALL(sys_epoll_wait)
+       CALL(sys_ni_syscall)            /* sys_remap_file_pages */
+       CALL(sys_set_tid_address)
+       CALL(sys_timer_create)
+       CALL(sys_timer_settime)         /* 260 */
+       CALL(sys_timer_gettime)
+       CALL(sys_timer_getoverrun)
+       CALL(sys_timer_delete)
+       CALL(sys_clock_settime)
+       CALL(sys_clock_gettime)         /* 265 */
+       CALL(sys_clock_getres)
+       CALL(sys_clock_nanosleep)
+       CALL(sys_statfs64)
+       CALL(sys_fstatfs64)
+       CALL(sys_tgkill)                /* 270 */
+       CALL(sys_utimes)
+       CALL(sys_fadvise64_64)
+       CALL(sys_ni_syscall)            /* sys_vserver */
+       CALL(sys_ni_syscall)
+       CALL(sys_get_mempolicy)         /* 275 */
+       CALL(sys_set_mempolicy)
+       CALL(sys_mq_open)
+       CALL(sys_mq_unlink)
+       CALL(sys_mq_timedsend)
+       CALL(sys_mq_timedreceive)       /* 280 */
+       CALL(sys_mq_notify)
+       CALL(sys_mq_getsetattr)
+       CALL(sys_waitid)
+       CALL(sys_ni_syscall)            /* sys_kexec_load */
+       CALL(sys_add_key)               /* 285 */
+       CALL(sys_request_key)
+       CALL(sys_keyctl)
+       CALL(sys_ioprio_set)
+       CALL(sys_ioprio_get)            /* 290 */
+       CALL(sys_inotify_init)
+       CALL(sys_inotify_add_watch)
+       CALL(sys_inotify_rm_watch)
+       CALL(sys_migrate_pages)
+       CALL(sys_openat)                /* 295 */
+       CALL(sys_mkdirat)
+       CALL(sys_mknodat)
+       CALL(sys_fchownat)
+       CALL(sys_futimesat)
+       CALL(sys_fstatat64)             /* 300 */
+       CALL(sys_unlinkat)
+       CALL(sys_renameat)
+       CALL(sys_linkat)
+       CALL(sys_symlinkat)
+       CALL(sys_readlinkat)            /* 305 */
+       CALL(sys_fchmodat)
+       CALL(sys_faccessat)
+       CALL(sys_ni_syscall)            /* sys_pselect6 */
+       CALL(sys_ni_syscall)            /* sys_ppoll */
+       CALL(sys_unshare)               /* 310 */
+       CALL(sys_set_robust_list)
+       CALL(sys_get_robust_list)
+       CALL(sys_splice)
+       CALL(sys_sync_file_range)
+       CALL(sys_tee)                   /* 315 */
+       CALL(sys_vmsplice)
+       CALL(sys_ni_syscall)            /* sys_move_pages */
+       CALL(sys_getcpu)
+       CALL(sys_ni_syscall)            /* sys_epoll_pwait */
+       CALL(sys_setns)                 /* 320 */
diff --git a/arch/h8300/kernel/time.c b/arch/h8300/kernel/time.c
new file mode 100644 (file)
index 0000000..dc08d3b
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ *  linux/arch/h8300/kernel/time.c
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
+ *
+ * This file contains the m68k-specific time handling details.
+ * Most of the stuff is located in the machine specific files.
+ *
+ * 1997-09-10  Updated NTP code according to technical memorandum Jan '96
+ *             "A Kernel Model for Precision Timekeeping" by Dave Mills
+ */
+
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/timex.h>
+#include <linux/profile.h>
+#include <linux/platform_device.h>
+
+#include <asm/io.h>
+#include <asm/irq_regs.h>
+#include <asm/timer.h>
+#include <asm/irq_regs.h>
+
+#define        TICK_SIZE (tick_nsec / 1000)
+
+void h8300_timer_tick(void)
+{
+       if (current->pid)
+               profile_tick(CPU_PROFILING);
+       xtime_update(1);
+       update_process_times(user_mode(get_irq_regs()));
+}
+
+void __init timer_setup(void)
+{
+       early_platform_driver_register_all("earlytimer");
+       early_platform_driver_probe("earlytimer", 1, 0);
+}
+
+void __init time_init(void)
+{
+       late_time_init = timer_setup;
+}
diff --git a/arch/h8300/kernel/timer/Makefile b/arch/h8300/kernel/timer/Makefile
new file mode 100644 (file)
index 0000000..86e8766
--- /dev/null
@@ -0,0 +1,5 @@
+# h8300 internal timer handler
+
+obj-y  := timer8.o
+obj-$(CONFIG_H83069) += timer16.o
+obj-$(CONFIG_H8S2674) += tpu.o
diff --git a/arch/h8300/kernel/timer/timer16.c b/arch/h8300/kernel/timer/timer16.c
new file mode 100644 (file)
index 0000000..e278ae2
--- /dev/null
@@ -0,0 +1,310 @@
+/*
+ *  linux/arch/h8300/kernel/timer/timer16.c
+ *
+ *  Yoshinori Sato <ysato@users.sourcefoge.jp>
+ *
+ *  16bit Timer clockevent device
+ *
+ */
+
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/clocksource.h>
+#include <linux/clockchips.h>
+
+#include <asm/segment.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/timer.h>
+
+#define TSTR   0
+#define TSNC   1
+#define TMDR   2
+#define TOLR   3
+#define TISRA  4
+#define TISRB  5
+#define TISRC  6
+
+#define TCR    0
+#define TIOR   1
+#define TCNT   2
+#define GRA    4
+#define GRB    6
+
+#define FLAG_REPROGRAM (1 << 0)
+#define FLAG_SKIPEVENT (1 << 1)
+#define FLAG_IRQCONTEXT (1 << 2)
+#define FLAG_STARTED (1 << 3)
+
+#define ONESHOT  0
+#define PERIODIC 1
+
+#define RELATIVE 0
+#define ABSOLUTE 1
+
+struct timer16_priv {
+       struct platform_device *pdev;
+       struct clock_event_device ced;
+       struct irqaction irqaction;
+       unsigned long mapbase;
+       unsigned long mapcommon;
+       unsigned long flags;
+       unsigned int rate;
+       unsigned short gra;
+       unsigned char enable;
+       unsigned char imfa;
+       unsigned char imiea;
+       unsigned char ovf;
+       raw_spinlock_t lock;
+};
+
+static unsigned long timer16_get_counter(struct timer16_priv *p)
+{
+       unsigned long v1, v2, v3;
+       int o1, o2;
+
+       o1 = ctrl_inb(p->mapcommon + TISRC) & p->ovf;
+
+       /* Make sure the timer value is stable. Stolen from acpi_pm.c */
+       do {
+               o2 = o1;
+               v1 = ctrl_inw(p->mapbase + TCNT);
+               v2 = ctrl_inw(p->mapbase + TCNT);
+               v3 = ctrl_inw(p->mapbase + TCNT);
+               o1 = ctrl_inb(p->mapcommon + TISRC) & p->ovf;
+       } while (unlikely((o1 != o2) || (v1 > v2 && v1 < v3)
+                         || (v2 > v3 && v2 < v1) || (v3 > v1 && v3 < v2)));
+
+       v2 |= 0x10000;
+       return v2;
+}
+
+
+static irqreturn_t timer16_interrupt(int irq, void *dev_id)
+{
+       struct timer16_priv *p = (struct timer16_priv *)dev_id;
+       ctrl_outb(ctrl_inb(p->mapcommon + TISRA) & ~p->imfa,
+                 p->mapcommon + TISRA);
+
+       p->flags |= FLAG_IRQCONTEXT;
+       ctrl_outw(p->gra, p->mapbase + GRA);
+       if (!(p->flags & FLAG_SKIPEVENT)) {
+               if (p->ced.mode == CLOCK_EVT_MODE_ONESHOT) {
+                       ctrl_outb(ctrl_inb(p->mapcommon + TSTR) & ~p->enable,
+                                 p->mapcommon + TISRA);
+               }
+               p->ced.event_handler(&p->ced);
+       }
+
+       p->flags &= ~(FLAG_SKIPEVENT | FLAG_IRQCONTEXT);
+
+       return IRQ_HANDLED;
+}
+
+static void timer16_set_next(struct timer16_priv *p, unsigned long delta)
+{
+       unsigned long flags;
+       unsigned long now;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+       if (delta >= 0x10000)
+               dev_warn(&p->pdev->dev, "delta out of range\n");
+       now = timer16_get_counter(p);
+       p->gra = delta;
+       ctrl_outb(ctrl_inb(p->mapcommon + TISRA) | p->imiea,
+                 p->mapcommon + TISRA);
+       if (delta > now)
+               ctrl_outw(delta, p->mapbase + GRA);
+       else
+               ctrl_outw(now + 1, p->mapbase + GRA);
+
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+}
+
+static int timer16_enable(struct timer16_priv *p)
+{
+       p->rate = get_cpu_clock() / 8;
+       ctrl_outw(0xffff, p->mapbase + GRA);
+       ctrl_outw(0x0000, p->mapbase + TCNT);
+       ctrl_outb(0xa3, p->mapbase + TCR);
+       ctrl_outb(ctrl_inb(p->mapcommon + TSTR) | p->enable,
+                 p->mapcommon + TSTR);
+
+       return 0;
+}
+
+static int timer16_start(struct timer16_priv *p)
+{
+       int ret = 0;
+       unsigned long flags;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+
+       if (!(p->flags & FLAG_STARTED))
+               ret = timer16_enable(p);
+
+       if (ret)
+               goto out;
+       p->flags |= FLAG_STARTED;
+
+ out:
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+
+       return ret;
+}
+
+static void timer16_stop(struct timer16_priv *p)
+{
+       unsigned long flags;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+
+       ctrl_outb(ctrl_inb(p->mapcommon + TSTR) & ~p->enable,
+                 p->mapcommon + TSTR);
+
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+}
+
+static inline struct timer16_priv *ced_to_priv(struct clock_event_device *ced)
+{
+       return container_of(ced, struct timer16_priv, ced);
+}
+
+static void timer16_clock_event_start(struct timer16_priv *p, int periodic)
+{
+       struct clock_event_device *ced = &p->ced;
+
+       timer16_start(p);
+
+       ced->shift = 32;
+       ced->mult = div_sc(p->rate, NSEC_PER_SEC, ced->shift);
+       ced->max_delta_ns = clockevent_delta2ns(0xffff, ced);
+       ced->min_delta_ns = clockevent_delta2ns(0x0001, ced);
+
+       timer16_set_next(p, periodic?(p->rate + HZ/2) / HZ:0x10000);
+}
+
+static void timer16_clock_event_mode(enum clock_event_mode mode,
+                                   struct clock_event_device *ced)
+{
+       struct timer16_priv *p = ced_to_priv(ced);
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               dev_info(&p->pdev->dev, "used for periodic clock events\n");
+               timer16_stop(p);
+               timer16_clock_event_start(p, PERIODIC);
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+               dev_info(&p->pdev->dev, "used for oneshot clock events\n");
+               timer16_stop(p);
+               timer16_clock_event_start(p, ONESHOT);
+               break;
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_UNUSED:
+               timer16_stop(p);
+               break;
+       default:
+               break;
+       }
+}
+
+static int timer16_clock_event_next(unsigned long delta,
+                                  struct clock_event_device *ced)
+{
+       struct timer16_priv *p = ced_to_priv(ced);
+
+       BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT);
+       timer16_set_next(p, delta - 1);
+
+       return 0;
+}
+
+static int __init timer16_setup(struct timer16_priv *p, struct platform_device *pdev)
+{
+       struct h8300_timer16_config *cfg = dev_get_platdata(&pdev->dev);
+       struct resource *res, *res2;
+       int ret, irq;
+
+       memset(p, 0, sizeof(*p));
+       p->pdev = pdev;
+
+       res = platform_get_resource(p->pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&p->pdev->dev, "failed to get I/O memory\n");
+               return -ENXIO;
+       }
+       res2 = platform_get_resource(p->pdev, IORESOURCE_MEM, 1);
+       if (!res2) {
+               dev_err(&p->pdev->dev, "failed to get I/O memory\n");
+               return -ENXIO;
+       }
+       irq = platform_get_irq(p->pdev, 0);
+       if (irq < 0) {
+               dev_err(&p->pdev->dev, "failed to get irq\n");
+               return irq;
+       }
+
+       p->pdev = pdev;
+       p->mapbase = res->start;
+       p->mapcommon = res2->start;
+       p->enable = 1 << cfg->enable;
+       p->imfa = 1 << cfg->imfa;
+       p->imiea = 1 << cfg->imiea;
+       p->ced.name = pdev->name;
+       p->ced.features = CLOCK_EVT_FEAT_PERIODIC |CLOCK_EVT_FEAT_ONESHOT;
+       p->ced.rating = cfg->rating;
+       p->ced.cpumask = cpumask_of(0);
+       p->ced.set_next_event = timer16_clock_event_next;
+       p->ced.set_mode = timer16_clock_event_mode;
+
+       ret = request_irq(irq, timer16_interrupt,
+                         IRQF_DISABLED | IRQF_TIMER, pdev->name, p);
+       if (ret < 0) {
+               dev_err(&p->pdev->dev, "failed to request irq %d\n", irq);
+               return ret;
+       }
+
+       clockevents_register_device(&p->ced);
+
+       return 0;
+}
+
+static int __init timer16_probe(struct platform_device *pdev)
+{
+       struct timer16_priv *p = platform_get_drvdata(pdev);
+
+       if (p) {
+               dev_info(&pdev->dev, "kept as earlytimer\n");
+               return 0;
+       }
+
+       p = kmalloc(sizeof(*p), GFP_KERNEL);
+       if (p == NULL) {
+               dev_err(&pdev->dev, "failed to allocate driver data\n");
+               return -ENOMEM;
+       }
+
+       return timer16_setup(p, pdev);
+}
+
+static int timer16_remove(struct platform_device *pdev)
+{
+       return -EBUSY;
+}
+
+static struct platform_driver __initdata timer16_driver = {
+       .probe          = timer16_probe,
+       .remove         = timer16_remove,
+       .driver         = {
+               .name   = "h8300h-16timer",
+       }
+};
+
+early_platform_init("earlytimer", &timer16_driver);
diff --git a/arch/h8300/kernel/timer/timer8.c b/arch/h8300/kernel/timer/timer8.c
new file mode 100644 (file)
index 0000000..4d6a0ef
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ *  linux/arch/h8300/kernel/cpu/timer/timer8.c
+ *
+ *  Yoshinori Sato <ysato@users.sourcefoge.jp>
+ *
+ *  8bit Timer driver
+ *
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/clocksource.h>
+#include <linux/clockchips.h>
+#include <linux/module.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/timer.h>
+
+#define _8TCR  0
+#define _8TCSR 2
+#define TCORA  4
+#define TCORB  6
+#define _8TCNT 8
+
+#define FLAG_REPROGRAM (1 << 0)
+#define FLAG_SKIPEVENT (1 << 1)
+#define FLAG_IRQCONTEXT (1 << 2)
+#define FLAG_STARTED (1 << 3)
+
+#define ONESHOT  0
+#define PERIODIC 1
+
+#define RELATIVE 0
+#define ABSOLUTE 1
+
+struct timer8_priv {
+       struct platform_device *pdev;
+       int mode;
+       union {
+               struct clocksource cs;
+               struct clock_event_device ced;
+       } clk;
+       struct irqaction irqaction;
+       unsigned long mapbase;
+       raw_spinlock_t lock;
+       unsigned long total_cycles;
+       unsigned int cs_enabled;
+       unsigned long flags;
+       unsigned int rate;
+       unsigned short tcora;
+       unsigned short div;
+};
+
+static const int div_rate[] = {8, 64, 8192};
+
+static unsigned long timer8_get_counter(struct timer8_priv *p)
+{
+       unsigned long v1, v2, v3;
+       int o1, o2;
+
+       o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20;
+
+       /* Make sure the timer value is stable. Stolen from acpi_pm.c */
+       do {
+               o2 = o1;
+               v1 = ctrl_inw(p->mapbase + _8TCNT);
+               v2 = ctrl_inw(p->mapbase + _8TCNT);
+               v3 = ctrl_inw(p->mapbase + _8TCNT);
+               o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20;
+       } while (unlikely((o1 != o2) || (v1 > v2 && v1 < v3)
+                         || (v2 > v3 && v2 < v1) || (v3 > v1 && v3 < v2)));
+
+       v2 |= o1 << 10;
+       return v2;
+}
+
+static irqreturn_t timer8_interrupt(int irq, void *dev_id)
+{
+       struct timer8_priv *p = dev_id;
+
+       switch(p->mode) {
+       case MODE_CS:
+               ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~0x20,
+                         p->mapbase + _8TCSR);
+               p->total_cycles += 0x10000;
+               break;
+       case MODE_CED:
+               ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~0x40,
+                         p->mapbase + _8TCSR);
+               p->flags |= FLAG_IRQCONTEXT;
+               ctrl_outw(p->tcora, p->mapbase + TCORA);
+               if (!(p->flags & FLAG_SKIPEVENT)) {
+                       if (p->clk.ced.mode == CLOCK_EVT_MODE_ONESHOT)
+                               ctrl_outw(0x0000, p->mapbase + _8TCR);
+                       p->clk.ced.event_handler(&p->clk.ced);
+               }
+               p->flags &= ~(FLAG_SKIPEVENT | FLAG_IRQCONTEXT);
+               break;
+       }
+
+       return IRQ_HANDLED;
+}
+       
+static inline struct timer8_priv *cs_to_priv(struct clocksource *cs)
+{
+       return container_of(cs, struct timer8_priv, clk.cs);
+}
+
+static cycle_t timer8_clocksource_read(struct clocksource *cs)
+{
+       struct timer8_priv *p = cs_to_priv(cs);
+       unsigned long flags, raw;
+       unsigned long value;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+       value = p->total_cycles;
+       raw = timer8_get_counter(p);
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+
+       return value + raw;
+}
+
+static int timer8_clocksource_enable(struct clocksource *cs)
+{
+       struct timer8_priv *p = cs_to_priv(cs);
+
+       WARN_ON(p->cs_enabled);
+
+       p->total_cycles = 0;
+       ctrl_outw(0, p->mapbase + _8TCNT);
+       ctrl_outw(0x2400 | p->div, p->mapbase + _8TCR);
+       
+       p->cs_enabled = true;
+       return 0;
+}
+
+static void timer8_clocksource_disable(struct clocksource *cs)
+{
+       struct timer8_priv *p = cs_to_priv(cs);
+
+       WARN_ON(!p->cs_enabled);
+
+       ctrl_outb(0, p->mapbase + _8TCR); 
+       p->cs_enabled = false;
+}
+
+static void timer8_set_next(struct timer8_priv *p, unsigned long delta)
+{
+       unsigned long flags;
+       unsigned long now;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+       if (delta >= 0x10000)
+               dev_warn(&p->pdev->dev, "delta out of range\n");
+       now = timer8_get_counter(p);
+       p->tcora = delta;
+       ctrl_outb(ctrl_inb(p->mapbase + _8TCR) | 0x40, p->mapbase + _8TCR);
+       if (delta > now)
+               ctrl_outw(delta, p->mapbase + TCORA);
+       else
+               ctrl_outw(now + 1, p->mapbase + TCORA);
+
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+}
+
+static int timer8_enable(struct timer8_priv *p)
+{
+       p->rate = get_cpu_clock() / div_rate[p->div];
+       ctrl_outw(0xffff, p->mapbase + TCORA);
+       ctrl_outw(0x0000, p->mapbase + _8TCNT);
+       ctrl_outw(0x0c01, p->mapbase + _8TCR);
+
+       return 0;
+}
+
+static int timer8_start(struct timer8_priv *p)
+{
+       int ret = 0;
+       unsigned long flags;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+
+       if (!(p->flags & FLAG_STARTED))
+               ret = timer8_enable(p);
+
+       if (ret)
+               goto out;
+       p->flags |= FLAG_STARTED;
+
+ out:
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+
+       return ret;
+}
+
+static void timer8_stop(struct timer8_priv *p)
+{
+       unsigned long flags;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+
+       ctrl_outw(0x0000, p->mapbase + _8TCR);
+
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+}
+
+static inline struct timer8_priv *ced_to_priv(struct clock_event_device *ced)
+{
+       return container_of(ced, struct timer8_priv, clk.ced);
+}
+
+static void timer8_clock_event_start(struct timer8_priv *p, int periodic)
+{
+       struct clock_event_device *ced = &p->clk.ced;
+
+       timer8_start(p);
+
+       ced->shift = 32;
+       ced->mult = div_sc(p->rate, NSEC_PER_SEC, ced->shift);
+       ced->max_delta_ns = clockevent_delta2ns(0xffff, ced);
+       ced->min_delta_ns = clockevent_delta2ns(0x0001, ced);
+
+       timer8_set_next(p, periodic?(p->rate + HZ/2) / HZ:0x10000);
+}
+
+static void timer8_clock_event_mode(enum clock_event_mode mode,
+                                   struct clock_event_device *ced)
+{
+       struct timer8_priv *p = ced_to_priv(ced);
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               dev_info(&p->pdev->dev, "used for periodic clock events\n");
+               timer8_stop(p);
+               timer8_clock_event_start(p, PERIODIC);
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+               dev_info(&p->pdev->dev, "used for oneshot clock events\n");
+               timer8_stop(p);
+               timer8_clock_event_start(p, ONESHOT);
+               break;
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_UNUSED:
+               timer8_stop(p);
+               break;
+       default:
+               break;
+       }
+}
+
+static int timer8_clock_event_next(unsigned long delta,
+                                  struct clock_event_device *ced)
+{
+       struct timer8_priv *p = ced_to_priv(ced);
+
+       BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT);
+       timer8_set_next(p, delta - 1);
+
+       return 0;
+}
+
+static int __init timer8_setup(struct timer8_priv *p, struct platform_device *pdev)
+{
+       struct h8300_timer8_config *cfg = dev_get_platdata(&pdev->dev);
+       struct resource *res;
+       int irq;
+       int ret;
+
+       memset(p, 0, sizeof(*p));
+       p->pdev = pdev;
+
+       res = platform_get_resource(p->pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&p->pdev->dev, "failed to get I/O memory\n");
+               return -ENXIO;
+       }
+
+       irq = platform_get_irq(p->pdev, 0);
+       if (irq < 0) {
+               dev_err(&p->pdev->dev, "failed to get irq\n");
+               return -ENXIO;
+       }
+
+       p->mapbase = res->start;
+
+       p->irqaction.name = dev_name(&p->pdev->dev);
+       p->irqaction.handler = timer8_interrupt;
+       p->irqaction.dev_id = p;
+       p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER;
+
+       p->mode = cfg->mode;
+       p->div = cfg->div;
+       switch(p->mode) {
+       case MODE_CS:
+               p->clk.cs.name = pdev->name;
+               p->clk.cs.rating = cfg->rating;
+               p->clk.cs.read = timer8_clocksource_read;
+               p->clk.cs.enable = timer8_clocksource_enable;
+               p->clk.cs.disable = timer8_clocksource_disable;
+               p->clk.cs.mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8);
+               p->clk.cs.flags = CLOCK_SOURCE_IS_CONTINUOUS;
+
+               if ((ret = setup_irq(irq + 3, &p->irqaction)) < 0) {
+                       dev_err(&p->pdev->dev,
+                               "failed to request irq %d\n", irq + 3);
+                       return ret;
+               }
+               clocksource_register_hz(&p->clk.cs, 
+                                       get_cpu_clock() / div_rate[p->div]);
+               break;
+       case MODE_CED:
+               p->clk.ced.name = pdev->name;
+               p->clk.ced.features = CLOCK_EVT_FEAT_PERIODIC | 
+                                       CLOCK_EVT_FEAT_ONESHOT;
+               p->clk.ced.rating = cfg->rating;
+               p->clk.ced.cpumask = cpumask_of(0);
+               p->clk.ced.set_next_event = timer8_clock_event_next;
+               p->clk.ced.set_mode = timer8_clock_event_mode;
+               ret = request_irq(irq, timer8_interrupt,
+                                 IRQF_DISABLED | IRQF_TIMER, pdev->name, p);
+               if (ret < 0) {
+                       dev_err(&p->pdev->dev,
+                               "failed to request irq %d\n", irq);
+                       return ret;
+               }
+               clockevents_register_device(&p->clk.ced);
+               break;
+       }
+       platform_set_drvdata(pdev, p);
+
+       return 0;
+}
+
+static int timer8_probe(struct platform_device *pdev)
+{
+       struct timer8_priv *p = platform_get_drvdata(pdev);
+
+       if (p) {
+               dev_info(&pdev->dev, "kept as earlytimer\n");
+               return 0;
+       }
+
+       p = kmalloc(sizeof(*p), GFP_KERNEL);
+       if (p == NULL) {
+               dev_err(&pdev->dev, "failed to allocate driver data\n");
+               return -ENOMEM;
+       }
+
+       return timer8_setup(p, pdev);
+}
+
+static int timer8_remove(struct platform_device *pdev)
+{
+       return -EBUSY;
+}
+
+static struct platform_driver timer8_driver = {
+       .probe          = timer8_probe,
+       .remove         = timer8_remove,
+       .driver         = {
+               .name   = "h8300_8timer",
+       }
+};
+
+static int __init timer8_init(void)
+{
+       return platform_driver_register(&timer8_driver);
+}
+
+static void __exit timer8_exit(void)
+{
+       platform_driver_unregister(&timer8_driver);
+}
+
+#if defined(CONFIG_8TMR_CED)
+early_platform_init("earlytimer", &timer8_driver);
+#else
+subsys_initcall(timer8_init);
+module_exit(timer8_exit);
+MODULE_AUTHOR("Yoshinori Sato");
+MODULE_DESCRIPTION("H8/300 8bit Timer Driver");
+MODULE_LICENSE("GPL v2");
+#endif
diff --git a/arch/h8300/kernel/timer/tpu.c b/arch/h8300/kernel/timer/tpu.c
new file mode 100644 (file)
index 0000000..96b2fb2
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ *  linux/arch/h8300/kernel/cpu/timer/timer_tpu.c
+ *
+ *  Yoshinori Sato <ysato@users.sourcefoge.jp>
+ *
+ *  TPU driver
+ *
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/clocksource.h>
+#include <linux/module.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/timer.h>
+
+#define TCR    0
+#define TMDR   1
+#define TIOR   2
+#define TER    4
+#define TSR    5
+#define TCNT   6
+#define TGRA   8
+#define TGRB   10
+#define TGRC   12
+#define TGRD   14
+
+struct tpu_priv {
+       struct platform_device *pdev;
+       struct clocksource cs;
+       unsigned long mapbase1;
+       unsigned long mapbase2;
+       raw_spinlock_t lock;
+       unsigned int cs_enabled;
+};
+
+static inlinde unsigned long read_tcnt32(struct tpu_priv *p)
+{
+       unsigned long tcnt;
+       tcnt = ctrl_inw(p->mapbase1 + TCNT) << 16;
+       tcnt |= ctrl_inw(p->mapbase2 + TCNT);
+       return tcnt;
+}
+
+static int tpu_get_counter(struct tpu_priv *p, unsigned long long *val)
+{
+       unsigned long v1, v2, v3;
+       int o1, o2;
+
+       o1 = ctrl_inb(p->mapbase + TSR) & 0x10;
+
+       /* Make sure the timer value is stable. Stolen from acpi_pm.c */
+       do {
+               o2 = o1;
+               v1 = read_tcnt32(p);
+               v2 = read_tcnt32(p);
+               v3 = read_tcnt32(p);
+               o1 = ctrl_inb(p->mapbase + TSR) & 0x10;
+       } while (unlikely((o1 != o2) || (v1 > v2 && v1 < v3)
+                         || (v2 > v3 && v2 < v1) || (v3 > v1 && v3 < v2)));
+
+       *val = v2;
+       return o1;
+}
+
+static inline struct tpu_priv *cs_to_priv(struct clocksource *cs)
+{
+       return container_of(cs, struct tpu_priv, cs);
+}
+
+static cycle_t tpu_clocksource_read(struct clocksource *cs)
+{
+       struct tpu_priv *p = cs_to_priv(cs);
+       unsigned long flags;
+       unsigned long long value;
+
+       raw_spin_lock_irqsave(&p->lock, flags);
+       if (tpu_get_counter(p, &value))
+               value += 0x100000000;
+       raw_spin_unlock_irqrestore(&p->lock, flags);
+
+       return value;
+}
+
+static int tpu_clocksource_enable(struct clocksource *cs)
+{
+       struct tpu_priv *p = cs_to_priv(cs);
+
+       WARN_ON(p->cs_enabled);
+
+       ctrl_outw(0, p->mapbase1 + TCNT);
+       ctrl_outw(0, p->mapbase2 + TCNT);
+       ctrl_outb(0x0f, p->mapbase1 + TCR);
+       ctrl_outb(0x03, p->mapbase2 + TCR);
+
+       p->cs_enabled = true;
+       return 0;
+}
+
+static void tpu_clocksource_disable(struct clocksource *cs)
+{
+       struct tpu_priv *p = cs_to_priv(cs);
+
+       WARN_ON(!p->cs_enabled);
+
+       ctrl_outb(0, p->mapbase1 + _8TCR);
+       ctrl_outb(0, p->mapbase2 + _8TCR);
+       p->cs_enabled = false;
+}
+
+static int __init tpu_setup(struct tpu_priv *p, struct platform_device *pdev)
+{
+       struct tpu_config *cfg = dev_get_platdata(&pdev->dev);
+       struct resource *res1, *res2;
+       int irq;
+       int ret;
+
+       memset(p, 0, sizeof(*p));
+       p->pdev = pdev;
+
+       res1 = platform_get_resource(p->pdev, IORESOURCE_MEM, 0);
+       if (!res1) {
+               dev_err(&p->pdev->dev, "failed to get I/O memory\n");
+               return -ENXIO;
+       }
+
+       res2 = platform_get_resource(p->pdev, IORESOURCE_MEM, 1);
+       if (!res2) {
+               dev_err(&p->pdev->dev, "failed to get I/O memory\n");
+               return -ENXIO;
+       }
+
+       p->mapbase1 = res1->start;
+       p->mapbase2 = res2->start;
+
+       p->cs.name = pdev->name;
+       p->cs.rating = cfg->rating;
+       p->cs.read = tpu_clocksource_read;
+       p->cs.enable = tpu_clocksource_enable;
+       p->cs.disable = tpu_clocksource_disable;
+       p->cs.mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8);
+       p->cs.flags = CLOCK_SOURCE_IS_CONTINUOUS;
+       clocksource_register_hz(&p->clk.cs, get_cpu_clock() / 64);
+       platform_set_drvdata(pdev, p);
+
+       return 0;
+}
+
+static int tpu_probe(struct platform_device *pdev)
+{
+       struct tpu_priv *p = platform_get_drvdata(pdev);
+
+       if (p) {
+               dev_info(&pdev->dev, "kept as earlytimer\n");
+               return 0;
+       }
+
+       p = kmalloc(sizeof(*p), GFP_KERNEL);
+       if (p == NULL) {
+               dev_err(&pdev->dev, "failed to allocate driver data\n");
+               return -ENOMEM;
+       }
+
+       return tpu_setup(p, pdev);
+}
+
+static int tpu_remove(struct platform_device *pdev)
+{
+       return -EBUSY;
+}
+
+static struct platform_driver tpu_driver = {
+       .probe          = tpu_probe,
+       .remove         = tpu_remove,
+       .driver         = {
+               .name   = "h8s_tpu",
+       }
+};
+
+static int __init tpu_init(void)
+{
+       return platform_driver_register(&tpu_driver);
+}
+
+static void __exit tpu_exit(void)
+{
+       platform_driver_unregister(&tpu_driver);
+}
+
+subsys_initcall(tpu_init);
+module_exit(tpu_exit);
+MODULE_AUTHOR("Yoshinori Sato");
+MODULE_DESCRIPTION("H8S Timer Pulse Unit Driver");
+MODULE_LICENSE("GPL v2");
+#endif
diff --git a/arch/h8300/kernel/traps.c b/arch/h8300/kernel/traps.c
new file mode 100644 (file)
index 0000000..cfe494d
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * linux/arch/h8300/boot/traps.c -- general exception handling code
+ * H8/300 support Yoshinori Sato <ysato@users.sourceforge.jp>
+ * 
+ * Cloned from Linux/m68k.
+ *
+ * No original Copyright holder listed,
+ * Probable 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/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/bug.h>
+
+#include <asm/irq.h>
+#include <asm/traps.h>
+#include <asm/page.h>
+
+static DEFINE_SPINLOCK(die_lock);
+
+/*
+ * this must be called very early as the kernel might
+ * use some instruction that are emulated on the 060
+ */
+
+void __init base_trap_init(void)
+{
+}
+
+void __init trap_init (void)
+{
+}
+
+asmlinkage void set_esp0 (unsigned long ssp)
+{
+       current->thread.esp0 = ssp;
+}
+
+/*
+ *     Generic dumping code. Used for panic and debug.
+ */
+
+static void dump(struct pt_regs *fp)
+{
+       unsigned long   *sp;
+       unsigned char   *tp;
+       int             i;
+
+       printk("\nCURRENT PROCESS:\n\n");
+       printk("COMM=%s PID=%d\n", current->comm, current->pid);
+       if (current->mm) {
+               printk("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("USER-STACK=%08x  KERNEL-STACK=%08lx\n\n",
+                       (int) current->mm->start_stack,
+                       (int) PAGE_SIZE+(unsigned long)current);
+       }
+
+       show_regs(fp);
+       printk("\nCODE:");
+       tp = ((unsigned char *) fp->pc) - 0x20;
+       for (sp = (unsigned long *) tp, i = 0; (i < 0x40);  i += 4) {
+               if ((i % 0x10) == 0)
+                       printk("\n%08x: ", (int) (tp + i));
+               printk("%08x ", (int) *sp++);
+       }
+       printk("\n");
+
+       printk("\nKERNEL STACK:");
+       tp = ((unsigned char *) fp) - 0x40;
+       for (sp = (unsigned long *) tp, i = 0; (i < 0xc0); i += 4) {
+               if ((i % 0x10) == 0)
+                       printk("\n%08x: ", (int) (tp + i));
+               printk("%08x ", (int) *sp++);
+       }
+       printk("\n");
+       if (STACK_MAGIC != *(unsigned long *)((unsigned long)current+PAGE_SIZE))
+                printk("(Possibly corrupted stack page??)\n");
+
+       printk("\n\n");
+}
+
+void die(const char *str, struct pt_regs *fp, unsigned long err)
+{
+       static int diecount;
+
+       oops_enter();
+
+       console_verbose();
+       spin_lock_irq(&die_lock);
+       report_bug(fp->pc, fp);
+       printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++diecount);
+       dump(fp);
+
+       spin_unlock_irq(&die_lock);
+       do_exit(SIGSEGV);
+}
+
+extern char _start, _etext;
+#define check_kernel_text(addr) \
+        ((addr >= (unsigned long)(&_start)) && \
+         (addr <  (unsigned long)(&_etext))) 
+
+static int kstack_depth_to_print = 24;
+
+void show_stack(struct task_struct *task, unsigned long *esp)
+{
+       unsigned long *stack,  addr;
+       int i;
+
+       if (esp == NULL)
+               esp = (unsigned long *) &esp;
+
+       stack = esp;
+
+       printk("Stack from %08lx:", (unsigned long)stack);
+       for (i = 0; i < kstack_depth_to_print; i++) {
+               if (((unsigned long)stack & (THREAD_SIZE - 1)) == 0)
+                       break;
+               if (i % 8 == 0)
+                       printk("\n       ");
+               printk(" %08lx", *stack++);
+       }
+
+       printk("\nCall Trace:");
+       i = 0;
+       stack = esp;
+       while (((unsigned long)stack & (THREAD_SIZE - 1)) != 0) {
+               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 (check_kernel_text(addr)) {
+                       if (i % 4 == 0)
+                               printk("\n       ");
+                       printk(" [<%08lx>]", addr);
+                       i++;
+               }
+       }
+       printk("\n");
+}
+
+void show_trace_task(struct task_struct *tsk)
+{
+       show_stack(tsk,(unsigned long *)tsk->thread.esp0);
+}
index 03498ab..4a37ec9 100644 (file)
@@ -1,56 +1,12 @@
 #include <asm-generic/vmlinux.lds.h>
 #include <asm/page.h>
 
-/* target memory map */
-#ifdef CONFIG_H8300H_GENERIC
-#define ROMTOP  0x000000
-#define ROMSIZE 0x400000
-#define RAMTOP  0x400000
-#define RAMSIZE 0x400000
-#endif
-
-#ifdef CONFIG_H8300H_AKI3068NET
-#define ROMTOP  0x000000
-#define ROMSIZE 0x080000
-#define RAMTOP  0x400000
-#define RAMSIZE 0x200000
-#endif
-
-#ifdef CONFIG_H8300H_H8MAX
-#define ROMTOP  0x000000
-#define ROMSIZE 0x080000
-#define RAMTOP  0x400000
-#define RAMSIZE 0x200000
-#endif
+#define ROMTOP 0x000000
+#define RAMTOP CONFIG_RAMBASE
 
-#ifdef CONFIG_H8300H_SIM
-#define ROMTOP  0x000000
-#define ROMSIZE 0x400000
-#define RAMTOP  0x400000
-#define RAMSIZE 0x400000
-#endif
+jiffies = jiffies_64 + 4;
 
-#ifdef CONFIG_H8S_SIM
-#define ROMTOP  0x000000
-#define ROMSIZE 0x400000
-#define RAMTOP  0x400000
-#define RAMSIZE 0x800000
-#endif
-
-#ifdef CONFIG_H8S_EDOSK2674
-#define ROMTOP  0x000000
-#define ROMSIZE 0x400000
-#define RAMTOP  0x400000
-#define RAMSIZE 0x800000
-#endif
-
-#if defined(CONFIG_H8300H_SIM) || defined(CONFIG_H8S_SIM)
-INPUT(romfs.o)
-#endif
-
-_jiffies = _jiffies_64 + 4;
-
-ENTRY(__start)
+ENTRY(_start)
 
 SECTIONS
 {
@@ -58,100 +14,73 @@ SECTIONS
        . = ROMTOP; 
        .vectors :
        {
-       __vector = . ;
-               *(.vectors*)
+       _vector = . ;
+               *(.vector*)
        }
 #else
-       . = RAMTOP; 
-       .bootvec :      
-       {
-               *(.bootvec)
-       }
+       . = RAMTOP;
+       _ramstart = .;
 #endif
-        .text :
-       {
-       _text = .;
+       HEAD_TEXT_SECTION
+       .text : {
+       _stext = . ;
+               TEXT_TEXT
+               SCHED_TEXT
+               LOCK_TEXT
 #if defined(CONFIG_ROMKERNEL)
-       *(.int_redirect)
+               *(.int_redirect)
 #endif
-       __stext = . ;
-       TEXT_TEXT
-       SCHED_TEXT
-       LOCK_TEXT
-       __etext = . ;
+       _etext = . ;
        }
        EXCEPTION_TABLE(16)
        NOTES
+<<<<<<< HEAD
+       RO_DATA(4)
+=======
        RODATA
+>>>>>>> master
 #if defined(CONFIG_ROMKERNEL)
+       .init.text : {
+               _sinittext = .;
+               INIT_TEXT
+               _einittext = .;
+       }
        SECURITY_INIT
 #endif
-       ROEND = .; 
+       ROMEND = .;
 #if defined(CONFIG_ROMKERNEL)
        . = RAMTOP;
-       .data : AT(ROEND)
+       _ramstart = .;
+       .data : AT(ROMEND)
 #else
        .data : 
 #endif
        {
-       __sdata = . ;
-       ___data_start = . ;
-
-       INIT_TASK_DATA(0x2000)
-       . = ALIGN(0x4) ;
+       _sdata = . ;
+       __data_start = . ;
+               INIT_TASK_DATA(0x2000)
+               NOSAVE_DATA
+               PAGE_ALIGNED_DATA(0x1000)
+               CACHELINE_ALIGNED_DATA(0x0002)
+               READ_MOSTLY_DATA(0x0002)
                DATA_DATA
-       . = ALIGN(0x4) ;
-               *(.data.*)      
-
-       . = ALIGN(0x4) ;
-       ___init_begin = .;
-       __sinittext = .; 
-               INIT_TEXT
-       __einittext = .; 
-               INIT_DATA
-       . = ALIGN(0x4) ;
-       INIT_SETUP(0x4)
-       ___setup_start = .;
-               *(.init.setup)
-       . = ALIGN(0x4) ;
-       ___setup_end = .;
-       INIT_CALLS
-       CON_INITCALL
-               EXIT_TEXT
-               EXIT_DATA
-       INIT_RAM_FS
-       . = ALIGN(0x4) ;
-       ___init_end = .;
-       __edata = . ;
+               CONSTRUCTORS
        }
+       . = ALIGN(0x4) ;
+       __init_begin = .;
+       _sinittext = .;
+       INIT_TEXT_SECTION(4)
+       _einittext = .;
+       INIT_DATA_SECTION(4)
 #if defined(CONFIG_RAMKERNEL)
        SECURITY_INIT
 #endif
-       __begin_data = LOADADDR(.data);
-        .bss : 
-        {
-       . = ALIGN(0x4) ;
-       __sbss = . ;
-       ___bss_start = . ;
-               *(.bss*)
-       . = ALIGN(0x4) ;
-               *(COMMON)
-       . = ALIGN(0x4) ;
-       ___bss_stop = . ;
-       __ebss = . ;
-       __end = . ;
-       __ramstart = .;
-       }
-        .romfs :       
-       {
-               *(.romfs*)
-       }
-       . = RAMTOP+RAMSIZE;
-        .dummy :
-        {
-       COMMAND_START = . - 0x200 ;
-       __ramend = . ;
-       }
-
+       __init_end = .;
+       _edata = . ;
+       _begin_data = LOADADDR(.data);
+       _sbss =.;
+       BSS_SECTION(4,4,4)
+       _ebss =.;
+       _ramend = .;
        DISCARDS
 }
diff --git a/arch/h8300/lib/Makefile b/arch/h8300/lib/Makefile
new file mode 100644 (file)
index 0000000..1577f50
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for H8/300-specific library files..
+#
+
+lib-y  = ashrdi3.o checksum.o memcpy.o memset.o abs.o romfs.o
diff --git a/arch/h8300/lib/abs.S b/arch/h8300/lib/abs.S
new file mode 100644 (file)
index 0000000..ddd1fb3
--- /dev/null
@@ -0,0 +1,21 @@
+;;; abs.S
+
+#include <asm/linkage.h>
+
+#if defined(__H8300H__) 
+       .h8300h
+#endif
+#if defined(__H8300S__) 
+       .h8300s
+#endif
+       .text
+.global _abs
+
+;;; int abs(int n)
+_abs:
+       mov.l   er0,er0
+       bpl     1f
+       neg.l   er0
+1:
+       rts
+       
diff --git a/arch/h8300/lib/ashrdi3.c b/arch/h8300/lib/ashrdi3.c
new file mode 100644 (file)
index 0000000..78efb65
--- /dev/null
@@ -0,0 +1,63 @@
+/* ashrdi3.c extracted from gcc-2.7.2/libgcc2.c which is: */
+/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC 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, or (at your option)
+any later version.
+
+GNU CC 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 GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define BITS_PER_UNIT 8
+
+typedef         int SItype     __attribute__ ((mode (SI)));
+typedef unsigned int USItype   __attribute__ ((mode (SI)));
+typedef                 int DItype     __attribute__ ((mode (DI)));
+typedef int word_type __attribute__ ((mode (__word__)));
+
+struct DIstruct {SItype high, low;};
+
+typedef union
+{
+  struct DIstruct s;
+  DItype ll;
+} DIunion;
+
+DItype
+__ashrdi3 (DItype u, word_type b)
+{
+  DIunion w;
+  word_type bm;
+  DIunion uu;
+
+  if (b == 0)
+    return u;
+
+  uu.ll = u;
+
+  bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
+  if (bm <= 0)
+    {
+      /* w.s.high = 1..1 or 0..0 */
+      w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
+      w.s.low = uu.s.high >> -bm;
+    }
+  else
+    {
+      USItype carries = (USItype)uu.s.high << bm;
+      w.s.high = uu.s.high >> b;
+      w.s.low = ((USItype)uu.s.low >> b) | carries;
+    }
+
+  return w.ll;
+}
diff --git a/arch/h8300/lib/checksum.c b/arch/h8300/lib/checksum.c
new file mode 100644 (file)
index 0000000..bdc5b03
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * INET                An implementation of the TCP/IP protocol suite for the LINUX
+ *             operating system.  INET is implemented using the  BSD Socket
+ *             interface as the means of communication with the user level.
+ *
+ *             IP/TCP/UDP checksumming routines
+ *
+ * Authors:    Jorge Cwik, <jorge@laser.satlink.net>
+ *             Arnt Gulbrandsen, <agulbra@nvg.unit.no>
+ *             Tom May, <ftom@netcom.com>
+ *             Andreas Schwab, <schwab@issan.informatik.uni-dortmund.de>
+ *             Lots of code moved from tcp.c and ip.c; see those files
+ *             for more names.
+ *
+ * 03/02/96    Jes Sorensen, Andreas Schwab, Roman Hodek:
+ *             Fixed some nasty bugs, causing some horrible crashes.
+ *             A: At some points, the sum (%0) was used as
+ *             length-counter instead of the length counter
+ *             (%1). Thanks to Roman Hodek for pointing this out.
+ *             B: GCC seems to mess up if one uses too many
+ *             data-registers to hold input values and one tries to
+ *             specify d0 and d1 as scratch registers. Letting gcc choose these
+ *      registers itself solves the problem.
+ *
+ *             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.
+ */
+/* Revised by Kenneth Albanowski for m68knommu. Basic problem: unaligned access kills, so most
+   of the assembly has to go. */
+
+#include <net/checksum.h>
+#include <linux/module.h>
+
+static inline unsigned short from32to16(unsigned long x)
+{
+       /* add up 16-bit and 16-bit for 16+c bit */
+       x = (x & 0xffff) + (x >> 16);
+       /* add up carry.. */
+       x = (x & 0xffff) + (x >> 16);
+       return x;
+}
+
+static unsigned long do_csum(const unsigned char * buff, int len)
+{
+       int odd, count;
+       unsigned long result = 0;
+
+       if (len <= 0)
+               goto out;
+       odd = 1 & (unsigned long) buff;
+       if (odd) {
+               result = *buff;
+               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 << 8);
+       result = from32to16(result);
+       if (odd)
+               result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
+out:
+       return result;
+}
+
+/*
+ *     This is a version of ip_compute_csum() optimized for IP headers,
+ *     which always checksum on 4 octet boundaries.
+ */
+__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
+{
+       return (__force __sum16)~do_csum(iph,ihl*4);
+}
+
+/*
+ * 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
+ */
+/*
+ * Egads...  That thing apparently assumes that *all* checksums it ever sees will
+ * be folded.  Very likely a bug.
+ */
+__wsum csum_partial(const void *buff, int len, __wsum sum)
+{
+       unsigned int result = do_csum(buff, len);
+
+       /* add in old sum, and carry.. */
+       result += (__force u32)sum;
+       /* 16+c bits -> 16 bits */
+       result = (result & 0xffff) + (result >> 16);
+       return (__force __wsum)result;
+}
+
+EXPORT_SYMBOL(csum_partial);
+
+/*
+ * this routine is used for miscellaneous IP-like checksums, mainly
+ * in icmp.c
+ */
+__sum16 ip_compute_csum(const void *buff, int len)
+{
+       return (__force __sum16)~do_csum(buff,len);
+}
+
+/*
+ * copy from fs while checksumming, otherwise like csum_partial
+ */
+
+__wsum
+csum_partial_copy_from_user(const void __user *src, void *dst, int len,
+                           __wsum sum, int *csum_err)
+{
+       if (csum_err) *csum_err = 0;
+       memcpy(dst, (__force const void *)src, len);
+       return csum_partial(dst, len, sum);
+}
+
+/*
+ * copy from ds while checksumming, otherwise like csum_partial
+ */
+
+__wsum
+csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
+{
+       memcpy(dst, src, len);
+       return csum_partial(dst, len, sum);
+}
diff --git a/arch/h8300/lib/memcpy.S b/arch/h8300/lib/memcpy.S
new file mode 100644 (file)
index 0000000..9683d12
--- /dev/null
@@ -0,0 +1,84 @@
+;;; memcpy.S
+
+#include <asm/linkage.h>
+
+#if defined(__H8300H__) 
+       .h8300h
+#endif
+#if defined(__H8300S__) 
+       .h8300s
+#endif
+
+       .text
+.global memcpy
+
+;;; void *memcpy(void *to, void *from, size_t n)
+memcpy:
+       mov.l   er2,er2
+       bne     1f
+       rts     
+1:     
+       ;; address check
+       bld     #0,r0l
+       bxor    #0,r1l
+       bcs     4f
+       mov.l   er4,@-sp
+       mov.l   er0,@-sp
+       btst    #0,r0l
+       beq     1f
+       ;; (aligned even) odd address
+       mov.b   @er1,r3l
+       mov.b   r3l,@er0
+       adds    #1,er1
+       adds    #1,er0
+       dec.l   #1,er2
+       beq     3f
+1:     
+       ;; n < sizeof(unsigned long) check
+       sub.l   er4,er4
+       adds    #4,er4          ; loop count check value
+       cmp.l   er4,er2
+       blo     2f
+       ;; unsigned long copy
+1:     
+       mov.l   @er1,er3
+       mov.l   er3,@er0
+       adds    #4,er0
+       adds    #4,er1
+       subs    #4,er2
+       cmp.l   er4,er2
+       bcc     1b      
+       ;; rest
+2:     
+       mov.l   er2,er2
+       beq     3f
+1:     
+       mov.b   @er1,r3l
+       mov.b   r3l,@er0
+       adds    #1,er1
+       adds    #1,er0
+       dec.l   #1,er2
+       bne     1b
+3:
+       mov.l   @sp+,er0
+       mov.l   @sp+,er4
+       rts
+
+       ;; odd <- even / even <- odd
+4:     
+       mov.l   er4,er3
+       mov.l   er2,er4
+       mov.l   er5,er2
+       mov.l   er1,er5
+       mov.l   er6,er1
+       mov.l   er0,er6
+1:
+       eepmov.w
+       mov.w   r4,r4
+       bne     1b
+       dec.w   #1,e4
+       bpl     1b
+       mov.l   er1,er6
+       mov.l   er2,er5
+       mov.l   er3,er4
+       rts
diff --git a/arch/h8300/lib/memset.S b/arch/h8300/lib/memset.S
new file mode 100644 (file)
index 0000000..c26712e
--- /dev/null
@@ -0,0 +1,69 @@
+/* memset.S */
+
+#include <asm/linkage.h>
+
+#if defined(__H8300H__) 
+       .h8300h
+#endif
+#if defined(__H8300S__) 
+       .h8300s
+#endif
+       .text
+
+.global        memset
+.global        clear_user
+
+;;void *memset(*ptr, int c, size_t count)
+;; ptr = er0
+;; c   = er1(r1l)
+;; count = er2
+memset:
+       btst    #0,r0l
+       beq     2f
+
+       ;; odd address
+1:
+       mov.b   r1l,@er0
+       adds    #1,er0
+       dec.l   #1,er2
+       beq     6f
+
+       ;; even address
+2:
+       mov.l   er2,er3
+       cmp.l   #4,er2
+       blo     4f
+       ;; count>=4 -> count/4
+#if defined(__H8300H__)
+       shlr.l  er2
+       shlr.l  er2
+#endif
+#if defined(__H8300S__)
+       shlr.l  #2,er2
+#endif
+       ;; byte -> long
+       mov.b   r1l,r1h
+       mov.w   r1,e1
+3:
+       mov.l   er1,@er0
+       adds    #4,er0
+       dec.l   #1,er2
+       bne     3b
+4:
+       ;; count % 4
+       and.b   #3,r3l
+       beq     6f
+5:
+       mov.b   r1l,@er0
+       adds    #1,er0
+       dec.b   r3l
+       bne     5b
+6:
+       rts
+
+clear_user:
+       mov.l   er1, er2
+       sub.l   er1, er1
+       bra     memset
+
+       .end
diff --git a/arch/h8300/lib/romfs.S b/arch/h8300/lib/romfs.S
new file mode 100644 (file)
index 0000000..68910d8
--- /dev/null
@@ -0,0 +1,57 @@
+/* romfs move to __ebss */
+
+#include <asm/linkage.h>
+
+#if defined(__H8300H__) 
+       .h8300h
+#endif
+#if defined(__H8300S__) 
+       .h8300s
+#endif
+
+#define BLKOFFSET 512
+
+       .text
+.globl __move_romfs
+_romfs_sig_len = 8
+
+__move_romfs:  
+       mov.l   #__sbss,er0
+       mov.l   #_romfs_sig,er1
+       mov.b   #_romfs_sig_len,r3l
+1:                                     /* check romfs image */
+       mov.b   @er0+,r2l
+       mov.b   @er1+,r2h
+       cmp.b   r2l,r2h
+       bne     2f
+       dec.b   r3l
+       bne     1b
+
+       /* find romfs image */
+       mov.l   @__sbss+8,er0           /* romfs length(be) */
+       mov.l   #__sbss,er1
+       add.l   er0,er1                 /* romfs image end */
+       mov.l   #__ebss,er2
+       add.l   er0,er2                 /* distination address */
+#if defined(CONFIG_INTELFLASH)
+       add.l   #BLKOFFSET,er2
+#endif
+       adds    #2,er0
+       adds    #1,er0
+       shlr    er0
+       shlr    er0                     /* transfer length */
+1:
+       mov.l   @er1,er3                /* copy image */
+       mov.l   er3,@er2
+       subs    #4,er1
+       subs    #4,er2
+       dec.l   #1,er0
+       bpl     1b
+2:
+       rts
+
+       .section        .rodata
+_romfs_sig:    
+       .ascii  "-rom1fs-"
+
+       .end
diff --git a/arch/h8300/mm/Makefile b/arch/h8300/mm/Makefile
new file mode 100644 (file)
index 0000000..5f4bc42
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the linux m68k-specific parts of the memory manager.
+#
+
+obj-y   := init.o fault.o memory.o kmap.o
diff --git a/arch/h8300/mm/fault.c b/arch/h8300/mm/fault.c
new file mode 100644 (file)
index 0000000..0437f72
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *  linux/arch/h8300/mm/fault.c
+ *
+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
+ *  Copyright (C) 2000  Lineo, Inc.  (www.lineo.com) 
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/mm/fault.c
+ *  linux/arch/m68k/mm/fault.c
+ *
+ *  Copyright (C) 1995  Hamish Macdonald
+ */
+
+#include <linux/mman.h>
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/ptrace.h>
+
+#include <asm/pgtable.h>
+
+void die(const char *str, struct pt_regs *fp, unsigned long err);
+
+/*
+ * This routine handles page faults.  It determines the problem, and
+ * then passes it off to one of the appropriate routines.
+ *
+ * error_code:
+ *     bit 0 == 0 means no page found, 1 means protection fault
+ *     bit 1 == 0 means read, 1 means write
+ *
+ * If this routine detects a bad access, it returns 1, otherwise it
+ * returns 0.
+ */
+asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
+                             unsigned long error_code)
+{
+#ifdef DEBUG
+       printk ("regs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld\n",
+               regs->sr, regs->pc, address, error_code);
+#endif
+
+/*
+ * Oops. The kernel tried to access some bad page. We'll have to
+ * terminate things with extreme prejudice.
+ */
+       if ((unsigned long) address < PAGE_SIZE) {
+               printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
+       } else
+               printk(KERN_ALERT "Unable to handle kernel access");
+       printk(" at virtual address %08lx\n",address);
+       if (!user_mode(regs))
+               die("Oops", regs, error_code);
+       do_exit(SIGKILL);
+
+       return 1;
+}
+
diff --git a/arch/h8300/mm/init.c b/arch/h8300/mm/init.c
new file mode 100644 (file)
index 0000000..6c1251e
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ *  linux/arch/h8300/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) 
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/mm/init.c
+ *  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>
+ */
+
+#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/gfp.h>
+
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/sections.h>
+
+#undef DEBUG
+
+/*
+ * 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;
+
+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 og the world.
+        */
+#ifdef DEBUG
+       unsigned long start_mem = PAGE_ALIGN(memory_start);
+#endif
+       unsigned long end_mem   = memory_end & PAGE_MASK;
+
+#ifdef DEBUG
+       printk ("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 ("before free_area_init\n");
+
+       printk ("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]     = 0 >> PAGE_SHIFT;
+               zones_size[ZONE_NORMAL]  = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
+#ifdef CONFIG_HIGHMEM
+               zones_size[ZONE_HIGHMEM] = 0;
+#endif
+               free_area_init(zones_size);
+       }
+}
+
+void __init mem_init(void)
+{
+       unsigned long codesize = _etext - _stext;
+
+       pr_devel("Mem_init: start=%lx, end=%lx\n", memory_start, memory_end);
+
+       high_memory = (void *) (memory_end & PAGE_MASK);
+       max_mapnr = MAP_NR(high_memory);
+
+       /* this will put all low memory onto the freelists */
+       free_all_bootmem();
+
+       mem_init_print_info(NULL);
+       if (rom_length > 0 && rom_length > codesize)
+               pr_info("Memory available: %luK/%luK ROM\n",
+                       (rom_length - codesize) >> 10, rom_length >> 10);
+}
+
+
+#ifdef CONFIG_BLK_DEV_INITRD
+void free_initrd_mem(unsigned long start, unsigned long end)
+{
+       free_reserved_area((void *)start, (void *)end, -1, "initrd");
+}
+#endif
+
+void
+free_initmem(void)
+{
+#ifdef CONFIG_RAMKERNEL
+       free_initmem_default(-1);
+#endif
+}
+
diff --git a/arch/h8300/mm/kmap.c b/arch/h8300/mm/kmap.c
new file mode 100644 (file)
index 0000000..f79edcd
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *  linux/arch/h8300/mm/kmap.c
+ *  
+ *  Based on
+ *  linux/arch/m68knommu/mm/kmap.c
+ *
+ *  Copyright (C) 2000 Lineo, <davidm@snapgear.com>
+ *  Copyright (C) 2000-2002 David McCullough <davidm@snapgear.com>
+ */
+
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/types.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>
+
+#undef DEBUG
+
+#define VIRT_OFFSET (0x01000000)
+
+/*
+ * Map some physical address range into the kernel address space.
+ */
+void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag)
+{
+       return (void *)(physaddr + VIRT_OFFSET);
+}
+
+/*
+ * 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)
+{
+}
+
+/*
+ * Set new cache mode for some kernel address space.
+ * The caller must push data for that range itself, if such data may already
+ * be in the cache.
+ */
+void kernel_set_cachemode(void *addr, unsigned long size, int cmode)
+{
+}
diff --git a/arch/h8300/mm/memory.c b/arch/h8300/mm/memory.c
new file mode 100644 (file)
index 0000000..06e3646
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ *  linux/arch/h8300/mm/memory.c
+ *
+ *  Copyright (C) 2002  Yoshinori Sato <ysato@users.sourceforge.jp>,
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/mm/memory.c
+ *
+ *  Copyright (C) 1998  Kenneth Albanowski <kjahds@kjahds.com>,
+ *  Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68k/mm/memory.c
+ *
+ *  Copyright (C) 1995  Hamish Macdonald
+ */
+
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/types.h>
+
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/traps.h>
+#include <asm/io.h>
+
+void cache_clear (unsigned long paddr, int len)
+{
+}
+
+
+void cache_push (unsigned long paddr, int len)
+{
+}
+
+void cache_push_v (unsigned long vaddr, int len)
+{
+}
+
+/*
+ * Map some physical address range into the kernel address space.
+ */
+
+unsigned long kernel_map(unsigned long paddr, unsigned long size,
+                        int nocacheflag, unsigned long *memavailp )
+{
+       return paddr;
+}
+