Author: gonzo
Date: Thu Mar 15 05:29:51 2012
New Revision: 232998
URL: http://svn.freebsd.org/changeset/base/232998

Log:
  Fill out fake preload structure to let userland tools like pmc(3) know
  about kernel module base address and actual size

Modified:
  head/sys/conf/Makefile.mips
  head/sys/mips/mips/machdep.c

Modified: head/sys/conf/Makefile.mips
==============================================================================
--- head/sys/conf/Makefile.mips Thu Mar 15 05:11:29 2012        (r232997)
+++ head/sys/conf/Makefile.mips Thu Mar 15 05:29:51 2012        (r232998)
@@ -44,7 +44,7 @@ MKMODULESENV+=        MACHINE=${MACHINE} MACHIN
 # We default to the MIPS32 ISA, if none specified in the
 # kernel configuration file.
 ARCH_FLAGS?=-march=mips32
-EXTRA_FLAGS=-fno-pic -mno-abicalls -G0
+EXTRA_FLAGS=-fno-pic -mno-abicalls -G0 -DKERNLOADADDR=${KERNLOADADDR}
 
 HACK_EXTRA_FLAGS=-shared
 

Modified: head/sys/mips/mips/machdep.c
==============================================================================
--- head/sys/mips/mips/machdep.c        Thu Mar 15 05:11:29 2012        
(r232997)
+++ head/sys/mips/mips/machdep.c        Thu Mar 15 05:29:51 2012        
(r232998)
@@ -380,6 +380,56 @@ mips_vector_init(void)
 void
 mips_postboot_fixup(void)
 {
+       static char fake_preload[256];
+       caddr_t preload_ptr = (caddr_t)&fake_preload[0];
+       size_t size = 0;
+
+       /*
+        * Provide kernel module file information
+        */
+       *(uint32_t*)(preload_ptr + size) = MODINFO_NAME;
+       size += sizeof(uint32_t);
+       *(uint32_t*)(preload_ptr + size) = strlen("kernel") + 1;
+       size += sizeof(uint32_t);
+       strcpy((char*)(preload_ptr + size), "kernel");
+       size += strlen("kernel") + 1;
+       size = roundup(size, sizeof(u_long));
+
+       *(uint32_t*)(preload_ptr + size) = MODINFO_TYPE;
+       size += sizeof(uint32_t);
+       *(uint32_t*)(preload_ptr + size) = strlen("elf kernel") + 1;
+       size += sizeof(uint32_t);
+       strcpy((char*)(preload_ptr + size), "elf kernel");
+       size += strlen("elf kernel") + 1;
+       size = roundup(size, sizeof(u_long));
+
+       *(uint32_t*)(preload_ptr + size) = MODINFO_ADDR;
+       size += sizeof(uint32_t);
+       *(uint32_t*)(preload_ptr + size) = sizeof(vm_offset_t);
+       size += sizeof(uint32_t);
+       *(vm_offset_t*)(preload_ptr + size) = KERNLOADADDR;
+       size += sizeof(vm_offset_t);
+       size = roundup(size, sizeof(u_long));
+
+       *(uint32_t*)(preload_ptr + size) = MODINFO_SIZE;
+       size += sizeof(uint32_t);
+       *(uint32_t*)(preload_ptr + size) = sizeof(size_t);
+       size += sizeof(uint32_t);
+       *(vm_offset_t*)(preload_ptr + size) = (size_t)&end - KERNLOADADDR;
+       size = roundup(size, sizeof(u_long));
+       size += sizeof(size_t);
+
+       /* End marker */
+       *(uint32_t*)(preload_ptr + size) = 0;
+       size += sizeof(uint32_t);
+       *(uint32_t*)(preload_ptr + size) = 0;
+       size += sizeof(uint32_t);
+
+       KASSERT((size < sizeof(fake_preload)),
+               ("fake preload size is more thenallocated"));
+
+       preload_metadata = (void *)fake_preload;
+
 #ifdef DDB
        Elf_Size *trampoline_data = (Elf_Size*)kernel_kseg0_end;
        Elf_Size symtabsize = 0;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to