From patchwork Tue Aug 14 11:58:55 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Markus Armbruster X-Patchwork-Id: 177237 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id C45D12C0085 for ; Tue, 14 Aug 2012 21:59:20 +1000 (EST) Received: from localhost ([::1]:50592 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T1FmI-0000Om-Tc for incoming@patchwork.ozlabs.org; Tue, 14 Aug 2012 07:59:18 -0400 Received: from eggs.gnu.org ([208.118.235.92]:35934) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T1Fm4-0000G2-4Q for qemu-devel@nongnu.org; Tue, 14 Aug 2012 07:59:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T1Fm0-0003B9-K5 for qemu-devel@nongnu.org; Tue, 14 Aug 2012 07:59:03 -0400 Received: from oxygen.pond.sub.org ([78.46.104.156]:60656) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T1Fm0-0003Ai-E4 for qemu-devel@nongnu.org; Tue, 14 Aug 2012 07:59:00 -0400 Received: from blackfin.pond.sub.org (p5B329C79.dip.t-dialin.net [91.50.156.121]) by oxygen.pond.sub.org (Postfix) with ESMTPA id AFCE99FE58; Tue, 14 Aug 2012 13:58:56 +0200 (CEST) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id F01F42005D; Tue, 14 Aug 2012 13:58:55 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 14 Aug 2012 13:58:55 +0200 Message-Id: <1344945535-2774-3-git-send-email-armbru@redhat.com> X-Mailer: git-send-email 1.7.11.2 In-Reply-To: <1344945535-2774-1-git-send-email-armbru@redhat.com> References: <1344945535-2774-1-git-send-email-armbru@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 78.46.104.156 Cc: blauwirbel@gmail.com, anthony@codemonkey.ws, avi@redhat.com, gleb@redhat.com Subject: [Qemu-devel] [PATCH 2/2] pc: Fix RTC CMOS info on RAM for ram_size < 1MiB X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org pc_cmos_init() always claims 640KiB base memory, and ram_size - 1MiB extended memory. The latter can underflow to "lots of extended memory". Fix both, and clean up some. Note: SeaBIOS currently requires 1MiB of RAM, and doesn't check whether it got enough. Signed-off-by: Markus Armbruster --- hw/pc.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index e8bcfc0..1597fe6 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -337,32 +337,35 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, /* various important CMOS locations needed by PC/Bochs bios */ /* memory size */ - val = 640; /* base memory in K */ + /* base memory (first MiB) */ + val = MIN(ram_size / 1024, 640); rtc_set_memory(s, 0x15, val); rtc_set_memory(s, 0x16, val >> 8); - - val = (ram_size / 1024) - 1024; + /* extended memory (next 64MiB) */ + if (ram_size > 1024 * 1024) + val = (ram_size - 1024 * 1024) / 1024; + else + val = 0; if (val > 65535) val = 65535; rtc_set_memory(s, 0x17, val); rtc_set_memory(s, 0x18, val >> 8); rtc_set_memory(s, 0x30, val); rtc_set_memory(s, 0x31, val >> 8); - - if (above_4g_mem_size) { - rtc_set_memory(s, 0x5b, (unsigned int)above_4g_mem_size >> 16); - rtc_set_memory(s, 0x5c, (unsigned int)above_4g_mem_size >> 24); - rtc_set_memory(s, 0x5d, (uint64_t)above_4g_mem_size >> 32); - } - - if (ram_size > (16 * 1024 * 1024)) - val = (ram_size / 65536) - ((16 * 1024 * 1024) / 65536); + /* memory between 16MiB and 4GiB */ + if (ram_size > 16 * 1024 * 1024) + val = (ram_size - 16 * 1024 * 1024) / 65536; else val = 0; if (val > 65535) val = 65535; rtc_set_memory(s, 0x34, val); rtc_set_memory(s, 0x35, val >> 8); + /* memory above 4GiB */ + val = above_4g_mem_size / 65536; + rtc_set_memory(s, 0x5b, val); + rtc_set_memory(s, 0x5c, val >> 8); + rtc_set_memory(s, 0x5d, val >> 16); /* set the number of CPU */ rtc_set_memory(s, 0x5f, smp_cpus - 1);