linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] linux-2.6.0-test2 h8300 archtecure support update (2/6)
@ 2003-07-28 14:18 Yoshinori Sato
  0 siblings, 0 replies; only message in thread
From: Yoshinori Sato @ 2003-07-28 14:18 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux kernel Mailing List

interrupt management update
target-support file update
gcc-3.3 support
blkdev location cleanup
 
-- 
Yoshinori Sato
<ysato@users.sourceforge.jp>

diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/Rules.make linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/Rules.make
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/Rules.make	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/Rules.make	1970-01-01 09:00:00.000000000 +0900
@@ -1,51 +0,0 @@
-#
-# h8300h/Makefile
-#
-# This file is included by the global makefile so that you can add your own
-# platform-specific flags and dependencies.
-#
-# This file is subject to the terms and conditions of the GNU General Public
-# License.  See the file "COPYING" in the main directory of this archive
-# for more details.
-#
-# Copyright (c) 2001		Lineo, Inc, <www.lineo.com>
-# Copyright (c) 2000,2001	D. Jeff Dionne <jeff@lineo.ca>
-# Copyright (c) 1998,1999	D. Jeff Dionne <jeff@uclinux.org>
-# Copyright (C) 1998		Kenneth Albanowski <kjahds@kjahds.com>
-# Copyright (C) 1994 		Hamish Macdonald
-#
-# 68VZ328 Fixes By		Evan Stawnyczy <e@lineo.ca>
-# H8/300H Modify By             Yoshinori Sato <ysato@users.sourceforge.jp>
-
-CROSS_COMPILE = h8300-elf-
-
-GCC_DIR = $(shell $(CC) -v 2>&1 | grep specs | sed -e 's/.* \(.*\)specs/\1\./')
-
-INCGCC = $(GCC_DIR)/include
-LIBGCC = $(GCC_DIR)/h8300h/int32/libgcc.a
-
-CFLAGS := -fno-builtin -DNO_CACHE $(CFLAGS) -pipe -DNO_MM -DNO_FPU -DNO_CACHE -mh -mint32 -malign-300 -D__ELF__  -DNO_FORGET -DUTS_SYSNAME=\"uClinux\" -D__linux__ -DTARGET=$(BOARD)
-AFLAGS := $(AFLAGS) -pipe -DNO_MM -DNO_FPU -DNO_CACHE -mh -D__ELF__ -DUTS_SYSNAME=\"uClinux\"
-
-LINKFLAGS = -T arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/$(MODEL).ld
-LDFLAGS := $(LDFLAGS) -mh8300helf
-
-HEAD := arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/crt0_$(MODEL).o
-
-SUBDIRS := arch/$(ARCH)/kernel arch/$(ARCH)/mm arch/$(ARCH)/lib \
-           arch/$(ARCH)/platform/$(PLATFORM) \
-  	   arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD) \
-           $(SUBDIRS)
-
-CORE_FILES := arch/$(ARCH)/kernel/kernel.o arch/$(ARCH)/mm/mm.o \
-              arch/$(ARCH)/platform/$(PLATFORM)/platform.o \
-              arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/$(BOARD).o \
-	      $(CORE_FILES)
-
-LIBS += arch/$(ARCH)/lib/lib.a $(LIBGCC)
-
-linux.bin: linux
-	$(OBJCOPY) -O binary linux linux.bin
-	
-archclean:
-	rm -f linux
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/Makefile linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/Makefile
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/Makefile	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/Makefile	2003-07-14 15:17:52.000000000 +0900
@@ -6,8 +6,7 @@
 # unless it's something special (ie not a .c file).
 #
 
-all: $(BOARD).o
-O_TARGET := $(BOARD).o
+extra-y := crt0_ram.o
 obj-y := timer.o
 
 timer.o: timer.c
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S	2003-07-28 12:40:08.000000000 +0900
@@ -3,7 +3,7 @@
  *
  *  Yoshinori Sato <ysato@users.sourceforge.jp>
  *
- *  Platform depend startup for uClinux-2.4.x
+ *  Platform depend startup
  *  Target Archtecture:	AE-3068 (aka. aki3068net)
  *  Memory Layout     :	RAM
  */
@@ -13,6 +13,16 @@
 #include <linux/config.h>
 #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 SYMBOL_NAME(_start)
 	.global SYMBOL_NAME(command_line)
 	.global SYMBOL_NAME(_platform_gpio_table)
@@ -25,23 +35,28 @@
 
 	/* CPU Reset entry */
 SYMBOL_NAME_LABEL(_start)
-	mov.l	#__ramend,sp
+	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	er5,er6
-	inc.l	#1,er6
 	mov.l	#__ebss,er4
 	sub.l	er5,er4
-	sub.w	r0,r0
-	mov.b	r0l,@er5
+	shlr	er4
+	shlr	er4
+	sub.l	er0,er0
 1:	
-	eepmov.w
-	dec.w	#1,e4
-	bpl	1b
+	mov.l	er0,@er5
+	adds	#4,er5
+	dec.l	#1,er4
+	bne	1b
 
 	/* copy kernel commandline */
 	mov.l	#COMMAND_START,er5
@@ -49,22 +64,9 @@
 	mov.w	#512,r4
 	eepmov.w
 
-	/* RAM Interrupt Vector Table Setup */
-#if defined(CONFIG_GDB_DEBUG)
-	mov.l	@SYMBOL_NAME(interrupt_redirect_table)+11*4,er0
-#endif
-	mov.l	#SYMBOL_NAME(_vector_lma),er5
-	mov.l	#SYMBOL_NAME(interrupt_redirect_table),er6
-	mov.w	#0x100,r4
-	eepmov.w
-#if defined(CONFIG_GDB_DEBUG)
-	mov.l	er0,@SYMBOL_NAME(interrupt_redirect_table)+11*4
-#endif
-
 	/* uClinux kernel start */
 	ldc	#0x90,ccr	/* running kernel */
-	mov.l	#SYMBOL_NAME(init_task_union),sp
-	mov.l	sp,@SYMBOL_NAME(_current_task)
+	mov.l	#SYMBOL_NAME(init_thread_union),sp
 	add.l	#0x2000,sp
 	jsr	@_start_kernel
 _exit:
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/ram.ld linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/ram.ld
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/ram.ld	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/ram.ld	2003-07-14 15:17:52.000000000 +0900
@@ -5,86 +5,7 @@
 
 MEMORY 
 	{
-	ram    : ORIGIN = 0x400000, LENGTH = 0x600000-0x400000-0x80000
-	disk   : ORIGIN = 0x600000-0x80000, LENGTH = 0x60000
+	ram    : ORIGIN = 0x400000, LENGTH = 0x600000-0x400000
 	eram   : ORIGIN = 0x600000, LENGTH = 0
         iram   : ORIGIN = 0xffbf20, LENGTH = 0x4000
 	}
-
-SECTIONS
-{
-	.bootvec :
-	{
-	*(.bootvec)
-	} > ram
-        .text :
-	{
-	__stext = . ;
-        	*(.text)
-	. = ALIGN(0x4) ;
-		*(.text.*)
-	. = ALIGN(0x4) ;
-		*(.kstrtab)
-	. = ALIGN(0x4) ;
-		*(.rodata*)
-	. = ALIGN(16);          /* Exception table              */
-	___start___ex_table = .;
-		*(__ex_table)
-	___stop___ex_table = .;
-
-        ___start___ksymtab = .;  /* Kernel symbol table          */
-		 *(__ksymtab)
-	___stop___ksymtab = .;
-
-	. = ALIGN(0x4) ;
-	__etext = . ;
-        } > ram
-	.data : 
-	{
-	__sdata = . ;
-	___data_start = . ;
-		*(.data)
-		*(.data.*)	
-		*(.exitcall.exit)
-
-	. = ALIGN(0x2000) ;
-		*(.data.init_task)
-	. = ALIGN(0x2000) ;
-        ___init_begin = .;
-        *(.text.init)
-        *(.data.init)
-        . = ALIGN(16);
-        ___setup_start = .;
-        *(.setup.init)
-        ___setup_end = .;
-        ___initcall_start = .;
-        *(.initcall.init)
-        . = ALIGN(4) ;
-        ___initcall_end = .;
-        ___init_end = .;
-	__edata = . ;
-	. = ALIGN(0x4) ;
-	__sbss = . ;
-		*(.bss)
-	. = ALIGN(0x4) ;
-		*(COMMON)
-	. = ALIGN(0x4) ;
-	__ebss = . ;
-	__end = . ;
-	__ramstart = .;
-	} > ram
-	.blkimg :
-	{
-	__ramend = . ;
-	__blkimg = . ;
-	} > disk
-	.ram_vec : AT(ADDR(.data) + SIZEOF(.data))
-	{
-		*(.int_redirect)
-	} > iram 
-	__vector_lma = LOADADDR(.ram_vec);
-        .dummy2 :
-        {
-        COMMAND_START = . - 0x200 ;
-	} > eram
-}
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/timer.c linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/timer.c
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/aki3068net/timer.c	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/aki3068net/timer.c	2003-07-19 21:41:33.000000000 +0900
@@ -14,29 +14,32 @@
 #include <linux/param.h>
 #include <linux/string.h>
 #include <linux/mm.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/timex.h>
 
 #include <asm/segment.h>
 #include <asm/io.h>
 #include <asm/irq.h>
+#include <asm/regs306x.h>
 
-#include <linux/timex.h>
-
-#define TMR8CMA2 0x00ffff94
-#define TMR8TCSR2 0x00ffff92
-#define TMR8TCNT2 0x00ffff90
 #define CMFA 6
 
-int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *))
+extern int request_irq_boot(unsigned int,
+		             irqreturn_t (*handler)(int, void *, struct pt_regs *),
+		             unsigned long, const char *, void *);
+
+void __init platform_timer_setup(irqreturn_t (*timer_int)(int, void *, struct pt_regs *))
 {
-	outb(CONFIG_CLK_FREQ*10/8192,TMR8CMA2);
-	outb(0x00,TMR8TCSR2);
-	request_irq(40,timer_int,0,"timer",0);
-	outb(0x40|0x08|0x03,TMR8TCNT2);
+	outb(H8300_TIMER_COUNT_DATA,TCORA2);
+	outb(0x00,_8TCSR2);
+	request_irq_boot(40,timer_int,0,"timer",0);
+	outb(0x40|0x08|0x03,_8TCR2);
 }
 
 void platform_timer_eoi(void)
 {
-	*(unsigned char *)TMR8TCSR2 &= ~(1 << CMFA);
+	*(volatile unsigned char *)_8TCSR2 &= ~(1 << CMFA);
 }
 
 void platform_gettod(int *year, int *mon, int *day, int *hour,
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/entry.S linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/entry.S
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/entry.S	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/entry.S	2003-07-14 15:17:52.000000000 +0900
@@ -3,6 +3,7 @@
  *  linux/arch/h8300/platform/h8300h/entry.S
  *
  *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *  David McCullough <davidm@snapgear.com>
  *
  */
 
@@ -29,14 +30,17 @@
 		
 /* the following macro is used when enabling interrupts */
 
-LER3	=	0
-LER2	=	4
-LER1	=	8
-LORIG	=	12
-LCCR	=	16
-LER0	=	18
-LVEC	=	22
-LRET	=	24
+LER4	=	0
+LER5	=	4
+LER6	=	8
+LER3	=	12
+LER2	=	16
+LER1	=	20
+LORIG	=	24
+LCCR	=	28
+LER0	=	30
+LVEC	=	34
+LRET	=	38
 
 	.h8300h
 
@@ -44,100 +48,123 @@
 	
 	.macro	SAVE_ALL
 	mov.l	er0,@-sp
-	stc	ccr,r0l
+
+	stc	ccr,r0l				/* check kernel mode */
 	orc	#0x10,ccr
 	btst	#4,r0l
-	bne	1f
-	mov.l	sp,@SYMBOL_NAME(sw_usp)
+	bne	5f
+
+	mov.l	sp,@SYMBOL_NAME(sw_usp)		/* user mode */
 	mov.l	@sp,er0
 	mov.l	@SYMBOL_NAME(sw_ksp),sp
+	sub.l	#(LRET-LORIG),sp		/* allocate LORIG - LRET */ 
 	mov.l	er0,@-sp
-	stc	ccr,r0l
-	and	#0xef,r0l
-	mov.w	r0,@-sp
-	mov.l	@(2:16,sp),er0
-	bra	2f
-1:
-	mov.l	@sp,er0
-	stc	ccr,@-sp
-2:	
+	mov.l	er1,@-sp
+	mov.l   @SYMBOL_NAME(sw_usp),er0
+	mov.l   @(8:16,er0),er1                 /* copy the RET addr */
+	mov.l   er1,@(LRET-LER1:16,sp)
+
+	mov.w	e1,r1				/* e1 highbyte = ccr */
+	and	#0xef,r1h			/* mask mode? flag */
+	sub.w	r0,r0
+	mov.b	r1h,r0l
+	mov.w	r0,@(LCCR-LER1:16,sp)		/* copy ccr */
+	mov.l	@(LORIG-LER1:16,sp),er0
+	mov.l	er0,@(LER0-LER1:16,sp)		/* copy ER0 */
+	bra	6f
+5:
+	mov.l	@sp,er0				/* kernel mode */
+	subs	#2,sp				/* dummy ccr */
 	mov.l	er0,@-sp
 	mov.l	er1,@-sp
+	mov.w	@(LRET-LER1:16,sp),r1		/* copy old ccr */
+	mov.b	r1h,r1l
+	mov.b	#0,r1h
+	mov.w	r1,@(LCCR-LER1:16,sp)		/* set ccr */
+6:
 	mov.l	er2,@-sp
 	mov.l	er3,@-sp
+	mov.l	er6,@-sp			/* syscall arg #6 */
+	mov.l	er5,@-sp			/* syscall arg #5 */
+	mov.l	er4,@-sp			/* syscall arg #4 */
 	.endm
 
-	.macro RESTORE_REGS
-	mov.w	@(LCCR:16,sp),r0
+	.macro	RESTORE_ALL
+	mov.l	@sp+,er4
+	mov.l	@sp+,er5
+	mov.l	@sp+,er6
+	mov.l	@sp+,er3
+	mov.l	@sp+,er2
+	mov.w	@(LCCR-LER1:16,sp),r0		/* check kernel mode */
 	btst	#4,r0l
-	bne	1f
+	bne	7f
+
+	orc	#0x80,ccr
 	mov.l	@SYMBOL_NAME(sw_usp),er0
-	mov.l	@(LER0:16,sp),er1
+	mov.l	@(LER0-LER1:16,sp),er1		/* restore ER0 */
 	mov.l	er1,@er0
-	mov.l	@sp+,er3
-	mov.l	@sp+,er2
+	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,@(8:16,er0)
+
 	mov.l	@sp+,er1
-	add.l	#10,sp
+	add.l	#(LRET-LORIG),sp		/* remove LORIG - LRET */ 
 	mov.l	sp,@SYMBOL_NAME(sw_ksp)
 	mov.l	er0,sp
-	bra	2f
-1:
-	mov.l	@sp+,er3
-	mov.l	@sp+,er2
+	bra	8f
+7:
 	mov.l	@sp+,er1
 	adds	#4,sp
 	adds	#2,sp
-2:
+8:
 	mov.l	@sp+,er0
-	adds	#4,sp
-	.endm
-	
-	.macro	RESTORE_ALL
-	RESTORE_REGS
+	adds	#4,sp				/* remove the sw created LVEC */
 	rte
 	.endm
-
-#define SWITCH_STACK_SIZE (3*4+12)	/* includes return address */
-
-	.macro	SAVE_SWITCH_STACK
-	mov.l	er4,@-sp
-	mov.l	er5,@-sp
-	mov.l	er6,@-sp
-	.endm
-
-	.macro	RESTORE_SWITCH_STACK
-	mov.l	@sp+,er6
-	mov.l	@sp+,er5
-	mov.l	@sp+,er4
-	.endm
-
+	
 .globl SYMBOL_NAME(system_call)
 .globl SYMBOL_NAME(ret_from_exception)
+.globl SYMBOL_NAME(ret_from_fork)
 .globl SYMBOL_NAME(ret_from_signal)
-.globl SYMBOL_NAME(ret_from_interrupt), SYMBOL_NAME(bad_interrupt)
+.globl SYMBOL_NAME(ret_from_interrupt)
 .globl SYMBOL_NAME(interrupt_redirect_table)
 .globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
 .globl SYMBOL_NAME(resume)
-.globl SYMBOL_NAME(sys_vfork)
 .globl SYMBOL_NAME(syscall_trampoline)
-	
+.globl SYMBOL_NAME(interrupt_redirect_table)
+.globl SYMBOL_NAME(interrupt_entry)
+.globl SYMBOL_NAME(system_call)
+.globl SYMBOL_NAME(trace_break)
+
+#if defined(CONFIG_ROMKERNEL)
+INTERRUPTS = 64		
 	.section .int_redirect,"ax"
 SYMBOL_NAME_LABEL(interrupt_redirect_table)
 	.rept	7
 	.long	0
 	.endr
-	jsr	@interrupt_entry		/* NMI */
+	jsr	@SYMBOL_NAME(interrupt_entry)	/* NMI */
 	jmp	@SYMBOL_NAME(system_call)	/* TRAPA #0 (System call) */
 	.long	0
 	.long	0
 	jmp	@SYMBOL_NAME(trace_break)	/* TRAPA #3 (breakpoint) */
-	.rept	64-12
-	jsr	@interrupt_entry
+	.rept	INTERRUPTS-12
+	jsr	@SYMBOL_NAME(interrupt_entry)
 	.endr
+#endif
+#if defined(CONFIG_RAMKERNEL)
+.globl SYMBOL_NAME(interrupt_redirect_table)
+	.section .bss
+SYMBOL_NAME_LABEL(interrupt_redirect_table)
+	.space	4
+#endif
 
 	.section .text
 	.align	2
-interrupt_entry:
+SYMBOL_NAME_LABEL(interrupt_entry)
 	SAVE_ALL
 	mov.w	@(LCCR,sp),r0
 	btst	#4,r0l
@@ -148,114 +175,91 @@
 1:
 	mov.l	@(LVEC,sp),er0
 2:
+#if defined(CONFIG_ROMKERNEL)
 	sub.l	#SYMBOL_NAME(interrupt_redirect_table),er0
+#endif
+#if defined(CONFIG_RAMKERNEL)
+	mov.l	@SYMBOL_NAME(interrupt_redirect_table),er1
+	sub.l	er1,er0
+#endif
 	shlr.l	er0
 	shlr.l	er0
 	dec.l	#1,er0
 	mov.l	sp,er1
+	subs	#4,er1				/* adjust ret_pc */
 	jsr	@SYMBOL_NAME(process_int)
 	mov.l	@SYMBOL_NAME(irq_stat)+SOFTIRQ_PENDING,er0
 	beq	1f
 	jsr	@SYMBOL_NAME(do_softirq)
 1:
 	jmp	@SYMBOL_NAME(ret_from_exception)
-
+	
 SYMBOL_NAME_LABEL(system_call)
-	subs	#4,sp
+	subs	#4,sp				/* dummy LVEC */
 	SAVE_ALL
-	mov.l	er0,er3
+	mov.w	@(LCCR:16,sp),r1
+	bset	#4,r1l
+	ldc	r1l,ccr
+	mov.l	er0,er4
 	mov.l	#-ENOSYS,er0
 	mov.l	er0,@(LER0:16,sp)
 
 	/* save top of frame */
 	mov.l	sp,er0
-	mov.l	er3,@-sp
 	jsr	@SYMBOL_NAME(set_esp0)
-	mov.l	@sp+,er3
-	cmp.l	#NR_syscalls,er3
+	cmp.l	#NR_syscalls,er4
 	bcc	SYMBOL_NAME(ret_from_exception):16
-	shll.l	er3
-	shll.l	er3
+	shll.l	er4
+	shll.l	er4
 	mov.l	#SYMBOL_NAME(sys_call_table),er0
-	add.l	er3,er0
-	mov.l	@er0,er0
-	mov.l	er0,er3
+	add.l	er4,er0
+	mov.l	@er0,er4
 	beq	SYMBOL_NAME(ret_from_exception):16	
-	mov.l	@SYMBOL_NAME(_current_task),er2
+	mov.l	sp,er2
+	and.w	#0xe000,r2
 	mov.b	@((TASK_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
 	btst	#(TIF_SYSCALL_TRACE & 7),r2l
 	bne	1f
 	mov.l	@(LER1:16,sp),er0
 	mov.l	@(LER2:16,sp),er1
 	mov.l	@(LER3:16,sp),er2
-	mov.l	er5,@-sp
-	mov.l	er4,@-sp
-	jsr	@er3
-	adds	#4,sp
-	adds	#4,sp
-	mov.l	er0,@(LER0,sp)		/* save the return value */
+	jsr	@er4
+	mov.l	er0,@(LER0,sp)			/* save the return value */
 #if defined(CONFIG_SYSCALL_PRINT)
 	jsr	@SYMBOL_NAME(syscall_print)
 #endif
 	jmp	@SYMBOL_NAME(ret_from_exception)
 1:
-	SAVE_SWITCH_STACK
-	mov.l	er3,er5			/* save syscall entry */
 	jsr	SYMBOL_NAME(syscall_trace)
-	mov.l	er5,er3
-	RESTORE_SWITCH_STACK
 	mov.l	@(LER1:16,sp),er0
 	mov.l	@(LER2:16,sp),er1
 	mov.l	@(LER3:16,sp),er2
-	mov.l	er5,@-sp
-	mov.l	er4,@-sp
-	jsr	@er3
-	adds	#4,sp
-	adds	#4,sp
+	jsr	@er4
 	mov.l	er0,@(LER0:16,sp)		/* save the return value */
-	SAVE_SWITCH_STACK
 	jsr	SYMBOL_NAME(syscall_trace)
 
 SYMBOL_NAME_LABEL(ret_from_signal)
-	RESTORE_SWITCH_STACK
 
 SYMBOL_NAME_LABEL(ret_from_exception)
 	mov.b	@(LCCR+1:16,sp),r0l
 	btst	#4,r0l			/* check if returning to kernel */
 	bne	3f			/* if so, skip resched, signals */
 	andc	#0x7f,ccr
-	mov.l	@SYMBOL_NAME(_current_task),er0
+	mov.l	sp,er2
+	and.w	#0xe000,r2
 	mov.l	@(TI_FLAGS:16,er2),er1
 	and.l	#_TIF_WORK_MASK,er1
-	bne	1f
-	mov.l	@((TASK_THREAD+THREAD_VFORK):16,er0),er1 
-	bne	Lvfork_return
-3:	 
-	RESTORE_ALL			/* Does RTE */
+	beq	3f
 1:
 	mov.l	@(TI_FLAGS:16,er2),er1
 	btst	#TIF_NEED_RESCHED,r1l
 	bne	@SYMBOL_NAME(reschedule):16
-
-Lsignal_return:
-	SAVE_SWITCH_STACK
 	mov.l	sp,er1
-	add	#12,er1
 	mov.l	er2,er0
 	jsr	@SYMBOL_NAME(do_signal)
-	RESTORE_SWITCH_STACK
-	mov.l	@SYMBOL_NAME(_current_task),er0
-	mov.l	@((TASK_THREAD+THREAD_VFORK):16,er0),er1 
-	bne	Lvfork_return
-	RESTORE_ALL
-
-Lvfork_return:
-	sub.l	er2,er2
-	mov.l	er2,@((TASK_THREAD+THREAD_VFORK):16,er0)
-	mov.l	@SYMBOL_NAME(sw_usp),er0
-	mov.l	er1,@(8:16,er0)
-	RESTORE_ALL
-	
+3:	 
+	RESTORE_ALL			/* Does RTE */
+
 SYMBOL_NAME_LABEL(reschedule)
 	/* save top of frame */
 	mov.l	sp,er0
@@ -265,6 +269,11 @@
 	mov.l	er0,@-sp
 	jmp	@SYMBOL_NAME(schedule)
 
+SYMBOL_NAME_LABEL(ret_from_fork)
+	mov.l	er2,er0
+	jsr	@SYMBOL_NAME(schedule_tail)
+	jmp	@SYMBOL_NAME_LABEL(ret_from_exception)	
+
 SYMBOL_NAME_LABEL(resume)
 	/*
 	 * Beware - when entering resume, offset of tss is in d1,
@@ -277,17 +286,13 @@
 	/* save sr */
 	sub.w	r3,r3
 	stc	ccr,r3l
-	mov.w	r3,@(THREAD_CCR:16,er0)
-	SAVE_SWITCH_STACK
+	mov.w	r3,@(THREAD_CCR+2:16,er0)
 
 	/* disable interrupts */
 	orc	#0x80,ccr
 	mov.l	@SYMBOL_NAME(sw_usp),er3
 	mov.l	er3,@(THREAD_USP:16,er0)
 	mov.l	sp,@(THREAD_KSP:16,er0)
-	
-	/* get pointer to tss struct (a1 contains new task) */
-	mov.l	er1,@SYMBOL_NAME(_current_task)
 
 	/* Skip address space switching if they are the same. */
 	/* FIXME: what did we hack out of here, this does nothing! */
@@ -295,23 +300,13 @@
 	mov.l	@(THREAD_USP:16,er1),er0
 	mov.l	er0,@SYMBOL_NAME(sw_usp)
 	mov.l	@(THREAD_KSP:16,er1),sp
-	RESTORE_SWITCH_STACK
 			
 	/* restore status register */
-	mov.w	@(THREAD_CCR:16,er1),r3
+	mov.w	@(THREAD_CCR+2:16,er1),r3
 
 	ldc	r3l,ccr
-
 	rts
 	
-/* Handler for uninitialized and spurious interrupts */
-
-SYMBOL_NAME_LABEL(bad_interrupt)
-	mov.l	@SYMBOL_NAME(num_spurious),er0
-	inc.l	#1,er0
-	mov.l	er0,@SYMBOL_NAME(num_spurious)
-	rts
-
 SYMBOL_NAME_LABEL(trace_break)
 	subs	#4,sp
 	SAVE_ALL
@@ -329,26 +324,10 @@
 	jsr	@SYMBOL_NAME(trace_trap)
 	jmp	@SYMBOL_NAME(ret_from_exception)	
 
-SYMBOL_NAME_LABEL(sys_vfork)
-	SAVE_SWITCH_STACK
-	mov.l	@SYMBOL_NAME(sw_usp),er6
-	mov.l	@(8:16,er6),er6
-	mov.l	sp,er0
-	add.l	#SWITCH_STACK_SIZE,er0
-	jsr	@SYMBOL_NAME(h8300_vfork)
-	mov.l	@SYMBOL_NAME(_current_task),er5
-	mov.l	er6,@((TASK_THREAD+THREAD_VFORK):16,er5)
-	RESTORE_SWITCH_STACK
-	rts
-
 SYMBOL_NAME_LABEL(syscall_trampoline)
-	SAVE_SWITCH_STACK
 	mov.l	er0,er6
 	mov.l	sp,er0
-	add.l	#SWITCH_STACK_SIZE,er0
-	jsr	@er6
-	RESTORE_SWITCH_STACK
-	rts
+	jmp	@er6
 
 	.section	.bss
 SYMBOL_NAME_LABEL(sw_ksp)
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/Makefile linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/Makefile
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/Makefile	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/Makefile	2003-07-14 15:17:52.000000000 +0900
@@ -6,7 +6,8 @@
 # unless it's something special (ie not a .c file).
 #
 
-obj-y := timer.o crt0_$(MODEL).o
+obj-y := timer.o
+extra-y =  crt0_$(MODEL).o
 
 clean:
 	rm -f *.[oa]
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/crt0_ram.S linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/crt0_ram.S
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/crt0_ram.S	1970-01-01 09:00:00.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/crt0_ram.S	2003-07-28 12:40:08.000000000 +0900
@@ -0,0 +1,108 @@
+/*
+ *  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 <linux/config.h>
+#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 SYMBOL_NAME(_start)
+	.global SYMBOL_NAME(command_line)
+	.global SYMBOL_NAME(_platform_gpio_table)
+	.global SYMBOL_NAME(_target_name)
+	
+	.h8300h
+
+	.section .text
+	.file	"crt0_ram.S"
+
+	/* CPU Reset entry */
+SYMBOL_NAME_LABEL(_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	#SYMBOL_NAME(command_line),er6
+	mov.w	#512,r4
+	eepmov.w
+
+	/* uClinux kernel start */
+	ldc	#0x90,ccr	/* running kernel */
+	mov.l	#SYMBOL_NAME(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 -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/crt0_rom.S linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/crt0_rom.S
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/crt0_rom.S	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/crt0_rom.S	2003-07-19 21:41:33.000000000 +0900
@@ -3,7 +3,7 @@
  *
  *  Yoshinori Sato <ysato@users.sourceforge.jp>
  *
- *  Platform depend startup for uClinux-2.4.x
+ *  Platform depend startup
  *  Target Archtecture:	generic
  *  Memory Layout     :	ROM
  */
@@ -31,16 +31,16 @@
 	
 	/* .bss clear */
 	mov.l	#__sbss,er5
-	mov.l	er5,er6
-	inc.l	#1,er6
 	mov.l	#__ebss,er4
 	sub.l	er5,er4
-	sub.w	r0,r0
-	mov.b	r0l,@er5
+	shlr	er4
+	shlr	er4
+	sub.l	er0,er0
 1:	
-	eepmov.w
-	dec.w	#1,e4
-	bpl	1b
+	mov.l	er0,@er5
+	adds	#4,er5
+	dec.l	#1,er4
+	bne	1b
 
 	/* copy .data */
 #if !defined(CONFIG_H8300H_SIM)
@@ -60,10 +60,9 @@
 	mov.w	#512,r4
 	eepmov.w
 
-	/* uClinux kernel start */
+	/* linux kernel start */
 	ldc	#0x90,ccr	/* running kernel */
 	mov.l	#SYMBOL_NAME(init_thread_union),sp
-	mov.l	sp,@SYMBOL_NAME(_current_task)
 	add.l	#0x2000,sp
 	jsr	@_start_kernel
 _exit:
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/ram.ld linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/ram.ld
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/ram.ld	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/ram.ld	2003-07-28 12:40:08.000000000 +0900
@@ -1,76 +1,11 @@
-/* AKI3068NET RAM */
+/* Generic RAM */
 
 OUTPUT_ARCH(h8300h)
 ENTRY("__start")
 
 MEMORY 
 	{
-	ram    : ORIGIN = 0x400000, LENGTH = 0xA0000
-/*	rdisk  : ORIGIN = 0x4A0000, LENGTH = 0x70000 */
-/*	uram   : ORIGIN = 0x510000, LENGTH = 0xF0000 */
-	uram   : ORIGIN = 0x4A0000, LENGTH = 0x160000
+	ram    : ORIGIN = 0x400000, LENGTH = 0x200000
 	eram   : ORIGIN = 0x600000, LENGTH = 0
         iram   : ORIGIN = 0xffbf20, LENGTH = 0x4000
 	}
-
-SECTIONS
-{
-	.bootvec :
-	{
-	*(.bootvec)
-	} > ram
-        .text :
-	{
-	__stext = . ;
-        *(.text)
-	__etext = . ;
-        } > ram
-	.rodata :
-	{
-	___data_rom_start = ALIGN ( 4 ) ;
-	} > ram
-	.erom :
-	{
-	__erom = . ;
-	} > ram
-	.data : 
-	{
-	__ramstart = . ;
-	__sdata = . ;
-	___data_start = . ;
-        *(.data)
-	__edata = . ;
-	edata = ALIGN( 0x10 ) ;
-	___data_end = ALIGN( 0x10 ) ;
-	} > ram
-        .bss :
-        {
-	__sbss = . ;
-	___bss_start = . ;
-	*(.bss)
-	*(COMMON)
-	__ebss = . ;
-	___bss_end = . ;
-	} > ram
-/*
-	.rootimg :
-	{
-	__rootimage = . ;
-	} > rdisk
-*/
-	.dummy1 :
-	{
-	end = ALIGN( 0x10 ) ;
-	__end = ALIGN( 0x10 ) ;
-	} > uram
-	.ram_vec : AT(___bss_end)
-	{
-	__ram_vector       = . ;
-	} > iram 
-	__ram_vector_image = LOADADDR(.ram_vec) ;
-        .dummy2 :
-        {
-        _COMMAND_START = . - 0x200 ;
-	__ramend = . ;
-	} > eram
-}
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/rom.ld linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/rom.ld
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/rom.ld	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/rom.ld	2003-07-28 12:40:08.000000000 +0900
@@ -1,123 +1,12 @@
 OUTPUT_ARCH(h8300h)
 ENTRY("__start")
 
-/*INPUT(rootimage.o)*/
-
-_jiffies = _jiffies_64 + 4;
-
 MEMORY 
 	{
 	vector : ORIGIN = 0x000000, LENGTH = 0x000100
 	rom    : ORIGIN = 0x000100, LENGTH = 0x200000-0x000100
-	erom   : ORIGIN = 0x200000, LENGTH = 1
-	ram    : ORIGIN = 0x200000, LENGTH = 0x100000
-	eram   : ORIGIN = 0x2fa000, LENGTH = 1
+	erom   : ORIGIN = 0x200000, LENGTH = 0
+	ram    : ORIGIN = 0x200000, LENGTH = 0x400000
+	eram   : ORIGIN = 0x600000, LENGTH = 0
 	}
 
-SECTIONS
-{
-	.vectors :
-	{
-	__vector = . ;
-		*(.vectors*)
-	} > vector
-        .text :
-	{
-		*(.int_redirect)
-	__stext = . ;
-        	*(.text)
-	. = ALIGN(0x4) ;
-		*(.exit.text)
-		*(.text.*)
-	. = ALIGN(0x4) ;
-		*(.exitcall.exit)
-	. = ALIGN(0x4) ;
-		*(.kstrtab)
-	. = ALIGN(0x4) ;
-		*(.rodata*)
-	. = ALIGN(16);          /* Exception table              */
-	___start___ex_table = .;
-		*(__ex_table)
-	___stop___ex_table = .;
-
-        ___start___ksymtab = .;  /* Kernel symbol table          */
-		 *(__ksymtab)
-	___stop___ksymtab = .;
-
-	. = ALIGN(0x4) ;
-	__etext = . ;
-	} > rom
-	.data : AT( ADDR(.text)+SIZEOF(.text))
-	{
-	__sdata = . ;
-	___data_start = . ;
-
-	. = ALIGN(0x2000) ;
-		*(.data.init_task)
-	. = ALIGN(0x4) ;
-		*(.data)
-	. = ALIGN(0x4) ;
-		*(.data.*)	
-
-	. = ALIGN(0x4) ;
-	___init_begin = .;
-		*(.init.text)
-		*(.init.data)
-	. = ALIGN(0x4) ;
-	___setup_start = .;
-		*(.init.setup)
-	. = ALIGN(0x4) ;
-	___setup_end = .;
-	___start___param = .;
-		*(__param)
-	___stop___param = .;
-	___initcall_start = .;
-		*(.initcall1.init)
-		*(.initcall2.init)
-		*(.initcall3.init)
-		*(.initcall4.init)
-		*(.initcall5.init)
-		*(.initcall6.init)
-		*(.initcall7.init)
-	___initcall_end = .;
-	___con_initcall_start = .;
-		*(.con_initcall.init)
-	___con_initcall_end = .;
-	SECURITY_INIT
-		. = ALIGN(4);
-	___initramfs_start = .;
-  		*(.init.ramfs)
-  	___initramfs_end = .;
-	. = ALIGN(0x4) ;
-	___init_end = .;
-
-	__edata = . ;
-	} > ram
-	__begin_data = LOADADDR(.data) ;
-	.blkimg : AT( LOADADDR(.data) + SIZEOF(.data))
-	{
-	__blkimg = . ;
-		*(.rootimg*)
-	} > rom
-	.erom :
-	{
-	__erom = . ;
-	} > erom
-        .bss :
-        {
-	. = ALIGN(0x4) ;
-	__sbss = . ;
-		*(.bss)
-	. = ALIGN(0x4) ;
-		*(COMMON)
-	. = ALIGN(0x4) ;
-	__ebss = . ;
-	__end = . ;
-	__ramstart = .;
-	} > ram
-        .dummy :
-        {
-        COMMAND_START = . - 0x200 ;
-	__ramend = . ;
-	} > eram
-}
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/timer.c linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/timer.c
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/generic/timer.c	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/generic/timer.c	2003-07-19 21:41:33.000000000 +0900
@@ -1,7 +1,7 @@
 /*
  *  linux/arch/h8300/platform/h8300h/generic/timer.c
  *
- *  Yoshinori Sato <qzb04471@nifty.ne.jp>
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
  *
  *  Platform depend Timer Handler
  *
@@ -22,27 +22,31 @@
 
 #include <linux/timex.h>
 
+extern int request_irq_boot(unsigned int,
+		             irqreturn_t (*handler)(int, void *, struct pt_regs *),
+		             unsigned long, const char *, void *);
+
+
 #if defined(CONFIG_H83007) || defined(CONFIG_H83068)
-#define TMR8CMA2 0x00ffff94
-#define TMR8TCSR2 0x00ffff92
-#define TMR8TCNT2 0x00ffff90
+#include <asm/regs306x.h>
 
 int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *))
 {
 	outb(H8300_TIMER_COUNT_DATA,TMR8CMA2);
 	outb(0x00,TMR8TCSR2);
-	request_irq(40,timer_int,0,"timer",0);
+	request_irq_boot(40,timer_int,0,"timer",0);
 	outb(0x40|0x08|0x03,TMR8TCNT2);
 	return 0;
 }
 
 void platform_timer_eoi(void)
 {
-        __asm__("bclr #6,@0xffff92:8");
+	*(volatile unsigned char *)_8TCSR2 &= ~(1 << CMFA);
 }
 #endif
 
 #if defined(H8_3002) || defined(CONFIG_H83048)
+/* FIXME! */
 #define TSTR 0x00ffff60
 #define TSNC 0x00ffff61
 #define TMDR 0x00ffff62
@@ -63,7 +67,7 @@
 	*(unsigned short *)TCNT=0;
 	outb(0x23,TCR);
 	outb(0x00,TIOR);
-	request_irq(26,timer_int,0,"timer",0);
+	request_timer_irq(26,timer_int,0,"timer",0);
 	outb(inb(TIER) | 0x01,TIER);
 	outb(inb(TSNC) & ~0x01,TSNC);
 	outb(inb(TMDR) & ~0x01,TMDR);
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/Makefile linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/Makefile
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/Makefile	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/Makefile	2003-07-14 15:17:52.000000000 +0900
@@ -6,8 +6,7 @@
 # unless it's something special (ie not a .c file).
 #
 
-all: $(BOARD).o
-O_TARGET := $(BOARD).o
+extra-y := crt0_ram.o
 obj-y := timer.o
 
 timer.o: timer.c
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/crt0_ram.S linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/crt0_ram.S
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/crt0_ram.S	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/crt0_ram.S	2003-07-28 12:40:08.000000000 +0900
@@ -3,7 +3,7 @@
  *
  *  Yoshinori Sato <ysato@users.sourceforge.jp>
  *
- *  Platform depend startup for uClinux-2.4.x
+ *  Platform depend startup
  *  Target Archtecture:	H8MAX
  *  Memory Layout     :	RAM
  */
@@ -13,6 +13,16 @@
 #include <linux/config.h>
 #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 SYMBOL_NAME(_start)
 	.global SYMBOL_NAME(command_line)
 	.global SYMBOL_NAME(_platform_gpio_table)
@@ -25,23 +35,28 @@
 
 	/* CPU Reset entry */
 SYMBOL_NAME_LABEL(_start)
-	mov.l	#__ramend,sp
+	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	er5,er6
-	inc.l	#1,er6
 	mov.l	#__ebss,er4
 	sub.l	er5,er4
-	sub.w	r0,r0
-	mov.b	r0l,@er5
+	shlr	er4
+	shlr	er4
+	sub.l	er0,er0
 1:	
-	eepmov.w
-	dec.w	#1,e4
-	bpl	1b
+	mov.l	er0,@er5
+	adds	#4,er5
+	dec.l	#1,er4
+	bne	1b
 
 	/* copy kernel commandline */
 	mov.l	#COMMAND_START,er5
@@ -49,22 +64,9 @@
 	mov.w	#512,r4
 	eepmov.w
 
-	/* RAM Interrupt Vector Table Setup */
-#if defined(CONFIG_GDB_DEBUG)
-	mov.l	@SYMBOL_NAME(interrupt_redirect_table)+11*4,er0
-#endif
-	mov.l	#SYMBOL_NAME(_vector_lma),er5
-	mov.l	#SYMBOL_NAME(interrupt_redirect_table),er6
-	mov.w	#0x100,r4
-	eepmov.w
-#if defined(CONFIG_GDB_DEBUG)
-	mov.l	er0,@SYMBOL_NAME(interrupt_redirect_table)+11*4
-#endif
-
 	/* uClinux kernel start */
 	ldc	#0x90,ccr	/* running kernel */
-	mov.l	#SYMBOL_NAME(init_task_union),sp
-	mov.l	sp,@SYMBOL_NAME(_current_task)
+	mov.l	#SYMBOL_NAME(init_thread_union),sp
 	add.l	#0x2000,sp
 	jsr	@_start_kernel
 _exit:
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/ram.ld linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/ram.ld
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/ram.ld	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/ram.ld	2003-07-14 15:17:52.000000000 +0900
@@ -5,86 +5,7 @@
 
 MEMORY 
 	{
-	ram    : ORIGIN = 0x400000, LENGTH = 0x600000-0x400000-0xc000
-	disk   : ORIGIN = 0x600000-0xc000, LENGTH = 0xc000
+	ram    : ORIGIN = 0x400000, LENGTH = 0x600000-0x400000
 	eram   : ORIGIN = 0x600000, LENGTH = 0
         iram   : ORIGIN = 0xfffd20, LENGTH = 0x100
 	}
-
-SECTIONS
-{
-	.bootvec :
-	{
-	*(.bootvec)
-	} > ram
-        .text :
-	{
-	__stext = . ;
-        	*(.text)
-	. = ALIGN(0x4) ;
-		*(.text.*)
-	. = ALIGN(0x4) ;
-		*(.kstrtab)
-	. = ALIGN(0x4) ;
-		*(.rodata*)
-	. = ALIGN(16);          /* Exception table              */
-	___start___ex_table = .;
-		*(__ex_table)
-	___stop___ex_table = .;
-
-        ___start___ksymtab = .;  /* Kernel symbol table          */
-		 *(__ksymtab)
-	___stop___ksymtab = .;
-
-	. = ALIGN(0x4) ;
-	__etext = . ;
-        } > ram
-	.data : 
-	{
-	__sdata = . ;
-	___data_start = . ;
-		*(.data)
-		*(.data.*)	
-		*(.exitcall.exit)
-
-	. = ALIGN(0x2000) ;
-		*(.data.init_task)
-	. = ALIGN(0x2000) ;
-        ___init_begin = .;
-        *(.text.init)
-        *(.data.init)
-        . = ALIGN(16);
-        ___setup_start = .;
-        *(.setup.init)
-        ___setup_end = .;
-        ___initcall_start = .;
-        *(.initcall.init)
-        . = ALIGN(4) ;
-        ___initcall_end = .;
-        ___init_end = .;
-	__edata = . ;
-	. = ALIGN(0x4) ;
-	__sbss = . ;
-		*(.bss)
-	. = ALIGN(0x4) ;
-		*(COMMON)
-	. = ALIGN(0x4) ;
-	__ebss = . ;
-	__end = . ;
-	__ramstart = .;
-	} > ram
-	.blkimg :
-	{
-	__ramend = . ;
-	__blkimg = . ;
-	} > disk
-	.ram_vec : AT(ADDR(.data) + SIZEOF(.data))
-	{
-		*(.int_redirect)
-	} > iram 
-	__vector_lma = LOADADDR(.ram_vec);
-        .dummy2 :
-        {
-        COMMAND_START = . - 0x200 ;
-	} > eram
-}
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/timer.c linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/timer.c
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/h8max/timer.c	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/h8max/timer.c	2003-07-19 21:41:33.000000000 +0900
@@ -14,29 +14,32 @@
 #include <linux/param.h>
 #include <linux/string.h>
 #include <linux/mm.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/timex.h>
 
 #include <asm/segment.h>
 #include <asm/io.h>
 #include <asm/irq.h>
+#include <asm/regs306x.h>
 
-#include <linux/timex.h>
-
-#define TMR8CMA2 0x00ffff94
-#define TMR8TCSR2 0x00ffff92
-#define TMR8TCNT2 0x00ffff90
 #define CMFA 6
 
-int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *))
+extern int request_irq_boot(unsigned int,
+		             irqreturn_t (*handler)(int, void *, struct pt_regs *),
+		             unsigned long, const char *, void *);
+
+void __init platform_timer_setup(irqreturn_t (*timer_int)(int, void *, struct pt_regs *))
 {
-	outb(CONFIG_CLK_FREQ*10/8192,TMR8CMA2);
-	outb(0x00,TMR8TCSR2);
-	request_irq(40,timer_int,0,"timer",0);
-	outb(0x40|0x08|0x03,TMR8TCNT2);
+	outb(H8300_TIMER_COUNT_DATA,TCORA2);
+	outb(0x00,_8TCSR2);
+	request_irq_boot(40,timer_int,0,"timer",0);
+	outb(0x40|0x08|0x03,_8TCR2);
 }
 
 void platform_timer_eoi(void)
 {
-	*(unsigned char *)TMR8TCSR2 &= ~(1 << CMFA);
+	*(volatile unsigned char *)_8TCSR2 &= ~(1 << CMFA);
 }
 
 void platform_gettod(int *year, int *mon, int *day, int *hour,
@@ -44,3 +47,4 @@
 {
 	*year = *mon = *day = *hour = *min = *sec = 0;
 }
+
diff -Nru linux-2.6.0-test2/arch/h8300/platform/h8300h/ints.c linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/ints.c
--- linux-2.6.0-test2/arch/h8300/platform/h8300h/ints.c	2003-07-14 15:00:21.000000000 +0900
+++ linux-2.6.0-test2-h8300/arch/h8300/platform/h8300h/ints.c	2003-07-19 21:41:33.000000000 +0900
@@ -18,6 +18,9 @@
 #include <linux/sched.h>
 #include <linux/kernel_stat.h>
 #include <linux/seq_file.h>
+#include <linux/init.h>
+#include <linux/random.h>
+#include <linux/bootmem.h>
 
 #include <asm/system.h>
 #include <asm/irq.h>
@@ -27,8 +30,7 @@
 #include <asm/gpio.h>
 #include <asm/hardirq.h>
 #include <asm/regs306x.h>
-
-#define INTERNAL_IRQS (64)
+#include <asm/errno.h>
 
 #define EXT_IRQ0 12
 #define EXT_IRQ1 13
@@ -39,75 +41,144 @@
 #define EXT_IRQ6 18
 #define EXT_IRQ7 19
 
-#define WDT_IRQ 20
+/*
+ * This structure has only 4 elements for speed reasons
+ */
+typedef struct irq_handler {
+	irqreturn_t (*handler)(int, void *, struct pt_regs *);
+	int         flags;
+	int         count;
+	void	    *dev_id;
+	const char  *devname;
+} irq_handler_t;
 
-/* table for system interrupt handlers */
-static irq_handler_t irq_list[SYS_IRQS];
+irq_handler_t *irq_list[NR_IRQS];
 
-/* The number of spurious interrupts */
-volatile unsigned int num_spurious;
+extern unsigned long *interrupt_redirect_table;
 
-/* assembler routines */
-asmlinkage void system_call(void);
-asmlinkage void bad_interrupt(void);
+static inline unsigned long *get_vector_address(void)
+{
+	unsigned long *rom_vector = (unsigned long *)0x000000;
+	unsigned long base,tmp;
+	int vec_no;
 
-/* irq node variables for the 32 (potential) on chip sources */
-/*static irq_node_t *int_irq_list[INTERNAL_IRQS];*/
-static int int_irq_count[INTERNAL_IRQS];
+	base = rom_vector[EXT_IRQ0];
+	
+	/* check romvector format */
+	for (vec_no = EXT_IRQ1; vec_no <= EXT_IRQ5; vec_no++) {
+		if ((base+(vec_no - EXT_IRQ0)*4) != rom_vector[vec_no])
+			return NULL;
+	}
 
-#if 0
-static void int_badint(int irq, void *dev_id, struct pt_regs *fp)
-{
-	num_spurious += 1;
+	/* ramvector base address */
+	base -= EXT_IRQ0*4;
+
+	/* writerble check */
+	tmp = ~(*(volatile unsigned long *)base);
+	(*(volatile unsigned long *)base) = tmp;
+	if ((*(volatile unsigned long *)base) != tmp)
+		return NULL;
+	return (unsigned long *)base;
 }
-#endif
 
-void init_IRQ(void)
+void __init init_IRQ(void)
 {
+#if defined(CONFIG_RAMKERNEL)
 	int i;
+	unsigned long *ramvec,*ramvec_p;
+	unsigned long break_vec;
+
+#if defined(CONFIG_GDB_DEBUG)
+	break_vec = ramvec[TRAP3_VEC];
+#else
+	break_vec = VECTOR(trace_break);
+#endif
 
-	for (i = 0; i < SYS_IRQS; i++) {
-		irq_list[i].handler = NULL;
-		irq_list[i].flags   = 0;
-		irq_list[i].devname = NULL;
-		irq_list[i].dev_id  = NULL;
+	ramvec = get_vector_address();
+	if (ramvec == NULL)
+		panic("interrupt vector serup failed.");
+	else
+		printk("virtual vector at 0x%08lx\n",(unsigned long)ramvec);
+
+	for (ramvec_p = ramvec, i = 0; i < NR_IRQS; i++)
+		*ramvec_p++ = REDIRECT(interrupt_entry);
+
+	ramvec[TRAP0_VEC] = VECTOR(system_call);
+	ramvec[TRAP3_VEC] = break_vec;
+	interrupt_redirect_table = ramvec;
+#ifdef DUMP_VECTOR
+	ramvec_p = interrupt_redirect_table;
+	for (i = 0; i < NR_IRQS; i++) {
+		if ((i % 8) == 0)
+			printk("\n%p: ",ramvec_p);
+		printk("%p ",*ramvec_p);
+		ramvec_p++;
 	}
+	printk("\n");
+#endif
+#endif
+}
 
+void __init request_irq_boot(unsigned int irq, 
+  	                     irqreturn_t (*handler)(int, void *, struct pt_regs *),
+                             unsigned long flags, const char *devname, void *dev_id)
+{
+	irq_handler_t *irq_handle;
+	irq_handle = alloc_bootmem(sizeof(irq_handler_t));
+	irq_handle->handler = handler;
+	irq_handle->flags   = flags;
+	irq_handle->count   = 0;
+	irq_handle->dev_id  = dev_id;
+	irq_handle->devname = devname;
+	irq_list[irq] = irq_handle;
 }
 
-int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
+int request_irq(unsigned int irq, 
+		irqreturn_t (*handler)(int, void *, struct pt_regs *),
                 unsigned long flags, const char *devname, void *dev_id)
 {
+	irq_handler_t *irq_handle;
+	if (irq < 0 || irq >= NR_IRQS) {
+		printk("Incorrect IRQ %d from %s\n", irq, devname);
+		return -EINVAL;
+	}
+	if (irq_list[irq])
+		return -EBUSY;
 	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ3) {
 		if (H8300_GPIO_RESERVE(H8300_GPIO_P8, 1 << (irq - EXT_IRQ0)) == 0)
-			return 1;
+			return -EBUSY;
 		H8300_GPIO_DDR(H8300_GPIO_P8, (irq - EXT_IRQ0), 0);
 	}
 	if (irq >= EXT_IRQ4 && irq <= EXT_IRQ5) {
 		if (H8300_GPIO_RESERVE(H8300_GPIO_P9, 1 << (irq - EXT_IRQ0)) == 0)
-			return 1;
+			return -EBUSY;
 		H8300_GPIO_DDR(H8300_GPIO_P9, (irq - EXT_IRQ0), 0);
 	}
-	irq_list[irq].handler = handler;
-	irq_list[irq].flags   = flags;
-	irq_list[irq].devname = devname;
-	irq_list[irq].dev_id  = dev_id;
-	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ5)
-		*(volatile unsigned char *)IER |= 1 << (irq - EXT_IRQ0);
+	irq_handle = (irq_handler_t *)kmalloc(sizeof(irq_handler_t), GFP_ATOMIC);
+	if (irq_handle == NULL)
+		return -ENOMEM;
+
+	irq_handle->handler = handler;
+	irq_handle->flags   = flags;
+	irq_handle->count   = 0;
+	irq_handle->dev_id  = dev_id;
+	irq_handle->devname = devname;
+	irq_list[irq] = irq_handle;
 	return 0;
 }
 
 void free_irq(unsigned int irq, void *dev_id)
 {
-	if (irq_list[irq].dev_id != dev_id)
-		printk("%s: Removing probably wrong IRQ %d from %s\n",
-		       __FUNCTION__, irq, irq_list[irq].devname);
+	if (irq >= NR_IRQS) {
+		return;
+	}
+	if (!irq_list[irq] || irq_list[irq]->dev_id != dev_id)
+		printk("Removing probably wrong IRQ %d from %s\n",
+		       irq, irq_list[irq]->devname);
 	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ5)
 		*(volatile unsigned char *)IER &= ~(1 << (irq - EXT_IRQ0));
-	irq_list[irq].handler = NULL;
-	irq_list[irq].flags   = 0;
-	irq_list[irq].dev_id  = NULL;
-	irq_list[irq].devname = NULL;
+	kfree(irq_list[irq]);
+	irq_list[irq] = NULL;
 }
 
 /*
@@ -123,115 +194,36 @@
 	return 0;
 }
 
-struct int_regs {
-	unsigned long ier;
-	unsigned long isr;
-	unsigned char mask;
-};
-
-#define REGS_DEF(ier,isr,mask) {ier,isr,mask}
-
-const struct int_regs interrupt_registers[]= {
-	REGS_DEF(IER,ISR,0x01),
-	REGS_DEF(IER,ISR,0x02),
-	REGS_DEF(IER,ISR,0x04),
-	REGS_DEF(IER,ISR,0x08),
-	REGS_DEF(IER,ISR,0x10),
-	REGS_DEF(IER,ISR,0x20),
-	REGS_DEF(IER,ISR,0x40),
-	REGS_DEF(IER,ISR,0x80),
-	REGS_DEF(TCSR,TCSR,0x20),
-	REGS_DEF(RTMCSR,RTMCSR,0x40),
-	REGS_DEF(0,0,0),
-	REGS_DEF(ADCSR,ADCSR,0x40),
-	REGS_DEF(TISRA,TISRA,0x10),
-	REGS_DEF(TISRB,TISRB,0x10),
-	REGS_DEF(TISRC,TISRC,0x10),
-	REGS_DEF(0,0,0),
-	REGS_DEF(TISRA,TISRA,0x20),
-	REGS_DEF(TISRB,TISRB,0x20),
-	REGS_DEF(TISRC,TISRC,0x20),
-	REGS_DEF(0,0,0),
-	REGS_DEF(TISRA,TISRA,0x40),
-	REGS_DEF(TISRB,TISRB,0x40),
-	REGS_DEF(TISRC,TISRC,0x40),
-	REGS_DEF(0,0,0),
-	REGS_DEF(_8TCR0,_8TCSR0,0x40),
-	REGS_DEF(_8TCR0,_8TCSR0,0x80),
-	REGS_DEF(_8TCR1,_8TCSR1,0xC0),
-	REGS_DEF(_8TCR0,_8TCSR0,0x20),
-	REGS_DEF(_8TCR2,_8TCSR2,0x40),
-	REGS_DEF(_8TCR2,_8TCSR2,0x80),
-	REGS_DEF(_8TCR3,_8TCSR3,0xC0),
-	REGS_DEF(_8TCR2,_8TCSR2,0x20),
-	REGS_DEF(DTCR0A,DTCR0A,0x0),
-	REGS_DEF(DTCR0B,DTCR0B,0x0),
-	REGS_DEF(DTCR1A,DTCR1A,0x0),
-	REGS_DEF(DTCR1B,DTCR1B,0x0),
-	REGS_DEF(0,0,0),
-	REGS_DEF(0,0,0),
-	REGS_DEF(0,0,0),
-	REGS_DEF(0,0,0),
-	REGS_DEF(SCR0,SSR0,0x40),
-	REGS_DEF(SCR0,SSR0,0x40),
-	REGS_DEF(SCR0,SSR0,0x80),
-	REGS_DEF(SCR0,SSR0,0x04),
-	REGS_DEF(SCR1,SSR1,0x40),
-	REGS_DEF(SCR1,SSR1,0x40),
-	REGS_DEF(SCR1,SSR1,0x80),
-	REGS_DEF(SCR1,SSR1,0x04),
-	REGS_DEF(SCR2,SSR2,0x40),
-	REGS_DEF(SCR2,SSR2,0x40),
-	REGS_DEF(SCR2,SSR2,0x80),
-	REGS_DEF(SCR2,SSR2,0x04)
-};
-
 void enable_irq(unsigned int irq)
 {
-	unsigned char ier;
-	const struct int_regs *regs=&interrupt_registers[irq - 12];
-	if (irq == WDT_IRQ) {
-		ier = ctrl_inb(TCSR);
-		ier |= 0x20;
-		ctrl_outb((0xa500 | ier),TCSR);
-	} else {
-		if ((irq > 12) && regs->ier) {
-			ier = ctrl_inb(regs->ier);
-			ier |= regs->mask;
-			ctrl_outb(ier, regs->ier);
-		} else
-			panic("Unknown interrupt vector");
+	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ5) {
+		*(volatile unsigned char *)IER |= (1 << (irq - EXT_IRQ0));
+		*(volatile unsigned char *)ISR &= ~(1 << (irq - EXT_IRQ0));
 	}
 }
 
 void disable_irq(unsigned int irq)
 {
-	unsigned char ier;
-	const struct int_regs *regs=&interrupt_registers[irq - 12];
-	if (irq == WDT_IRQ) {
-		ier = ctrl_inb(TCSR);
-		ier &= ~0x20;
-		ctrl_outb((0xa500 | ier),TCSR);
-	} else {
-		if ((irq > 12) && regs->ier) {
-			ier = ctrl_inb(regs->ier);
-			ier &= ~(regs->mask);
-			ctrl_outb(ier, regs->ier);
-		} else
-			panic("Unknown interrupt vector");
+	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ5) {
+		*(volatile unsigned char *)IER &= ~(1 << (irq - EXT_IRQ0));
 	}
 }
 
-asmlinkage void process_int(unsigned long vec, struct pt_regs *fp)
+asmlinkage void process_int(int vec, struct pt_regs *fp)
 {
 	irq_enter();
-	if (irq_list[vec].handler) {
-		irq_list[vec].handler(vec, irq_list[vec].dev_id, fp);
-		int_irq_count[vec]++;
-	} else
-		panic("No interrupt handler for %ld\n", vec);
 	if (vec >= EXT_IRQ0 && vec <= EXT_IRQ5)
 		*(volatile unsigned char *)ISR &= ~(1 << (vec - EXT_IRQ0));
+	if (vec < NR_IRQS) {
+		if (irq_list[vec]) {
+			irq_list[vec]->handler(vec, irq_list[vec]->dev_id, fp);
+			irq_list[vec]->count++;
+			if (irq_list[vec]->flags & SA_SAMPLE_RANDOM)
+				add_interrupt_randomness(vec);
+		}
+	} else {
+		BUG();
+	}
 	irq_exit();
 }
 
@@ -240,8 +232,10 @@
 	int i;
 
 	for (i = 0; i < NR_IRQS; i++) {
-		seq_printf(p, "%3d: %10u ",i,int_irq_count[i]);
-		seq_printf(p, "%s\n", irq_list[i].devname);
+		if (irq_list[i]) {
+			seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
+			seq_printf(p, "%s\n", irq_list[i]->devname);
+		}
 	}
 
 	return 0;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-07-28 14:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-07-28 14:18 [PATCH] linux-2.6.0-test2 h8300 archtecure support update (2/6) Yoshinori Sato

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).