⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uclinux-dist-20040408-lpc-chy-cmj.patch

📁 是在周立功ARMsmart2200上建立culinux开发平台必须打的补丁
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+                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 + -