Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Jan 2016 18:16:24 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r293053 - head/sys/boot/uboot/lib
Message-ID:  <201601021816.u02IGOXQ060620@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sat Jan  2 18:16:24 2016
New Revision: 293053
URL: https://svnweb.freebsd.org/changeset/base/293053

Log:
  Use 64-bit math when finding a block of ram to hold the kernel.  This fixes
  a problem on 32-bit systems which have ram occupying the end of the physical
  address space -- for example, a block of ram at 0x80000000 with a size of
  0x80000000 was overflowing 32 bit math and ending up with a calculated size
  of zero.
  
  This is a fix for one of the two problems mentioned in the PR.  Something
  similar will need to be done on the kernel side before the PR is closed.
  
  PR:		201614

Modified:
  head/sys/boot/uboot/lib/copy.c

Modified: head/sys/boot/uboot/lib/copy.c
==============================================================================
--- head/sys/boot/uboot/lib/copy.c	Sat Jan  2 18:15:10 2016	(r293052)
+++ head/sys/boot/uboot/lib/copy.c	Sat Jan  2 18:16:24 2016	(r293053)
@@ -69,11 +69,11 @@ uint64_t
 uboot_loadaddr(u_int type, void *data, uint64_t addr)
 {
 	struct sys_info *si;
-	uintptr_t sblock, eblock, subldr, eubldr;
-	uintptr_t biggest_block, this_block;
-	size_t biggest_size, this_size;
+	uint64_t sblock, eblock, subldr, eubldr;
+	uint64_t biggest_block, this_block;
+	uint64_t biggest_size, this_size;
 	int i;
-	char * envstr;
+	char *envstr;
 
 	if (addr == 0) {
 		/*
@@ -100,14 +100,15 @@ uboot_loadaddr(u_int type, void *data, u
 
 		biggest_block = 0;
 		biggest_size = 0;
-		subldr = rounddown2((uintptr_t)_start, KERN_ALIGN);
-		eubldr = roundup2(uboot_heap_end, KERN_ALIGN);
+		subldr = rounddown2((uint64_t)_start, KERN_ALIGN);
+		eubldr = roundup2((uint64_t)uboot_heap_end, KERN_ALIGN);
 		for (i = 0; i < si->mr_no; i++) {
 			if (si->mr[i].flags != MR_ATTR_DRAM)
 				continue;
-			sblock = roundup2(si->mr[i].start, KERN_ALIGN);
-			eblock = rounddown2(si->mr[i].start + si->mr[i].size,
+			sblock = roundup2((uint64_t)si->mr[i].start,
 			    KERN_ALIGN);
+			eblock = rounddown2((uint64_t)si->mr[i].start +
+			    si->mr[i].size, KERN_ALIGN);
 			if (biggest_size == 0)
 				sblock += KERN_MINADDR;
 			if (subldr >= sblock && subldr < eblock) {
@@ -134,9 +135,10 @@ uboot_loadaddr(u_int type, void *data, u
 		if (biggest_size == 0)
 			panic("Not enough DRAM to load kernel\n");
 #if 0
-		printf("Loading kernel into region 0x%08x-0x%08x (%u MiB)\n",
-		    biggest_block, biggest_block + biggest_size - 1, 
-		    biggest_size / 1024 / 1024);
+		printf("Loading kernel into region 0x%08jx-0x%08jx (%ju MiB)\n",
+		    (uintmax_t)biggest_block, 
+		    (uintmax_t)biggest_block + biggest_size - 1,
+		    (uintmax_t)biggest_size / 1024 / 1024);
 #endif
 		return (biggest_block);
 	}



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