📄 patch-2.4.19-rmk-arm-rthal5
字号:
diff -urNp --exclude=CVS linux-2.4.19-rmk7-tux1/Makefile linux-2.4.19-rmk7-tux1-rthal/Makefile--- linux-2.4.19-rmk7-tux1/Makefile Wed Jul 9 20:15:29 2003+++ linux-2.4.19-rmk7-tux1-rthal/Makefile Wed Dec 17 12:55:36 2003@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 19-EXTRAVERSION = -rmk7+EXTRAVERSION = -rmk7-rthal5 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) diff -urNp --exclude=CVS linux-2.4.19-rmk7-tux1/arch/arm/config.in linux-2.4.19-rmk7-tux1-rthal/arch/arm/config.in--- linux-2.4.19-rmk7-tux1/arch/arm/config.in Wed Jul 9 20:15:29 2003+++ linux-2.4.19-rmk7-tux1-rthal/arch/arm/config.in Wed Dec 17 12:55:36 2003@@ -467,6 +467,7 @@ if [ "$CONFIG_ARCH_SA1100" = "y" -o \ fi source drivers/pci/Config.in+bool 'RTAI Realtime Hardware abstraction Layer' CONFIG_RTHAL bool 'Support for hot-pluggable devices' CONFIG_HOTPLUG if [ "$CONFIG_HOTPLUG" = "y" ]; then source drivers/pcmcia/Config.indiff -urNp --exclude=CVS linux-2.4.19-rmk7-tux1/arch/arm/defconfig linux-2.4.19-rmk7-tux1-rthal/arch/arm/defconfig--- linux-2.4.19-rmk7-tux1/arch/arm/defconfig Mon Nov 26 00:12:57 2001+++ linux-2.4.19-rmk7-tux1-rthal/arch/arm/defconfig Wed Dec 17 12:55:36 2003@@ -74,6 +74,7 @@ CONFIG_PCI=y # CONFIG_ISA is not set # CONFIG_ISA_DMA is not set CONFIG_PCI_NAMES=y+# CONFIG_RTHAL is not set # CONFIG_HOTPLUG is not set # CONFIG_PCMCIA is not set CONFIG_NET=ydiff -urNp --exclude=CVS linux-2.4.19-rmk7-tux1/arch/arm/kernel/armksyms.c linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/armksyms.c--- linux-2.4.19-rmk7-tux1/arch/arm/kernel/armksyms.c Thu Jun 19 10:54:30 2003+++ linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/armksyms.c Wed Dec 17 12:55:36 2003@@ -20,6 +20,10 @@ #include <linux/interrupt.h> #include <linux/pm.h> #include <linux/vt_kern.h>+#ifdef CONFIG_RTHAL+#include <linux/console.h>+#include <linux/sched.h>+#endif #include <asm/byteorder.h> #include <asm/elf.h>@@ -105,6 +109,10 @@ EXPORT_SYMBOL(kd_mksound); EXPORT_SYMBOL_NOVERS(__do_softirq); +#ifdef CONFIG_RTHAL+EXPORT_SYMBOL(console_drivers);+#endif+ /* platform dependent support */ EXPORT_SYMBOL(dump_thread); EXPORT_SYMBOL(dump_fpu);@@ -252,10 +260,13 @@ EXPORT_SYMBOL(elf_platform); EXPORT_SYMBOL(elf_hwcap); /* syscalls */+#ifndef CONFIG_RTHAL+/* exported elsewhere when CONFIG_RTHAL is on */ EXPORT_SYMBOL(sys_write); EXPORT_SYMBOL(sys_read);-EXPORT_SYMBOL(sys_lseek); EXPORT_SYMBOL(sys_open);+#endif+EXPORT_SYMBOL(sys_lseek); EXPORT_SYMBOL(sys_exit); EXPORT_SYMBOL(sys_wait4); @@ -266,3 +277,11 @@ EXPORT_SYMBOL_NOVERS(__down_trylock_fail EXPORT_SYMBOL_NOVERS(__up_wakeup); EXPORT_SYMBOL(get_wchan);++ /* RTAI */+#ifdef CONFIG_RTHAL+extern struct irqdesc irq_desc[NR_IRQS];+EXPORT_SYMBOL(rthal);+EXPORT_SYMBOL(irq_desc); +EXPORT_SYMBOL(do_timer);+#endifdiff -urNp --exclude=CVS linux-2.4.19-rmk7-tux1/arch/arm/kernel/entry-armv.S linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/entry-armv.S--- linux-2.4.19-rmk7-tux1/arch/arm/kernel/entry-armv.S Thu Jun 19 10:54:30 2003+++ linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/entry-armv.S Thu Dec 25 23:59:08 2003@@ -380,6 +380,11 @@ ENTRY(soft_irq_mask) ands \irqstat, \irqstat, \irqnr mov \irqnr, #0 beq 1001f+#ifdef CONFIG_RTHAL+ tst \irqstat, #0x04000000 @ check OSMR0 first+ movne \irqnr, #26+ bne 1001f+#endif tst \irqstat, #0xff moveq \irqstat, \irqstat, lsr #8 addeq \irqnr, \irqnr, #8@@ -690,9 +695,8 @@ __dabt_svc: sub sp, sp, #S_FRAME_SIZE msr cpsr_c, r9 mov r2, sp bl SYMBOL_NAME(do_DataAbort)- mov r0, #I_BIT | MODE_SVC- msr cpsr_c, r0- ldr r0, [sp, #S_PSR]+ disable_irq r0 @ Yes, this disables interrupts - for+ ldr r0, [sp, #S_PSR] @ the next 2 instructions. Safe. msr spsr, r0 ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr @@ -711,7 +715,12 @@ __irq_svc: sub sp, sp, #S_FRAME_SIZE @ routine called with r0 = irq number, r1 = struct pt_regs * @ adrsvc ne, lr, 1b+#ifndef CONFIG_RTHAL bne asm_do_IRQ+#else+ ldrne r7, .rthal @ load pointer rthal+ ldrne pc, [r7, #0] @ branch to rthal.do_IRQ (1st in RTHAL)+#endif ldr r0, [sp, #S_PSR] @ irqs are already disabled msr spsr, r0 ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr@@ -728,6 +737,19 @@ __und_svc: sub sp, sp, #S_FRAME_SIZE add r4, sp, #S_SP stmia r4, {r5 - r9} @ save sp_SVC, lr_SVC, pc, cpsr, old_ro +#ifdef CONFIG_RTHAL+ ldr r7, .rthal @ load pointer rthal+ ldr r7, [r7, #8] @ load pointer rthal.do_TRAP (3rd in RTHAL)+ cmp r7, #0+ beq 2f+ mov r0, #4 @ SIGILL+ mov r1, sp @ struct pt_regs *regs+ mov lr, pc+ mov pc, r7 @ check, if this is a relevant code+ cmp r0, #0 @ check return value+ beq 1f @ else let linux do what it has to do+2: +#endif adrsvc al, r9, 1f @ r9 = normal FP return bl call_fpe @ lr = undefined instr return @@ -735,8 +757,7 @@ __und_svc: sub sp, sp, #S_FRAME_SIZE mov r1, sp @ struct pt_regs *regs bl SYMBOL_NAME(do_undefinstr) -1: mov r0, #I_BIT | MODE_SVC- msr cpsr_c, r0+1: disable_irq r0 ldr lr, [sp, #S_PSR] @ Get SVC cpsr msr spsr, lr ldmia sp, {r0 - pc}^ @ Restore SVC registers@@ -757,8 +778,7 @@ __pabt_svc: sub sp, sp, #S_FRAME_SIZE mov r0, r2 @ address (pc) mov r1, sp @ regs bl SYMBOL_NAME(do_PrefetchAbort) @ call abort handler- mov r0, #I_BIT | MODE_SVC- msr cpsr_c, r0+ disable_irq r0 ldr r0, [sp, #S_PSR] msr spsr, r0 ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr@@ -770,6 +790,9 @@ __pabt_svc: sub sp, sp, #S_FRAME_SIZE #ifdef MULTI_CPU .LCprocfns: .word SYMBOL_NAME(processor) #endif+#ifdef CONFIG_RTHAL+.rthal: .word SYMBOL_NAME(rthal)+#endif .LCfp: .word SYMBOL_NAME(fp_enter) irq_prio_table@@ -795,8 +818,7 @@ __dabt_usr: sub sp, sp, #S_FRAME_SIZE @ #else bl cpu_data_abort #endif- mov r2, #MODE_SVC- msr cpsr_c, r2 @ Enable interrupts+ enable_irq r2 @ Enable interrupts mov r2, sp adrsvc al, lr, ret_from_exception b SYMBOL_NAME(do_DataAbort)@@ -817,7 +839,13 @@ __irq_usr: sub sp, sp, #S_FRAME_SIZE @ @ routine called with r0 = irq number, r1 = struct pt_regs * @+#ifndef CONFIG_RTHAL bne asm_do_IRQ+#else+ ldrne r7, .rthal @ load pointer rthal+ ldrne pc, [r7, #0] @ branch to rthal.do_IRQ (1st in RTHAL)+ disable_irq r7 @ we do not disable IRQs in dispatch_irq - do it here+#endif mov why, #0 get_current_task tsk b ret_to_user@@ -846,8 +874,7 @@ call_fpe: get_current_task r10 add r10, r10, #TSS_FPESAVE @ r10 = workspace ldr pc, [r4] @ Call FP module USR entry point -fpundefinstr: mov r0, #MODE_SVC- msr cpsr_c, r0 @ Enable interrupts+fpundefinstr: enable_irq r0 @ Enable interrupts mov r0, lr mov r1, sp adrsvc al, lr, ret_from_exception@@ -863,8 +890,7 @@ __pabt_usr: sub sp, sp, #S_FRAME_SIZE @ stmdb r8, {sp, lr}^ @ Save sp_usr lr_usr alignment_trap r4, r7, __temp_abt zero_fp- mov r0, #MODE_SVC- msr cpsr_c, r0 @ Enable interrupts+ enable_irq r0 @ Enable interrupts mov r0, r5 @ address (pc) mov r1, sp @ regs bl SYMBOL_NAME(do_PrefetchAbort) @ call abort handlerdiff -urNp --exclude=CVS linux-2.4.19-rmk7-tux1/arch/arm/kernel/entry-common.S linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/entry-common.S--- linux-2.4.19-rmk7-tux1/arch/arm/kernel/entry-common.S Thu Jun 19 10:54:30 2003+++ linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/entry-common.S Wed Dec 17 12:55:36 2003@@ -53,7 +53,11 @@ slow: str r0, [sp, #S_R0+S_OFF]! @ retur * "slow" syscall return path. "why" tells us if this was a real syscall. */ reschedule:+#ifndef CONFIG_RTHAL bl SYMBOL_NAME(schedule)+#else+ bl SYMBOL_NAME(rt_wrap_schedule)+#endif ret_disable_irq: disable_irq r1 @ ensure IRQs are disabled ENTRY(ret_to_user)@@ -72,7 +76,11 @@ __do_signal: mov r0, #0 @ NULL 'oldset' mov r1, sp @ 'regs' mov r2, why @ 'syscall'+#ifndef CONFIG_RTHAL bl SYMBOL_NAME(do_signal) @ note the bl above sets lr+#else+ bl SYMBOL_NAME(rt_wrap_do_signal) @ note the bl above sets lr+#endif disable_irq r1 @ ensure IRQs are disabled b restore @@ -90,7 +98,11 @@ ENTRY(ret_from_fork) beq ret_disable_irq mov r1, sp mov r0, #1 @ trace exit [IP = 1]+#ifndef CONFIG_RTHAL bl SYMBOL_NAME(syscall_trace)+#else+ bl SYMBOL_NAME(rt_wrap_syscall_trace)+#endif b ret_disable_irq @@ -145,6 +157,11 @@ ENTRY(vector_swi) get_current_task tsk ldr ip, [tsk, #TSK_PTRACE] @ check for syscall tracing bic scno, scno, #0xff000000 @ mask off SWI op-code+#ifdef CONFIG_RTHAL+ ldr tbl, .rtai_magic @ check for RTAI SRQ+ cmp scno, tbl @ (use tbl for scratch)+ beq 4f+#endif eor scno, scno, #OS_NUMBER << 20 @ check OS number adr tbl, sys_call_table @ load syscall table pointer tst ip, #PT_TRACESYS @ are we tracing syscalls?@@ -160,6 +177,20 @@ ENTRY(vector_swi) eor r0, scno, #OS_NUMBER << 20 @ put OS number back bcs SYMBOL_NAME(arm_syscall) b SYMBOL_NAME(sys_ni_syscall) @ not private func++#ifdef CONFIG_RTHAL+4: ldr r7, .rthal @ load pointer to rthal+ ldr r7, [r7, #4] @ load pointer to do_SRQ, [rthal+4]+ cmp r7, #0+ movne lr, pc @ call ...+ movne pc, r7 @ ... if available+ str r0, [sp, #S_R0 + S_OFF] @ save returned r0+ str r1, [sp, #S_R1 + S_OFF] @ save returned r1+ add sp, sp, #S_OFF @ hmm, leave anyway+ b restore+.rtai_magic: .word 0x404404 @ RTAI SRQ MAGIC+.rthal: .word SYMBOL_NAME(rthal) @ RTHAL+#endif /* * This is the really slow path. We're going to be doingdiff -urNp --exclude=CVS linux-2.4.19-rmk7-tux1/arch/arm/kernel/irq.c linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/irq.c--- linux-2.4.19-rmk7-tux1/arch/arm/kernel/irq.c Fri Dec 26 00:08:54 2003+++ linux-2.4.19-rmk7-tux1-rthal/arch/arm/kernel/irq.c Fri Dec 26 00:45:57 2003@@ -674,3 +674,181 @@ void __init init_IRQ(void) init_arch_irq(); init_dma(); }++#ifdef CONFIG_RTHAL+/*+ * RTAI+ * This is the most appropriate place to setup rthal.+ */+static void linux_cli(void)+{+ hard_local_irq_disable();+}++static void linux_sti(void)+{+ hard_local_irq_enable();+}++static unsigned int linux_save_flags(void)+{+ int flags;+ hard_local_save_flags(flags);+ return flags;+}++static unsigned int linux_save_flags_cli(void)+{+ int flags;+ hard_local_irq_save(flags);+ return flags;+}++static void linux_restore_flags(unsigned int flags)+{+ hard_local_irq_restore(flags);+}++static void linux_fcli(void)+{+ hard_clf();+}++static void linux_fsti(void)+{+ hard_stf();+}++volatile struct rt_hal rthal = {+ .do_IRQ = asm_do_IRQ, /* irq-dispatcher */+ .do_SRQ = NULL, /* srq-dispatcher */+ .do_TRAP = NULL, /* trap-handler */+ .disint = linux_cli,+ .enint = linux_sti,+ .getflags = linux_save_flags,+ .setflags = linux_restore_flags,+ .getflags_and_cli = linux_save_flags_cli,+ .fdisint = linux_fcli,+ .fenint = linux_fsti,+ .copy_back = NULL, /* copy linux-flags back, don't deliver pending interrupts */+ .c_do_IRQ = do_IRQ,+};++/* Wrappers for entry-common.S+ * Assumption: the only exceptions, allowed in rt-context,+ * are interrupts and traps (e.g. floating point emulation),+ * which are processed accordingly. All the rest can happen+ * only in Linux. Which means, that interrupts before the+ * exception were hard-enabled, the state of soft I-bit is+ * unknown.+ * Concept - all these wrappers are called on the path:+ * - exception+ * (possibly, enable interrupts)+ * - call a Linux C-function, which might schedule, sleep,+ * change interrupt-status+ * - return to asm+ * (possibly, change interupt status)+ * - switch back to where exception occured+ * So, the wrappers do:+ * - modify Linux I-bit according to the current hard I-bit+ * - hard enable interrupts+ * - call the wrapped function+ * - save the current Linux I-bit to the hard I-bit+ * - restore Linux I-bit state from before-wrapping+ * (emulate return from exception)+ */+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -