svn commit: r276420 - user/nwhitehorn/kboot/powerpc/kboot

Nathan Whitehorn nwhitehorn at FreeBSD.org
Tue Dec 30 20:22:45 UTC 2014


Author: nwhitehorn
Date: Tue Dec 30 20:22:43 2014
New Revision: 276420
URL: https://svnweb.freebsd.org/changeset/base/276420

Log:
  Get FreeBSD kexec'ing. The trampoline needs to relocate the kernel back to
  where it is supposed to be (on top of Linux, usually) for this to actually
  do anything useful, but we're now getting much closer.

Modified:
  user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S
  user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h
  user/nwhitehorn/kboot/powerpc/kboot/main.c
  user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c

Modified: user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S	Tue Dec 30 20:20:18 2014	(r276419)
+++ user/nwhitehorn/kboot/powerpc/kboot/host_syscall.S	Tue Dec 30 20:22:43 2014	(r276420)
@@ -44,3 +44,19 @@ ENTRY(host_select)
 	sc
 	blr
 
+ENTRY(kexec_load)
+	lis	%r4,nkexec_segments at ha
+	ori	%r4,%r4,nkexec_segments at l
+	lwz	%r4,0(%r4)
+	lis	%r5,loaded_segments at ha
+	ori	%r5,%r5,loaded_segments at l
+	lis	%r6,21	# KEXEC_ARCH_PPC64
+	li	%r0,268 # __NR_kexec_load
+	sc
+	blr
+
+ENTRY(host_reboot)
+	li %r0,88 # SYS_reboot
+	sc
+	blr
+

Modified: user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h	Tue Dec 30 20:20:18 2014	(r276419)
+++ user/nwhitehorn/kboot/powerpc/kboot/host_syscall.h	Tue Dec 30 20:22:43 2014	(r276420)
@@ -44,5 +44,7 @@ struct host_timeval {
 int host_gettimeofday(struct host_timeval *a, void *b);
 int host_select(int nfds, long *readfds, long *writefds, long *exceptfds,
     struct host_timeval *timeout);
+int kexec_load(vm_offset_t start);
+int host_reboot(int, int, int, void *);
 
 #endif

Modified: user/nwhitehorn/kboot/powerpc/kboot/main.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/main.c	Tue Dec 30 20:20:18 2014	(r276419)
+++ user/nwhitehorn/kboot/powerpc/kboot/main.c	Tue Dec 30 20:22:43 2014	(r276420)
@@ -181,6 +181,7 @@ get_phys_buffer(vm_offset_t dest, const 
 {
 	int i = 0;
 	const size_t segsize = 2*1024*1024;
+	dest += 32*1024*1024; /* XXX Make nonoverlapping somehow */
 
 	for (i = 0; i < nkexec_segments; i++) {
 		if (dest >= (vm_offset_t)loaded_segments[i].mem &&

Modified: user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c
==============================================================================
--- user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c	Tue Dec 30 20:20:18 2014	(r276419)
+++ user/nwhitehorn/kboot/powerpc/kboot/ppc64_elf_freebsd.c	Tue Dec 30 20:22:43 2014	(r276420)
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
 #include <stand.h>
 
 #include "bootstrap.h"
+#include "host_syscall.h"
 
 extern char		end[];
 extern vm_offset_t	reloc;	/* From <arch>/conf.c */
@@ -65,6 +66,7 @@ ppc64_elf_exec(struct preloaded_file *fp
 	Elf_Ehdr		*e;
 	int			error;
 	uint32_t		*trampoline;
+	vm_offset_t		trampolinebase = 32*1024*1024; /* XXX */
 
 	if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
 		return(EFTYPE);
@@ -84,12 +86,21 @@ ppc64_elf_exec(struct preloaded_file *fp
 
 	trampoline[6] = mdp;
 	trampoline[7] = sizeof(mdp);
-	printf("Kernel entry at %#x ...\n", e->e_entry);
+	printf("Kernel entry at %#jx ...\n", e->e_entry);
 
 	dev_cleanup();
 
-	archsw.arch_copyin(trampoline, 0 /* XXX */, szkerneltramp);
-	/* XXX kexec_load, reboot */
+	archsw.arch_copyin(trampoline, trampolinebase, szkerneltramp);
+	free(trampoline);
+
+	error = kexec_load(trampolinebase);
+	if (error != 0)
+		panic("kexec_load returned error: %d", error);
+	error = host_reboot(0xfee1dead, 672274793,
+	    0x45584543 /* LINUX_REBOOT_CMD_KEXEC */, NULL);
+	if (error != 0)
+		panic("reboot returned error: %d", error);
+	while (1) {}
 
 	panic("exec returned");
 }


More information about the svn-src-user mailing list