--- zzzz-none-000/linux-2.6.28.10/init/main.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/init/main.c 2010-03-10 09:25:12.000000000 +0000 @@ -147,6 +147,7 @@ static inline void disable_ioapic_setup(void) {}; #endif + static int __init nosmp(char *str) { setup_max_cpus = 0; @@ -539,6 +540,179 @@ { } +#if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_MIPS) + +union ___mmu_ttbcr { + struct __mmu_ttbcr { /*--- Big Endian ---*/ + unsigned int base : 32 - 6; /* 26 bit */ + unsigned int pd1 : 1; + unsigned int pd0 : 1; + unsigned int sbz : 1; + unsigned int N : 3; + } Bits; + volatile unsigned int Register; +}; + +union ___mmu_ttb { + struct __mmu_ttb { /*--- Big Endian ---*/ + unsigned int raw_base : 32 - 7; /* 25 bit */ + unsigned int dont_care : 4; + unsigned int P : 1; + unsigned int S : 1; + unsigned int C : 1; + } Bits; + volatile unsigned int Register; +}; + +union first_level_descr { + struct first_level_descr_v5 { + unsigned int section_base_addr : 12; + unsigned int ns : 1; + unsigned int sbz : 4; + unsigned int tex : 3; + unsigned int ap : 2; + unsigned int p : 1; + unsigned int domain : 4; + unsigned int xn : 1; + unsigned int c : 1; + unsigned int b : 1; + unsigned int b1: 1; + unsigned int b0: 1; + } v5_style; + + struct first_level_descr_v6 { + unsigned int section_base_addr : 12; + unsigned int ns : 1; + unsigned int n0 : 1; + unsigned int ng : 1; + unsigned int s : 1; + unsigned int apx : 1; + unsigned int tex : 3; + unsigned int ap : 2; + unsigned int p : 1; + unsigned int domain : 4; + unsigned int xn : 1; + unsigned int c : 1; + unsigned int b : 1; + unsigned int b1: 1; + unsigned int b0: 1; + } v6_style; + + struct second_level_ref { + unsigned int table_base_addr : 22; + unsigned int p : 1; + unsigned int domain : 4; + unsigned int sbz1 : 1; + unsigned int ns : 1; + unsigned int sbz0 : 1; + unsigned int b1 : 1; + unsigned int b0 :1; + } second_level; + volatile unsigned int Register; +}; + + +union second_level_descr { + struct second_level_v6_64k { + unsigned int page_addr : 16; + unsigned int dont_care : 13; + unsigned int b : 1; + unsigned int b1: 1; + unsigned int b0: 1; + } v6_64k; + volatile unsigned int Register; +}; + +union ___mmu_ttbcr ll_debug_read_ttbcr(void){ + union ___mmu_ttbcr mmu_state_reg; + unsigned int rn = 0; + /*mrc p15, 0, rn, c2, c0, 2 */ + asm ("mrc p15, 0, %0, c2, c0, 2" : "=r" (rn)); + mmu_state_reg.Register = rn; + printk("Status: base=0x%x, pd1=%x, pd0=%x, sbz=%x, N=0x%x \n",mmu_state_reg.Bits.base, mmu_state_reg.Bits.pd1, mmu_state_reg.Bits.pd0, mmu_state_reg.Bits.sbz, mmu_state_reg.Bits.N ); + return mmu_state_reg; +} + +union ___mmu_ttb ll_debug_read_ttbr(unsigned int N){ + unsigned int regnr = (N==0) ? 0 : 1 ; /* if N is zero, then TTBR0 is used */ + + unsigned int rn = 0; + union ___mmu_ttb ttb_reg; + if (regnr == 0 ){ + /* mrc p15, 0, rn, c2, c0, 0 */ + asm ("mrc p15, 0, %0, c2, c0, 0" : "=r" (rn)); + } + else { + /* mrc p15, 0, rn, c2, c0, 1 */ + asm ("mrc p15, 0, %0, c2, c0, 1" : "=r" (rn)); + } + + /*--- printk("ttbr[%u]=0x%x \n",regnr, rn ); ---*/ + ttb_reg.Register = rn; + + printk("Base-Reg[%u]: base=0x%x, P=%x, S=%x, C=%x \n", regnr, ttb_reg.Bits.raw_base, ttb_reg.Bits.P, ttb_reg.Bits.S, ttb_reg.Bits.C); + return ttb_reg; +} + +unsigned int first_level_descr_addr(unsigned int virt_addr){ + unsigned int result; + unsigned int first_level_table_index; + union ___mmu_ttbcr mmu_state_reg; + unsigned int N; + union ___mmu_ttb mmu_ttb; + unsigned int trans_base; + result = 0; + first_level_table_index = virt_addr; + mmu_state_reg = ll_debug_read_ttbcr(); + N = mmu_state_reg.Bits.N; + mmu_ttb = ll_debug_read_ttbr(N); + trans_base = mmu_ttb.Bits.raw_base; + + printk("\n----------------------\nVirtual 0x%x\n", virt_addr); + /*--- printk("Trans_base: 0x%x \n", trans_base); ---*/ + trans_base = trans_base >> (7 - N); + /*--- printk("Trans_base(>>): 0x%x \n", trans_base); ---*/ + trans_base = trans_base << (14 - N); + /*--- printk("Trans_base(<<): 0x%x \n", trans_base); ---*/ + first_level_table_index = (first_level_table_index >> 20) << 2; + /*--- printk("masked flti: 0x%x \n",first_level_table_index); ---*/ + result = trans_base | first_level_table_index; + return result; +} + +void eval_first_level_descr(unsigned int descr_addr, unsigned int virt_addr){ + union first_level_descr current_descr; + current_descr.Register = *((unsigned int*)descr_addr); + printk("1st-L-Descr(Addr: 0x%x): 0x%x \n base=0x%x ns=%i, n0=%i, ng=%i, s=%i, apx=%i, tex=0x%x, ap=0x%x, p=%i, dom=0x%x, xn=%i, c=%i, b=%i, b1=%i, b0=%i \n",(unsigned int)descr_addr, current_descr.Register ,current_descr.v6_style.section_base_addr , current_descr.v6_style.ns, current_descr.v6_style.n0, current_descr.v6_style.ng, current_descr.v6_style.s, current_descr.v6_style.apx, current_descr.v6_style.tex, current_descr.v6_style.ap, current_descr.v6_style.p, current_descr.v6_style.domain, current_descr.v6_style.xn, current_descr.v6_style.c, current_descr.v6_style.b, current_descr.v6_style.b1, current_descr.v6_style.b0); + if ((current_descr.v6_style.b1 == 0) && (current_descr.v6_style.b0 ==0)) { + printk("Translation fault\n"); + } + else if ((current_descr.v6_style.b1 == 0) && (current_descr.v6_style.b0 == 1)) { + unsigned int second_level_table_index = (((((1 << 8 )) - 1) << 12 ) & virt_addr ) >> 10; + unsigned int second_level_descr_addr = ((current_descr.second_level.table_base_addr) << 10) | second_level_table_index; + union second_level_descr sec_descr; + sec_descr.Register = *((unsigned int *)second_level_descr_addr); + printk("2nd-L-Descr(Addr: 0x%x): 0x%u, \n b1=%u, b0=%u\n",second_level_descr_addr, sec_descr.Register, sec_descr.v6_64k.b1, sec_descr.v6_64k.b0 ); + } + else if ((current_descr.v6_style.b1 == 1) && (current_descr.v6_style.b0 == 0)) { + unsigned int section_index = (((1 << 20 )) -1) & virt_addr; + unsigned int final_addr = (current_descr.v6_style.section_base_addr << 20 ) | section_index; + printk("Final-Addr: 0x%x \n",final_addr ); + } + else if ((current_descr.v6_style.b1 == 1) && (current_descr.v6_style.b0 == 1)) { + printk("Reserved -> results in Translation fault\n"); + } + printk("----------------------\n"); +} + +void debug_mmu_virt_addr(unsigned int virt_addr){ + unsigned int descr_addr = first_level_descr_addr(virt_addr); + eval_first_level_descr(descr_addr, virt_addr); +} + +#endif + + asmlinkage void __init start_kernel(void) { char * command_line; @@ -600,7 +774,19 @@ "enabled *very* early, fixing it\n"); local_irq_disable(); } - sort_main_extable(); + + #ifdef CONFIG_DEBUG_LL + /* + unsigned int virt_addr; + for (virt_addr = 0x80000000; virt_addr < 0x80A00000; virt_addr += 0x100000){ + unsigned int descr_addr = first_level_descr_addr(virt_addr); + eval_first_level_descr(descr_addr,virt_addr); + } + */ + + #endif + + sort_main_extable(); trap_init(); rcu_init(); init_IRQ(); @@ -715,6 +901,11 @@ it.result = fn(); +#ifdef CONFIG_DEBUG_LL + + +#endif + if (initcall_debug) { it.rettime = ktime_get(); delta = ktime_sub(it.rettime, it.calltime); @@ -750,10 +941,12 @@ static void __init do_initcalls(void) { initcall_t *call; + initcall_debug = 0; for (call = __early_initcall_end; call < __initcall_end; call++) do_one_initcall(*call); + /*--- printk("\ninitcalls passed\n"); ---*/ /* Make sure there is no pending stuff from the initcall sequence */ flush_scheduled_work(); } @@ -820,14 +1013,22 @@ * The Bourne shell can be used instead of init if we are * trying to recover a really broken machine. */ + /*--- printk("__NR_clock_gettime=%d \n",__NR_clock_gettime); ---*/ if (execute_command) { run_init_process(execute_command); printk(KERN_WARNING "Failed to execute %s. Attempting " "defaults...\n", execute_command); } + printk("trying /sbin/init\n"); run_init_process("/sbin/init"); + + printk("trying /etc/init\n"); run_init_process("/etc/init"); + + printk("trying /bin/init\n"); run_init_process("/bin/init"); + + printk("trying /bin/sh\n"); run_init_process("/bin/sh"); panic("No init found. Try passing init= option to kernel."); @@ -835,7 +1036,9 @@ static int __init kernel_init(void * unused) { + printk("kernel_init: started\n"); lock_kernel(); + printk("kernel_init: kernel locked\n"); /* * init can run on any cpu. */ @@ -863,6 +1066,7 @@ cpuset_init_smp(); do_basic_setup(); + printk("kernel_init: basic setup done\n"); /* * check if there is an early userspace init. If yes, let it do all @@ -884,5 +1088,6 @@ */ stop_boot_trace(); init_post(); + printk("kernel_init: ended\n"); return 0; }