From: Yoshinori Sato <ysato@users.sourceforge.jp>
To: Linus Torvalds <torvalds@osdl.org>
Cc: linux kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH] linux-2.6.0-test2 h8300 archtecure support update (2/6)
Date: Mon, 28 Jul 2003 23:18:34 +0900 [thread overview]
Message-ID: <m2r84aag5h.wl%ysato@users.sourceforge.jp> (raw)
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;
reply other threads:[~2003-07-28 14:08 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2r84aag5h.wl%ysato@users.sourceforge.jp \
--to=ysato@users.sourceforge.jp \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.