Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Mar 2012 05:29:52 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r232998 - in head/sys: conf mips/mips
Message-ID:  <201203150529.q2F5TqgK049263@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203150529.q2F5TqgK049263>