--- mips/machdep.c (revision 203318) +++ mips/machdep.c (local) @@ -84,6 +84,7 @@ #include #include #include +#include #include #include #include @@ -150,9 +151,18 @@ extern char MipsCache[], MipsCacheEnd[]; extern char edata[], end[]; +#ifdef DDB +extern vm_offset_t ksym_start, ksym_end; +#endif u_int32_t bootdev; struct bootinfo bootinfo; +/* + * First kseg0 address available for use. By default it's equal to &end. + * But in some cases there might be additional data placed right after + * _end by loader or ELF trampoline. + */ +vm_offset_t kernel_kseg0_end = (vm_offset_t)&end; static void cpu_startup(void *dummy) @@ -360,6 +370,34 @@ } /* + * Fix kernel_kseg0_end address in case trampoline placed debug sympols + * data there + */ +void +mips_postboot_fixup(void) +{ + vm_offset_t kernend; + + /* clear the BSS and SBSS segments */ + kernend = (vm_offset_t)&end; + memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + +#ifdef DDB + Elf_Size *trampoline_data = (Elf_Size*)kernel_kseg0_end; + Elf_Size symtabsize = 0; + if (trampoline_data[0] == SYMTAB_MAGIC) { + symtabsize = trampoline_data[1]; + kernel_kseg0_end += 2 * sizeof(Elf_Size); + /* start of .symtab */ + ksym_start = kernel_kseg0_end; + kernel_kseg0_end += symtabsize; + /* end of .strtab */ + ksym_end = kernel_kseg0_end; + } +#endif +} + +/* * Initialise a struct pcpu. */ void --- atheros/ar71xx_machdep.c (revision 203318) +++ atheros/ar71xx_machdep.c (local) @@ -57,8 +57,6 @@ #include -extern int *edata; -extern int *end; uint32_t ar711_base_mac[ETHER_ADDR_LEN]; /* 4KB static data aread to keep a copy of the bootload env until the dynamic kenv is setup */ @@ -142,15 +140,12 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused, __register_t a2 __unused, __register_t a3 __unused) { - vm_offset_t kernend; uint64_t platform_counter_freq; uint32_t reg; int argc, i, count = 0; char **argv, **envp; - /* clear the BSS and SBSS segments */ - kernend = round_page((vm_offset_t)&end); - memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + mips_postboot_fixup(); /* Initialize pcpu stuff */ mips_pcpu0_init(); @@ -186,7 +181,7 @@ realmem = btoc(32*1024*1024); /* phys_avail regions are in bytes */ - phys_avail[0] = MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); + phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); physmem = realmem; --- include/md_var.h (revision 203318) +++ include/md_var.h (local) @@ -44,6 +44,7 @@ extern int szsigcode, szosigcode; extern vm_offset_t kstack0; +extern vm_offset_t kernel_kseg0_end; void MipsSaveCurFPState(struct thread *); void fork_trampoline(void); @@ -68,6 +69,7 @@ void mips_cpu_init(void); void mips_pcpu0_init(void); void mips_proc0_init(void); +void mips_postboot_fixup(void); /* Platform call-downs. */ void platform_identify(void);