Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 May 2020 21:52:29 +0000 (UTC)
From:      Mitchell Horne <mhorne@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r360551 - head/sys/riscv/riscv
Message-ID:  <202005012152.041LqTNM014390@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mhorne
Date: Fri May  1 21:52:29 2020
New Revision: 360551
URL: https://svnweb.freebsd.org/changeset/base/360551

Log:
  Make mpentry independent of _start
  
  APs enter the kernel at the same point as the BSP, the _start routine.
  They then jump to mpentry, but not before storing the kernel's physical
  load address in the s9 register. Extract this calculation into its own
  routine, so that APs can be instructed to enter directly from mpentry.
  
  Differential Revision:	https://reviews.freebsd.org/D24495

Modified:
  head/sys/riscv/riscv/locore.S

Modified: head/sys/riscv/riscv/locore.S
==============================================================================
--- head/sys/riscv/riscv/locore.S	Fri May  1 21:24:19 2020	(r360550)
+++ head/sys/riscv/riscv/locore.S	Fri May  1 21:52:29 2020	(r360551)
@@ -59,13 +59,6 @@ _start:
 	lla	gp, __global_pointer$
 .option pop
 
-	/* Get the physical address kernel loaded to */
-	lla	t0, virt_map
-	ld	t1, 0(t0)
-	sub	t1, t1, t0
-	li	t2, KERNBASE
-	sub	s9, t2, t1	/* s9 = physmem base */
-
 	/*
 	 * a0 = hart id
 	 * a1 = dtbp
@@ -87,6 +80,9 @@ _start:
 	 * Page tables
 	 */
 1:
+	/* Get the kernel's load address */
+	jal	get_physmem
+
 	/* Add L1 entry for kernel */
 	lla	s1, pagetable_l1
 	lla	s2, pagetable_l2	/* Link to next level PN */
@@ -224,6 +220,17 @@ va:
 	call	_C_LABEL(initriscv)	/* Off we go */
 	call	_C_LABEL(mi_startup)
 
+/*
+ * Get the physical address the kernel is loaded to. Returned in s9.
+ */
+get_physmem:
+	lla	t0, virt_map	/* physical address of virt_map */
+	ld	t1, 0(t0)	/* virtual address of virt_map */
+	sub	t1, t1, t0	/* calculate phys->virt delta */
+	li	t2, KERNBASE
+	sub	s9, t2, t1	/* s9 = physmem base */
+	ret
+
 	.align  4
 initstack:
 	.space  (PAGE_SIZE * KSTACK_PAGES)
@@ -302,6 +309,9 @@ ENTRY(mpentry)
 	/* Setup stack pointer */
 	lla	t0, bootstack
 	ld	sp, 0(t0)
+
+	/* Get the kernel's load address */
+	jal get_physmem
 
 	/* Setup supervisor trap vector */
 	lla	t0, mpva



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