📄 uclinux-dist-20040408-lpc-chy-cmj.patch
字号:
+ BNE .+12*4*3+8++ mov \irqnr, #19+ tst r4, #0x00080000+ BNE .+11*4*3+8++ mov \irqnr, #20+ tst r4, #0x00100000+ BNE .+10*4*3+8++ mov \irqnr, #21+ tst r4, #0x00200000+ BNE .+9*4*3+8++ mov \irqnr, #22+ tst r4, #0x00400000+ BNE .+8*4*3+8++ mov \irqnr, #23+ tst r4, #0x00800000+ BNE .+7*4*3+8++ mov \irqnr, #24+ tst r4, #0x01000000+ BNE .+6*4*3+8++ mov \irqnr, #25+ tst r4, #0x02000000+ BNE .+5*4*3+8++ mov \irqnr, #26+ tst r4, #0x04000000+ BNE .+4*4*3+8++ mov \irqnr, #27+ tst r4, #0x08000000+ BNE .+3*4*3+8++ mov \irqnr, #28+ tst r4, #0x10000000+ BNE .+2*4*3+8++ mov \irqnr, #29+ tst r4, #0x20000000+ BNE .+1*4*3+8++ mov \irqnr, #30+ tst r4, #0x40000000+ BNE .+0*4*3+8++ mov \irqnr, #31+++ .endm+ .macro irq_prio_table+ .endm+ #elif defined(CONFIG_ARCH_TA7S) || defined(CONFIG_ARCH_TA7V) #include <asm/arch/arch.h> @@ -1602,6 +1748,25 @@ ldmfd sp!, {r4 - r9, pc} #else /* Normal case: lower memory is writable. */+#if defined(CONFIG_ARCH_LPC)+ .equ __real_stubs_start, 0x200 + RAM_BASE+.LCvectors:+ swi SYS_ERROR0+ ldr pc, .vector_undef+ ldr pc, .vector_swi+ ldr pc, .vector_prefetch+ ldr pc, .vector_data+ ldr pc, .vector_reserve+ ldr pc, .vector_IRQ+ ldr pc, .vector_FIQ+.vector_undef: .word (__real_stubs_start + (vector_undefinstr - __stubs_start))+.vector_swi: .word vector_swi+.vector_prefetch: .word (__real_stubs_start + (vector_prefetch - __stubs_start))+.vector_data: .word (__real_stubs_start + (vector_data - __stubs_start))+.vector_reserve: .word (__real_stubs_start + (vector_addrexcptn - __stubs_start))+.vector_IRQ: .word (__real_stubs_start + (vector_IRQ - __stubs_start))+.vector_FIQ: .word (__real_stubs_start + (vector_FIQ - __stubs_start))+#else .equ __real_stubs_start, .LCvectors + 0x200 .LCvectors:@@ -1654,6 +1819,7 @@ b __real_stubs_start + (vector_IRQ - __stubs_start) - 0x60 b __real_stubs_start + (vector_IRQ - __stubs_start) - 0x60 #endif+#endif /* CONFIG_ARCH_LPC */ ENTRY(__trap_init) stmfd sp!, {r4 - r9, lr}@@ -1687,10 +1853,21 @@ /* str r2, [r1] */ #endif /* CONFIG_CPU_S3C44B0X */ +#ifdef CONFIG_ARCH_LPC+ mov r0, #RAM_BASE+#endif+ adr r1, .LCvectors @ set up the vectors ldmia r1, {r2, r3, r4, r5, r6, r7, r8, r9} stmia r0, {r2, r3, r4, r5, r6, r7, r8, r9} +#ifdef CONFIG_ARCH_LPC+ adr r1, .vector_undef+ ldmia r1, {r2 - r9}+ mov r0, #(RAM_BASE+32)+ stmia r0, {r2 - r9}+#endif+ #ifdef CONFIG_CPU_S3C3410 /* * Enable the vector table based interrupt mode@@ -1735,6 +1912,10 @@ mov r0, r4 #endif /* CONFIG_CPU_S3C44B0X */ +#ifdef CONFIG_ARCH_LPC+ mov r0, #RAM_BASE+#endif+ add r2, r0, #0x200 adr r0, __stubs_start @ copy stubs to 0x200 adr r1, __stubs_enddiff -Naur old/uClinux-dist/linux-2.4.x/arch/armnommu/kernel/head-armv.S uClinux-dist/linux-2.4.x/arch/armnommu/kernel/head-armv.S--- old/uClinux-dist/linux-2.4.x/arch/armnommu/kernel/head-armv.S 2004-04-08 08:15:03.000000000 +0800+++ uClinux-dist/linux-2.4.x/arch/armnommu/kernel/head-armv.S 2005-01-06 09:12:11.000000000 +0800@@ -220,6 +220,33 @@ .long init_task_union+8192 #endif +#if defined(CONFIG_ARCH_LPC)+ adr r5, LC0+ ldmia r5, {r5, r6, r8, r9, sp} @ Setup stack++ /* Clear BSS */+ mov r4, #0+1: cmp r5, r8+ strcc r4, [r5], #4+ bcc 1b++ /* Pretend we know what our processor code is (for arm_id) */+ ldr r2, LPC_PROCESSOR_TYPE+ str r2, [r6]+ mov r2, #MACH_TYPE_LPC+ str r2, [r9]++ mov fp, #0+ b start_kernel++LC0: .long __bss_start+ .long processor_id+ .long _end+ .long __machine_arch_type+ .long init_task_union+8192+LPC_PROCESSOR_TYPE: .long 0xfefefefe+#endif+ #if defined(CONFIG_BOARD_SNDS100) adr r5, LC0diff -Naur old/uClinux-dist/linux-2.4.x/arch/armnommu/kernel/ptrace.c uClinux-dist/linux-2.4.x/arch/armnommu/kernel/ptrace.c--- old/uClinux-dist/linux-2.4.x/arch/armnommu/kernel/ptrace.c 2004-04-08 08:15:03.000000000 +0800+++ uClinux-dist/linux-2.4.x/arch/armnommu/kernel/ptrace.c 2005-06-06 09:51:12.000000000 +0800@@ -23,6 +23,8 @@ #include "ptrace.h" ++ #define REG_PC 15 #define REG_PSR 16 /*@@ -37,6 +39,44 @@ /* fill this in later */ #define BREAKINST_THUMB 0xdf00 +/*added by telpro*/+static inline long get_stack_long(struct task_struct *task, int offset);+#define REG_SP 13++int in_arm26_mode(struct task_struct *child)+{+ long psr; + psr = get_stack_long(child, REG_PSR) ;+ return ((psr & 0x1f) <= 3);+}++#define FIXPC(child, x) \+ do { \+ if(in_arm26_mode(child)) x = x & 0x0ffffffc; \+ }while(0) ++//do as arch/armnommu/kernel/process.c+//a dirty version, FIXME...telpro+int is_addr_access( struct task_struct *child, + unsigned long addr )+{+ unsigned long sp; + if ( addr >= child->mm->start_code && + addr < child->mm->end_code )+ return 1;+ + if ( addr >= child->mm->start_data &&+ addr < child->mm->brk )+ return 1;+ sp = get_stack_long(child, REG_SP) ;+ //actually <sp is r/w also.+ if ( addr >= sp &&+ addr < child->mm->start_stack )+ return 1;+ return 0; +}+ + /* * Get the address of the live pt_regs for the specified task. * These are saved onto the top kernel stack when the process@@ -57,6 +97,12 @@ */ static inline long get_stack_long(struct task_struct *task, int offset) {+ unsigned long data;+ data = get_user_regs(task)->uregs[offset];++ if(offset == 14) {+ data = data & 0x03fffffe;+ } return get_user_regs(task)->uregs[offset]; } @@ -380,6 +426,8 @@ regs = get_user_regs(child); pc = instruction_pointer(regs);+ //26bit , added by telpro+ FIXPC(child, pc); res = read_tsk_long(child, pc, &insn); if (!res) {@@ -389,8 +437,10 @@ dbg->nsaved = 0; alt = get_branch_address(child, pc, insn);- if (alt)+ if (alt) {+ FIXPC(child, alt); res = add_breakpoint_arm(child, dbg, alt);+ } /* * Note that we ignore the result of setting the above@@ -455,6 +505,11 @@ */ case PTRACE_PEEKTEXT: case PTRACE_PEEKDATA:+ /*added by telpro*/+ if (!is_addr_access(child, addr) ) {+ ret = -EIO; + break;+ } ret = read_tsk_long(child, addr, &tmp); if (!ret) ret = put_user(tmp, (unsigned long *) data);@@ -471,15 +526,23 @@ tmp = 0; /* Default return condition */ if (addr < sizeof(struct pt_regs)) { tmp = get_stack_long(child, (int)addr >> 2);- } else if (addr == 4*49) {+ //added by telpro, for at91+ if(addr == 14*4 || addr == 15*4 ) {+ FIXPC(child, tmp);+ }+ } else if (addr == 49*4) { tmp = child->mm->start_code;- } else if (addr == 4*50) {+ } else if (addr == 50*4) { tmp = child->mm->start_data;- } else if (addr == 4*51) {+ } else if (addr == 51*4) { tmp = child->mm->end_code;- } else if (addr == 4*52) {+ } else if (addr == 52*4)+ { tmp = child->mm->end_data;- }+ } else+ break;+ ret = put_user(tmp,(unsigned long *) data);+ break; ret = put_user(tmp, (unsigned long *)data); break; @@ -488,6 +551,11 @@ */ case PTRACE_POKETEXT: case PTRACE_POKEDATA:+ /*added by telpro*/+ if (!is_addr_access(child, addr) ) {+ ret = -EIO; + break;+ } ret = write_tsk_long(child, addr, data); break; diff -Naur old/uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/arch.c uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/arch.c--- old/uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/arch.c 1970-01-01 08:00:00.000000000 +0800+++ uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/arch.c 2005-03-30 13:53:38.000000000 +0800@@ -0,0 +1,32 @@+#include <linux/tty.h>+#include <linux/delay.h>+#include <linux/pm.h>+#include <linux/init.h>++#include <asm/elf.h>+#include <asm/setup.h>+#include <asm/mach-types.h>+#include <asm/mach/arch.h>++extern void genarch_init_irq(void);++void fixup_lpc(struct machine_desc *desc, struct param_struct *params, char ** cmdline, struct meminfo * mi)+{+ mi->bank[0].start = 0x81000000;+ mi->bank[0].size = 8 * 1024 * 1024;+ mi->bank[0].node = 0;+ mi->nr_banks = 1;++#ifdef CONFIG_BLK_DEV_INITRD+ setup_ramdisk(1, 0, 0, CONFIG_BLK_DEV_RAM_SIZE);+ setup_initrd(__phys_to_virt(0x81700000), 1024 * 1024);+ ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);+#endif+}++MACHINE_START(LPC, "zlg-arm-linux")+ MAINTAINER("tsinghua")+ BOOT_MEM(0x81000000, 0xe0000000, 0xe0000000)+ FIXUP(fixup_lpc)+ INITIRQ(genarch_init_irq)+MACHINE_ENDdiff -Naur old/uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/irq.c uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/irq.c--- old/uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/irq.c 1970-01-01 08:00:00.000000000 +0800+++ uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/irq.c 2005-04-26 13:22:14.000000000 +0800@@ -0,0 +1,56 @@+#include <linux/init.h>++#include <asm/mach/irq.h>+#include <asm/hardware.h>+#include <asm/io.h>+#include <asm/irq.h>+#include <asm/system.h>++extern struct irqdesc irq_desc[];++void lpc_mask_irq(unsigned int irq)+{+ __arch_putl(1<<irq, VIC_IECR);+}++void lpc_unmask_irq(unsigned int irq)+{+ unsigned long mask = 1 << (irq);+ unsigned long ier = __arch_getl(VIC_IER);+ + ier = mask|ier;+ __arch_putl(ier, VIC_IER);+}++void lpc_mask_ack_irq(unsigned int irq)+{+ __arch_putl(0x0, VIC_AR);+ lpc_mask_irq(irq);+}++void lpc_init_vic(void)+{+ int irqno;+ + /* Disable all interrupts */+ __arch_putl(0xffffffff, VIC_IECR);++ /* Clear all soft interrupts */+ __arch_putl(0xffffffff, VIC_SICR);++ /* use IRQ not FIQ */+ __arch_putl(0x0, VIC_ISLR);++// for(irqno = 0; irqno < 16; irqno++)+// {+// __arch_putl(irqno, VIC_VAR(irqno)); /*index*/+// __arch_putl(0x20|irqno, VIC_VCR(irqno)); /*vect*/+// }+// __arch_putl(16, VIC_DVAR);++ /* set protect */+ __arch_putl(1, VIC_PER);++ /* remap IRQ to RAM */+ __arch_putl(0x2, MEMMAP);+}diff -Naur old/uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/Makefile uClinux-dist/linux-2.4.x/arch/armnommu/mach-lpc/Makefile
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -