Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Jan 2020 04:13:20 +0000 (UTC)
From:      Brandon Bergren <bdragon@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r356878 - head/stand/powerpc/uboot
Message-ID:  <202001190413.00J4DKRh042357@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bdragon
Date: Sun Jan 19 04:13:19 2020
New Revision: 356878
URL: https://svnweb.freebsd.org/changeset/base/356878

Log:
  [PowerPC] Fix 32-bit ubldr calling convention
  
  Due to the way u-boot for 32-bit powerpc is compiled, the interrupt code
  assumes that the GOT pointer (r30) on u-boot is always intact.
  
  When making syscalls to u-boot, ensure that we have restored r30 like we
  found it before we enable interrupts to prevent u-boot from crashing if a
  timer interrupt was pending.
  
  This fixes ubldr on e500 qemu (assuming you have recompiled qemu's u-boot
  with API support!)
  
  Reviewed by:	jhibbits
  Sponsored by:	Tag1 Consulting, Inc.
  Differential Revision:	https://reviews.freebsd.org/D23258

Modified:
  head/stand/powerpc/uboot/start.S

Modified: head/stand/powerpc/uboot/start.S
==============================================================================
--- head/stand/powerpc/uboot/start.S	Sun Jan 19 02:48:56 2020	(r356877)
+++ head/stand/powerpc/uboot/start.S	Sun Jan 19 04:13:19 2020	(r356878)
@@ -38,10 +38,11 @@ _start:
 	lis	%r11, uboot_address@ha
 	addi	%r11, %r11, uboot_address@l
 	stw	%r1, 0(%r11)
-	/* Save U-Boot's r14 */
+	/* Save U-Boot's r14 and r30 */
 	lis	%r11, saved_regs@ha
 	addi	%r11, %r11, saved_regs@l
 	stw	%r14, 0(%r11)
+	stw	%r30, 4(%r11)
 	/* Disable interrupts */
 	mfmsr	%r11
 	andi.	%r11, %r11, ~0x8000@l
@@ -52,14 +53,16 @@ _start:
  * syscall()
  */
 ENTRY(syscall)
-	stwu	%r1, -16(%r1)
+	stwu	%r1, -32(%r1)
 	mflr	%r0
 	stw	%r14, 8(%r1)
-	stw	%r0, 20(%r1)
-	/* Restore U-Boot's r14 */
+	stw	%r30, 12(%r1)
+	stw	%r0, 36(%r1)
+	/* Restore U-Boot's r14 and r30 */
 	lis	%r11, saved_regs@ha
 	addi	%r11, %r11, saved_regs@l
 	lwz	%r14, 0(%r11)
+	lwz	%r30, 4(%r11)
 	/* Enable interrupts */
 	mfmsr	%r11
 	ori	%r11, %r11, 0x8000@l
@@ -79,6 +82,7 @@ ENTRY(syscall)
 	lwz	%r0, 4(%r11)
 	mtlr	%r0
 	lwz	%r14, 8(%r1)
+	lwz	%r30, 12(%r1)
 	mr	%r1, %r11
 	blr
 
@@ -90,5 +94,6 @@ GLOBAL(syscall_ptr)
 	.long	0
 GLOBAL(saved_regs)
 	.long	0	/* R14 */
+	.long	0	/* R30 */
 GLOBAL(uboot_address)
 	.long	0



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