All of lore.kernel.org
 help / color / mirror / Atom feed
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] H8/300 update (4/9) preempt support
Date: Wed, 12 May 2004 01:36:57 +0900	[thread overview]
Message-ID: <m2wu3irkd2.wl%ysato@users.sourceforge.jp> (raw)

- add preempt support
- add new syscalls
- code cleanup

-- 
Yoshinori Sato
<ysato@users.sourceforge.jp>

diff -Nru linux-2.6.6/arch/h8300/kernel/syscalls.S linux-2.6.6-h8300/arch/h8300/kernel/syscalls.S
--- linux-2.6.6/arch/h8300/kernel/syscalls.S	2004-05-11 14:30:25.000000000 +0900
+++ linux-2.6.6-h8300/arch/h8300/kernel/syscalls.S	2004-04-13 01:40:32.000000000 +0900
@@ -265,8 +265,8 @@
 	.long SYMBOL_NAME(sys_io_getevents)
 	.long SYMBOL_NAME(sys_io_submit)
 	.long SYMBOL_NAME(sys_io_cancel)
-	.long SYMBOL_NAME(sys_ni_syscall)	/* 250 */ /* sys_alloc_hugepages */
-	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_freec_hugepages */
+	.long SYMBOL_NAME(sys_fadvise64)	/* 250 */
+	.long SYMBOL_NAME(sys_ni_syscall)
 	.long SYMBOL_NAME(sys_exit_group)
 	.long SYMBOL_NAME(sys_lookup_dcookie)
 	.long SYMBOL_NAME(sys_epoll_create)
@@ -287,36 +287,39 @@
 	.long SYMBOL_NAME(sys_fstatfs64)	
 	.long SYMBOL_NAME(sys_tgkill)		/* 270 */
 	.long SYMBOL_NAME(sys_utimes)
+ 	.long SYMBOL_NAME(sys_fadvise64_64)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_vserver */
 
 	.rept NR_syscalls-(.-SYMBOL_NAME(sys_call_table))/4
 		.long SYMBOL_NAME(sys_ni_syscall)
 	.endr
 
+	.macro	call_sp addr
+	mov.l	#SYMBOL_NAME(\addr),er6
+	bra	SYMBOL_NAME(syscall_trampoline):8
+	.endm	
+	
 SYMBOL_NAME_LABEL(sys_clone)	
-	mov.l	#SYMBOL_NAME(h8300_clone),er0
-	jmp	@SYMBOL_NAME(syscall_trampoline)
+	call_sp	h8300_clone
 	
 SYMBOL_NAME_LABEL(sys_sigsuspend)
-	mov.l	#SYMBOL_NAME(do_sigsuspend),er0
-	jmp	@SYMBOL_NAME(syscall_trampoline)
+	call_sp	do_sigsuspend
 
 SYMBOL_NAME_LABEL(sys_rt_sigsuspend)
-	mov.l	#SYMBOL_NAME(do_rt_sigsuspend),er0
-	jmp	@SYMBOL_NAME(syscall_trampoline)
+	call_sp	do_rt_sigsuspend
 
 SYMBOL_NAME_LABEL(sys_sigreturn)
-	mov.l	#SYMBOL_NAME(do_sigreturn),er0
-	jmp	@SYMBOL_NAME(syscall_trampoline)
+	call_sp	do_sigreturn
 
 SYMBOL_NAME_LABEL(sys_rt_sigreturn)
-	mov.l	#SYMBOL_NAME(do_rt_sigreturn),er0
-	jmp	@SYMBOL_NAME(syscall_trampoline)
+	call_sp	do_rt_sigreturn
 
 SYMBOL_NAME_LABEL(sys_fork)
-	mov.l	#SYMBOL_NAME(h8300_fork),er0
-	jmp	@SYMBOL_NAME(syscall_trampoline)
+	call_sp	h8300_fork
 
 SYMBOL_NAME_LABEL(sys_vfork)
-	mov.l	#SYMBOL_NAME(h8300_vfork),er0
-	jmp	@SYMBOL_NAME(syscall_trampoline)
+	call_sp	h8300_vfork
 
+SYMBOL_NAME_LABEL(syscall_trampoline)
+	mov.l	sp,er0
+	jmp	@er6
diff -Nru linux-2.6.6/arch/h8300/platform/h8300h/entry.S linux-2.6.6-h8300/arch/h8300/platform/h8300h/entry.S
--- linux-2.6.6/arch/h8300/platform/h8300h/entry.S	2004-05-11 14:30:44.000000000 +0900
+++ linux-2.6.6-h8300/arch/h8300/platform/h8300h/entry.S	2004-05-11 21:04:14.000000000 +0900
@@ -109,12 +109,10 @@
 .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)
 .globl SYMBOL_NAME(interrupt_redirect_table)
 .globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
 .globl SYMBOL_NAME(resume)
-.globl SYMBOL_NAME(syscall_trampoline)
 .globl SYMBOL_NAME(interrupt_redirect_table)
 .globl SYMBOL_NAME(interrupt_entry)
 .globl SYMBOL_NAME(system_call)
@@ -173,7 +171,7 @@
 	beq	1f
 	jsr	@SYMBOL_NAME(do_softirq)
 1:
-	jmp	@SYMBOL_NAME(ret_from_exception)
+	jmp	@SYMBOL_NAME(ret_from_interrupt)
 	
 SYMBOL_NAME_LABEL(system_call)
 	subs	#4,sp				/* dummy LVEC */
@@ -205,11 +203,11 @@
 	mov.l	@(LER2:16,sp),er1
 	mov.l	@(LER3:16,sp),er2
 	jsr	@er4
-	mov.l	er0,@(LER0,sp)			/* save the return value */
+	mov.l	er0,@(LER0:16,sp)		/* save the return value */
 #if defined(CONFIG_SYSCALL_PRINT)
 	jsr	@SYMBOL_NAME(syscall_print)
 #endif
-	jmp	@SYMBOL_NAME(ret_from_exception)
+	bra	SYMBOL_NAME(ret_from_exception):8
 1:
 	jsr	SYMBOL_NAME(syscall_trace)
 	mov.l	@(LER1:16,sp),er0
@@ -218,44 +216,66 @@
 	jsr	@er4
 	mov.l	er0,@(LER0:16,sp)		/* save the return value */
 	jsr	@SYMBOL_NAME(syscall_trace)
+	bra	SYMBOL_NAME(ret_from_exception):8
+
+SYMBOL_NAME_LABEL(ret_from_fork)
+	mov.l	er2,er0
+	jsr	@SYMBOL_NAME(schedule_tail)
+	bra	SYMBOL_NAME(ret_from_exception):8
 
-SYMBOL_NAME_LABEL(ret_from_signal)
+SYMBOL_NAME_LABEL(reschedule)
+	/* save top of frame */
+	mov.l	sp,er0
+	jsr	@SYMBOL_NAME(set_esp0)
+	jsr	@SYMBOL_NAME(schedule)
 
 SYMBOL_NAME_LABEL(ret_from_exception)
+#if defined(CONFIG_PREEMPT)
+	orc	#0x80,ccr
+#endif
+SYMBOL_NAME_LABEL(ret_from_interrupt)
 	mov.b	@(LCCR+1:16,sp),r0l
 	btst	#4,r0l			/* check if returning to kernel */
-	bne	3f			/* if so, skip resched, signals */
+	bne	done:8			/* if so, skip resched, signals */
 	andc	#0x7f,ccr
-	mov.l	sp,er2
-	and.w	#0xe000,r2
-	mov.l	@(TI_FLAGS:16,er2),er1
+	mov.l	sp,er4
+	and.w	#0xe000,r4
+	mov.l	@(TI_FLAGS:16,er4),er1
 	and.l	#_TIF_WORK_MASK,er1
-	beq	3f
+	beq	done:8
 1:
-	mov.l	@(TI_FLAGS:16,er2),er1
+	mov.l	@(TI_FLAGS:16,er4),er1
 	btst	#TIF_NEED_RESCHED,r1l
 	bne	SYMBOL_NAME(reschedule):16
 	mov.l	sp,er1
 	subs	#4,er1			/* adjust retpc */
 	mov.l	er2,er0
 	jsr	@SYMBOL_NAME(do_signal)
-3:	 
+#if defined(CONFIG_PREEMPT)
+	bra	done:8			/* userspace thoru */
+3:
+	btst	#4,r0l
+	beq	done:8			/* userspace thoru */
+4:			 
+	mov.l	@(TI_PRE_COUNT:16,er4),er1
+	bne	done:8
+	mov.l	@(TI_FLAGS:16,er4),er1
+	btst	#TIF_NEED_RESCHED,r1l
+	beq	done:8
+	mov.b	r0l,r0l
+	bpl	done:8			/* interrupt off (exception path?) */
+	mov.l	#PREEMPT_ACTIVE,er1
+	mov.l	er1,@(TI_PRE_COUNT:16,er4)
+	andc	#0x7f,ccr
+	jsr	@SYMBOL_NAME(schedule)
+	sub.l	er1,er1
+	mov.l	er1,@(TI_PRE_COUNT:16,er4)
+	orc	#0x80,ccr
+	bra	4b:8
+#endif
+done:	
 	RESTORE_ALL			/* Does RTE */
 
-SYMBOL_NAME_LABEL(reschedule)
-	/* save top of frame */
-	mov.l	sp,er0
-	jsr	@SYMBOL_NAME(set_esp0)
-
-	mov.l	#SYMBOL_NAME(ret_from_exception),er0
-	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(ret_from_exception)	
-
 SYMBOL_NAME_LABEL(resume)
 	/*
 	 * Beware - when entering resume, offset of tss is in d1,
@@ -306,11 +326,6 @@
 	jsr	@SYMBOL_NAME(trace_trap)
 	jmp	@SYMBOL_NAME(ret_from_exception)	
 
-SYMBOL_NAME_LABEL(syscall_trampoline)
-	mov.l	er0,er6
-	mov.l	sp,er0
-	jmp	@er6
-
 	.section	.bss
 SYMBOL_NAME_LABEL(sw_ksp)
 	.space	4	
diff -Nru linux-2.6.6/arch/h8300/platform/h8s/entry.S linux-2.6.6-h8300/arch/h8300/platform/h8s/entry.S
--- linux-2.6.6/arch/h8300/platform/h8s/entry.S	2004-05-11 14:30:44.000000000 +0900
+++ linux-2.6.6-h8300/arch/h8300/platform/h8s/entry.S	2004-05-11 21:04:14.000000000 +0900
@@ -109,12 +109,10 @@
 .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)
 .globl SYMBOL_NAME(interrupt_redirect_table)
 .globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
 .globl SYMBOL_NAME(resume)
-.globl SYMBOL_NAME(syscall_trampoline)
 .globl SYMBOL_NAME(trace_break)
 .globl SYMBOL_NAME(interrupt_entry)
 		
@@ -201,11 +199,11 @@
 	mov.l	@(LER2:16,sp),er1
 	mov.l	@(LER3:16,sp),er2
 	jsr	@er4
-	mov.l	er0,@(LER0,sp)			/* save the return value */
+	mov.l	er0,@(LER0:16,sp)			/* save the return value */
 #if defined(CONFIG_SYSCALL_PRINT)
 	jsr	@SYMBOL_NAME(syscall_print)
 #endif
-	jmp	@SYMBOL_NAME(ret_from_exception)
+	bra	SYMBOL_NAME(ret_from_exception):8
 1:
 	jsr	SYMBOL_NAME(syscall_trace)
 	mov.l	@(LER1:16,sp),er0
@@ -214,45 +212,67 @@
 	jsr	@er4
 	mov.l	er0,@(LER0:16,sp)		/* save the return value */
 	jsr	@SYMBOL_NAME(syscall_trace)
+	bra	SYMBOL_NAME(ret_from_exception):8
+	
 
-SYMBOL_NAME_LABEL(ret_from_signal)
+SYMBOL_NAME_LABEL(ret_from_fork)
+	mov.l	er2,er0
+	jsr	@SYMBOL_NAME(schedule_tail)
+	bra	SYMBOL_NAME(ret_from_exception):8
+
+SYMBOL_NAME_LABEL(reschedule)
+	/* save top of frame */
+	mov.l	sp,er0
+	jsr	@SYMBOL_NAME(set_esp0)
+	jsr	@SYMBOL_NAME(schedule)
 
 SYMBOL_NAME_LABEL(ret_from_exception)
+#if defined(CONFIG_PREEMPT)
+	orc	#0x80,ccr
+#endif
+SYMBOL_NAME_LABEL(ret_from_interrupt)
 	mov.b	@(LCCR+1:16,sp),r0l
 	btst	#4,r0l			/* check if returning to kernel */
-	bne	3f			/* if so, skip resched, signals */
+	bne	done:8			/* if so, skip resched, signals */
 	andc	#0x7f,ccr
-	mov.l	sp,er2
-	and.w	#0xe000,r2
-	mov.l	@(TI_FLAGS:16,er2),er1
+	mov.l	sp,er4
+	and.w	#0xe000,r4
+	mov.l	@(TI_FLAGS:16,er4),er1
 	and.l	#_TIF_WORK_MASK,er1
-	beq	3f
+	beq	done:8
 1:
-	mov.l	@(TI_FLAGS:16,er2),er1
+	mov.l	@(TI_FLAGS:16,er4),er1
 	btst	#TIF_NEED_RESCHED,r1l
 	bne	SYMBOL_NAME(reschedule):16
 	mov.l	sp,er1
 	subs	#4,er1			/* adjust retpc */
 	mov.l	er2,er0
 	jsr	@SYMBOL_NAME(do_signal)
-3:	 
+#if defined(CONFIG_PREEMPT)
+	bra	done:8			/* userspace thoru */
+3:
+	btst	#4,r0l
+	beq	done:8			/* userspace thoru */
+4:			 
+	mov.l	@(TI_PRE_COUNT:16,er4),er1
+	bne	done:8
+	mov.l	@(TI_FLAGS:16,er4),er1
+	btst	#TIF_NEED_RESCHED,r1l
+	beq	done:8
+	mov.b	r0l,r0l
+	bpl	done:8			/* interrupt off (exception path?) */
+	mov.l	#PREEMPT_ACTIVE,er1
+	mov.l	er1,@(TI_PRE_COUNT:16,er4)
+	andc	#0x7f,ccr
+	jsr	@SYMBOL_NAME(schedule)
+	sub.l	er1,er1
+	mov.l	er1,@(TI_PRE_COUNT:16,er4)
+	orc	#0x80,ccr
+	bra	4b:8
+#endif
+done:	
 	RESTORE_ALL			/* Does RTE */
 
-SYMBOL_NAME_LABEL(reschedule)
-	/* save top of frame */
-	mov.l	sp,er0
-	jsr	@SYMBOL_NAME(set_esp0)
-
-	mov.l	#SYMBOL_NAME(ret_from_exception),er0
-	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(ret_from_exception)	
-
-
 SYMBOL_NAME_LABEL(resume)
 	/*
 	 *	er0 = prev
@@ -284,7 +304,7 @@
 
 	ldc	r3l,ccr
 	ldc	r3h,exr
-	
+		
 	rts
 
 SYMBOL_NAME_LABEL(trace_break)
@@ -304,11 +324,6 @@
 	jsr	@SYMBOL_NAME(trace_trap)
 	jmp	@SYMBOL_NAME(ret_from_exception)	
 
-SYMBOL_NAME_LABEL(syscall_trampoline)
-	mov.l	er0,er6
-	mov.l	sp,er0
-	jmp	@er6
-
 	.section	.bss
 SYMBOL_NAME_LABEL(sw_ksp)
 	.space	4	
diff -Nru linux-2.6.6/include/asm-h8300/hardirq.h linux-2.6.6-h8300/include/asm-h8300/hardirq.h
--- linux-2.6.6/include/asm-h8300/hardirq.h	2004-01-09 15:59:43.000000000 +0900
+++ linux-2.6.6-h8300/include/asm-h8300/hardirq.h	2004-05-11 21:28:11.000000000 +0900
@@ -75,7 +75,7 @@
 #define irq_enter()		(preempt_count() += HARDIRQ_OFFSET)
 
 #ifdef CONFIG_PREEMPT
-# define in_atomic()	(preempt_count() != kernel_locked())
+# define in_atomic()	((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked())
 # define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
 #else
 # define in_atomic()	(preempt_count() != 0)
diff -Nru linux-2.6.6/include/asm-h8300/thread_info.h linux-2.6.6-h8300/include/asm-h8300/thread_info.h
--- linux-2.6.6/include/asm-h8300/thread_info.h	2004-01-09 15:59:26.000000000 +0900
+++ linux-2.6.6-h8300/include/asm-h8300/thread_info.h	2004-05-11 21:28:11.000000000 +0900
@@ -32,10 +32,11 @@
  */
 #define INIT_THREAD_INFO(tsk)			\
 {						\
-	task:		&tsk,			\
-	exec_domain:	&default_exec_domain,	\
-	flags:		0,			\
-	cpu:		0,			\
+	.task =		&tsk,			\
+	.exec_domain =	&default_exec_domain,	\
+	.flags =	0,			\
+	.cpu =		0,			\
+	.preempt_count = 1,			\
 	.restart_block	= {			\
 		.fn = do_no_restart_syscall,	\
 	},					\
@@ -59,7 +60,7 @@
 		"mov.l	sp, %0 \n\t"
 		"and.l	%1, %0"
 		: "=&r"(ti)
-		: "g" (~(THREAD_SIZE-1))
+		: "i" (~(THREAD_SIZE-1))
 		);
 	return ti;
 }
@@ -79,6 +80,7 @@
 #define TI_EXECDOMAIN	4
 #define TI_FLAGS	8
 #define TI_CPU		12
+#define TI_PRE_COUNT	16
 
 #define	PREEMPT_ACTIVE	0x4000000
 

                 reply	other threads:[~2004-05-11 16:57 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=m2wu3irkd2.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.