From patchwork Tue Feb 27 18:52:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 878800 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="zw7fpCuv"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zrSgJ1WT2z9s19 for ; Wed, 28 Feb 2018 05:59:56 +1100 (AEDT) Received: from localhost ([::1]:39430 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eqkTi-0002TZ-A1 for incoming@patchwork.ozlabs.org; Tue, 27 Feb 2018 13:59:54 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53746) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eqkR6-0000ue-TR for qemu-devel@nongnu.org; Tue, 27 Feb 2018 13:57:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eqkR3-0007jY-OZ for qemu-devel@nongnu.org; Tue, 27 Feb 2018 13:57:12 -0500 Received: from mail-sn1nam01on0085.outbound.protection.outlook.com ([104.47.32.85]:51200 helo=NAM01-SN1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eqkR3-0007iF-Ef for qemu-devel@nongnu.org; Tue, 27 Feb 2018 13:57:09 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=vropUjyRzTV3VMmKqGRQ3fMcuaUJWgSLafPgWY6sDsg=; b=zw7fpCuvuW7LlQaps7lDymsfKUdaxdOsHmVbbU4vtinidlmQhECVx8PMNQ34S/tbJuTvdM29AP1VD84lflzsd5d2Okw7dtx7/7VoSwT7svsS7AXHE/tBHhIvMmcqHElPGCOhTEEKjOxvWtkcGz4MO9QKktXKA+hDUkcthQVRcTs= Received: from BY2PR02CA0110.namprd02.prod.outlook.com (10.163.44.164) by BY2PR02MB1299.namprd02.prod.outlook.com (10.162.79.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.506.18; Tue, 27 Feb 2018 18:57:05 +0000 Received: from BL2NAM02FT015.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e46::201) by BY2PR02CA0110.outlook.office365.com (2a01:111:e400:5261::36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.548.13 via Frontend Transport; Tue, 27 Feb 2018 18:57:05 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; amsat.org; dkim=none (message not signed) header.d=none;amsat.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.100 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.100; helo=xsj-pvapsmtpgw02; Received: from xsj-pvapsmtpgw02 (149.199.60.100) by BL2NAM02FT015.mail.protection.outlook.com (10.152.77.167) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.527.18 via Frontend Transport; Tue, 27 Feb 2018 18:57:02 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:59220 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1eqkQv-0006gn-HU; Tue, 27 Feb 2018 10:57:01 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1eqkQv-0005k0-90; Tue, 27 Feb 2018 10:57:01 -0800 Received: from xsj-pvapsmtp01 (maildrop.xilinx.com [149.199.38.66]) by xsj-smtp-dlp2.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id w1RIutOS007667; Tue, 27 Feb 2018 10:56:56 -0800 Received: from [172.19.2.220] (helo=xsjalistai50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1eqkQp-0005gm-KS; Tue, 27 Feb 2018 10:56:55 -0800 From: Alistair Francis To: , Date: Tue, 27 Feb 2018 10:52:18 -0800 Message-ID: <5df08e2ebca98ec9a589fbdb939f2413b27b2156.1519755964.git.alistair.francis@xilinx.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: References: X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.100; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39860400002)(346002)(376002)(396003)(39380400002)(2980300002)(438002)(189003)(199004)(2906002)(36756003)(356003)(63266004)(106466001)(36386004)(118296001)(305945005)(478600001)(110136005)(54906003)(106002)(5660300001)(50466002)(8676002)(16586007)(48376002)(50226002)(8936002)(81166006)(81156014)(4326008)(9786002)(39060400002)(336011)(7696005)(77096007)(6666003)(316002)(2950100002)(51416003)(47776003)(26005)(59450400001)(76176011)(186003)(107986001)(5001870100001); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR02MB1299; H:xsj-pvapsmtpgw02; FPR:; SPF:Pass; PTR:xapps1.xilinx.com,unknown-60-100.xilinx.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2NAM02FT015; 1:Lk5IdUjuOp7EqdT+XCYCZnywMyA+WLBIabxrEKBckTlx3iFsY1Q+7thOZyqy1M6weTqlIo99KLHjVXuPLhm55L7WlYJo5ZNGgUBup5wd6UBZbwN6rRzNDWaaPE2OlsZh MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 048ac950-17f5-4836-fe01-08d57e13e46d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(4608076)(2017052603307)(7153060); SRVR:BY2PR02MB1299; X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1299; 3:4lydmcGNbdJ8D2KEqt0IHU0R9SJG9nAp5rvjrbahBftwrthYng2wiFRvEAI9vqAmWVQR26gPmCqJEVObtaIhjhF6kUxHOOWcl+9g21QO5ThE+kXzYr0lG1gIc+hUSLHcsKkuQUofKm/UcA20nJLpiEz5RAbYxxluIp5WljFbAaAc8qt2vjLN3uVB6Q7lBVlItSrCHy+AKo6VXOZwUc0SG64mPnT6eDAiGyWSDJv0M+ZYmwxISmCpevOzvtuO0thUNh+0kFazdFhkl9UGk+FBpYbHNV62GBVUowQmZLffFGnW5/ofEodYGSXILPHqSwIWxAh58Ho0Mn000gLLdnqxWliwbA7XdIOxP7AbomzsHJE=; 25:iJrbWLTQOtvZranrnJEAnkfRCPH7F7UANTtY/jf5m8rZs6rYpXXpzzaj11L0wsIYsCXeEaBqqz5gKelVlHzLIFo2pZHYEMb1Paz7CfS9FMlILeUcjqbRBDqZT70WhUPo16faX/G1XNdxJAVj/CH/K+NSVDqr81fciBH8wSdnh/Pm8fOzqj6NstRQDgpecyXjShgBqQHqzINhWYrR+AFTd5T40QY1Av715nCUF4aeI8dZ/eGrtoLgd6geOFK1Oboa5zreA76x6RFjTnrl1cuh3R6taLsTheRpRq+uvqR9N6IVllhjFFbaScJtsliE9ZBETHkU6aJ2b/TEgSTRk1rbdg== X-MS-TrafficTypeDiagnostic: BY2PR02MB1299: X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1299; 31:N+NHjJZydvG/rdQElv/vZjacg0dAN8aub9VNp/rO8ZspDjdIFZEkoKlnWXX5LfMs2/nSKni/hoVlcX9YVzNBKhcYXgq/8FpFdkAlUpaF9L8PEJ7Es/K8PVI2ZZUkvcdxI+zajblPHVKJYW+WDi8luhkknu3CrXIrcePQHOdWkQlv/QWvAKL8EboWmY084/vPJQYwEL3NTjaG/EbUziFw8Tjh62b8f8Y8uLbvCScy/Rs=; 20:vinEt/xALgMLhvXHID0P73wOtb18aYcIdbhW+TLPWHqwoOHHkyNxFvwZs8oYyM8ngkbnmcQ2Lz44vVcGrX2GYT0D0TS0PSmtqLmSn5GmRmkCs1o3uOyXKcZnnWzWfuyaI1s0i/wDGkaWc4uZbeoTVI1veQZR1s5SYbLTo2qD+J0hZCi2vpFAdtJlySZE0IDRO3ezNdih5PzhkNJWa9Ke8pUVqOjBYvIMhF8hsD3bjEqHHwCruk+h7ypzySWJ10CuS+zlV+LC9p3yYPbr9LRbwlAKN8/Kbs5Xp1PrG/bdldAYE12ublw+uSCxQ/uRJ7lGCldfkXGuYZlcVx74nRIldIFg9dm5RcZAqXOVRFloSBiL9d3+z2uKYKS8mbDVi6KRCzYoGlmsjEciIdH318opPpNMpdpH8hSMYxMynhRp6Ij7LmkMpj0FImQr0gQB8zvc+dlveX6mpUxzWXmrn5+beTfOHJsMBIMOmYfuO6Xw8UK6feM1SDOxQoBHFDE1M/rZ X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040501)(2401047)(8121501046)(5005006)(3002001)(10201501046)(3231220)(944501161)(52105095)(93006095)(93004095)(6055026)(6041288)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123562045)(6072148)(201708071742011); SRVR:BY2PR02MB1299; BCL:0; PCL:0; RULEID:; SRVR:BY2PR02MB1299; X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1299; 4:e3ySsfP+rFp7bJVrGxszgSqm5+OSydjpL7suoMpX7dCaE7xQMNZuqDqsEYMVJ67y7Uc/JP2Zk1spxg70UfAmqkjZiQStkj9yHebcI5rtLbGhV6FHLZ1D+MljQnVVxXS96q4xNrYHzKDyMMHh5aIyiZRhBgBoPOe9X9UV051qhPCLBTOXNeUridZW9XMDLieLjsUr/G4WoFvmea5mCeRQJA0twIJvr1ZfkHHO+n5sbM5yZvLN5xkYc28GfD1eeMvhZS8hexTisOehjeF/U2AP5Aw3aNZlXbJaJlsVLT4CoOINc47le6Eyk/d3HSCd42aY X-Forefront-PRVS: 05961EBAFC X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR02MB1299; 23:0pJD/0p0+uq8D/UwhDPe3D8SFvmb9UEkMJLydxno/?= 1v7C2MmSyKi7hkJ0UvGW6OXJDEiCcyLa3D79hGzjE6LmPoHtUAmaq8I0m1IlWJppMDhpQkNZDAZ7y97fnPTHxTXhV2xNToaj5PikpHOAalk8ZzZ/EVDguAIzVfrMNmUnZYau6Ydhv+46vCGHDW5uaKLcd1BuVvqKSP6mryFLIU8IX2ATX6mpS8s1ZcZRYQ+6JcA9VEy9t0TkGolqvofJsoSIXxE4OZTgm0+6X/0VCH+KGEedrOYsoEXsAjiYFmEIabTyl65Feq9bx3XJdWK942SfIjv/bdpRoJ7WcHpQLvK7pbHL2uDmJEqcSvxK8+GCUSm++BYNeOptjNcMTp+Hs6nuPd4oQsPoinyYX+vHKD86LxKs+cuLkDJsSEdIF4AxVyjg23qsNLVSVAL66rVFzXqziFvqprheLAbS//5fmJasuDMq8wFWHXtgmxkuFoYicy7krZ46bo8OsUJd5vvZCvRV16dyM0iwjlEPpZzJgvOyDWhyBeDFZ9kZstbGc0BOxIDkvB9iB6v7YgdHiumYGAP/WfK5fxKQj1gm77RdhpzHeoKh0e5SM0s22S81gW2Y+X2qIkP3I1nIHk+We1pZM7QCwDOmrQY/Gxa01FY0lsQMfoui1eaRU/MZ7M7lrBfueD+M1cisrgwRSfwaWwh1FmCSn3i62ccVWfI12pMLFNYQU7qcLUuJ3LBOPRTRHOW5Hy0r+hTAdF3OQUtysGO8ODMOoUgxSE4uDq3KIxM0un57pYEeWbg3IhD0CagwDil1EQQedjsCVcUgA49nXd+adMYFt2yshAddket0EJ3UvxT6q8FEhvaMeOKRrhn26sOzfKnEwOgJk/DS24rPMSE6wkUxkmZEPjtwPvTEFc7OprbCPWCOUAx9X5gTNowYtS9//xFJ74b9VFot9wKq7N+5VkaqnbahGxP7Itd2ClCaUssCNnP2srxYIOtM7F5+TAX69Har8DijaVhQRJ6OpV7k7ihozyYqpG++N/R4vK62s2mOZNsAJ3rjD5ZpDf+U+Yz41MhgdT0j0GybZa6bd51sCDW3HbftuvZi2QE48KRYg7JUw== X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1299; 6:E8vt69EKhZQZMQSFZMt680vueJoXfHtUJNlw0063BhnT0nnp/SuuyUp7uCdbeUJcFLhXx+aeTHqs6oeMeiB9eBNX9/wXiKkTOkj2zS5hZDPnA545yGEOZTRyXGVzkwpCyvsofLNshvuix3ORtaHNwu/n54LAH66iKBUaTJZgKWj5siZueXGfohl7hWgYQvqShK3g7JoAkh2o+W1wFcCyqOmev0eb38Lm2K9SOU99dTVQs9L2aR9fQvgV6XRCUGnf7CIVGfQ3KqlmuadSHctli/FOEPO5iEyDkA7N0q2hj29Zgr8vvuirxtE4wP5g25LD5FUTDKuQ2+YBGl6sO4olk+knsrL0VcObhdfpmBSgIbQ=; 5:nIrdbqh+lTucZA0A/4s4PK+AU0EnEOpZPcC85jUPf945tgxMgsgTXf62DqIjV56Ckdh+oWXSA2T0c4OI3y6euB4SxUnu72HFt6ciuTKK/8KT4xnRUZbZ4s5KNHhxxSB9A7++ewfv9SqmFDLhAC+6sqJVsUBQGBPmz+U+3Vqcv9s=; 24:1DVlxdlRQstOXJZCjwKDHfF4p2+N+4CJpOJD3fy3dHXx7oncpBYd7qPHwr/JgMXBZ7eFGSR00qGcXJRawm2EyMISZKQJw0X/1WcLfjtfQQ0=; 7:bTqXACUxYCeIcPivY25oX41aEmwDgsfipc0nYLWsw3cBbhrn6Z40Envsbi8ts6HG345aRZ3hYrvQZIAIEvD2YrwCDNFzL48X5VkTYrkNBGZXgT8BXnEytzgW8Q8iFleb7Z583e0tnUFcK0VKGw8gTIPxe+Se9wQmypSoDViFV9lTZH1U4u3rbpUlbhluHiHg+a7Qfu9NUBqK+o5WqU/DMc6g9V5NWj0dcsIj6ceQRVYscQxyht6ruMPEEX9DZ2P4 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Feb 2018 18:57:02.3586 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 048ac950-17f5-4836-fe01-08d57e13e46d X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.100]; Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR02MB1299 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.32.85 Subject: [Qemu-devel] [PATCH v7 2/3] xlnx-zynqmp-rtc: Add basic time support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: edgar.iglesias@xilinx.com, alistair23@gmail.com, edgar.iglesias@gmail.com, f4bug@amsat.org, alistair.francis@xilinx.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Allow the guest to determine the time set from the QEMU command line. This includes adding a trace event to debug the new time. Signed-off-by: Alistair Francis Reviewed-by: Philippe Mathieu-Daudé --- V7: - Make the current_tm local to init V6: - Migrate tick_offset and add a pre_save call V5: - Recalculate tick_offset after migration V4: - Use the .unimp property V3: - Store an offset value - Use mktimegm() - Log unimplemented writes V2: - Convert DB_PRINT() macro to trace include/hw/timer/xlnx-zynqmp-rtc.h | 2 ++ hw/timer/xlnx-zynqmp-rtc.c | 58 ++++++++++++++++++++++++++++++++++++++ hw/timer/trace-events | 3 ++ 3 files changed, 63 insertions(+) diff --git a/include/hw/timer/xlnx-zynqmp-rtc.h b/include/hw/timer/xlnx-zynqmp-rtc.h index 87649836cc..5ba4d8bc4a 100644 --- a/include/hw/timer/xlnx-zynqmp-rtc.h +++ b/include/hw/timer/xlnx-zynqmp-rtc.h @@ -79,6 +79,8 @@ typedef struct XlnxZynqMPRTC { qemu_irq irq_rtc_int; qemu_irq irq_addr_error_int; + uint32_t tick_offset; + uint32_t regs[XLNX_ZYNQMP_RTC_R_MAX]; RegisterInfo regs_info[XLNX_ZYNQMP_RTC_R_MAX]; } XlnxZynqMPRTC; diff --git a/hw/timer/xlnx-zynqmp-rtc.c b/hw/timer/xlnx-zynqmp-rtc.c index 707f145027..c98dc3d94e 100644 --- a/hw/timer/xlnx-zynqmp-rtc.c +++ b/hw/timer/xlnx-zynqmp-rtc.c @@ -29,6 +29,10 @@ #include "hw/register.h" #include "qemu/bitops.h" #include "qemu/log.h" +#include "hw/ptimer.h" +#include "qemu/cutils.h" +#include "sysemu/sysemu.h" +#include "trace.h" #include "hw/timer/xlnx-zynqmp-rtc.h" #ifndef XLNX_ZYNQMP_RTC_ERR_DEBUG @@ -47,6 +51,19 @@ static void addr_error_int_update_irq(XlnxZynqMPRTC *s) qemu_set_irq(s->irq_addr_error_int, pending); } +static uint32_t rtc_get_count(XlnxZynqMPRTC *s) +{ + int64_t now = qemu_clock_get_ns(rtc_clock); + return s->tick_offset + now / NANOSECONDS_PER_SECOND; +} + +static uint64_t current_time_postr(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); + + return rtc_get_count(s); +} + static void rtc_int_status_postw(RegisterInfo *reg, uint64_t val64) { XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); @@ -97,13 +114,17 @@ static uint64_t addr_error_int_dis_prew(RegisterInfo *reg, uint64_t val64) static const RegisterAccessInfo rtc_regs_info[] = { { .name = "SET_TIME_WRITE", .addr = A_SET_TIME_WRITE, + .unimp = MAKE_64BIT_MASK(0, 32), },{ .name = "SET_TIME_READ", .addr = A_SET_TIME_READ, .ro = 0xffffffff, + .post_read = current_time_postr, },{ .name = "CALIB_WRITE", .addr = A_CALIB_WRITE, + .unimp = MAKE_64BIT_MASK(0, 32), },{ .name = "CALIB_READ", .addr = A_CALIB_READ, .ro = 0x1fffff, },{ .name = "CURRENT_TIME", .addr = A_CURRENT_TIME, .ro = 0xffffffff, + .post_read = current_time_postr, },{ .name = "CURRENT_TICK", .addr = A_CURRENT_TICK, .ro = 0xffff, },{ .name = "ALARM", .addr = A_ALARM, @@ -162,6 +183,7 @@ static void rtc_init(Object *obj) XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(obj); SysBusDevice *sbd = SYS_BUS_DEVICE(obj); RegisterInfoArray *reg_array; + struct tm current_tm; memory_region_init(&s->iomem, obj, TYPE_XLNX_ZYNQMP_RTC, XLNX_ZYNQMP_RTC_R_MAX * 4); @@ -178,14 +200,50 @@ static void rtc_init(Object *obj) sysbus_init_mmio(sbd, &s->iomem); sysbus_init_irq(sbd, &s->irq_rtc_int); sysbus_init_irq(sbd, &s->irq_addr_error_int); + + qemu_get_timedate(¤t_tm, 0); + s->tick_offset = mktimegm(¤t_tm) - + qemu_clock_get_ns(rtc_clock) / NANOSECONDS_PER_SECOND; + + trace_xlnx_zynqmp_rtc_gettime(current_tm.tm_year, current_tm.tm_mon, + current_tm.tm_mday, current_tm.tm_hour, + current_tm.tm_min, current_tm.tm_sec); +} + +static int rtc_pre_save(void *opaque) +{ + XlnxZynqMPRTC *s = opaque; + int64_t now = qemu_clock_get_ns(rtc_clock) / NANOSECONDS_PER_SECOND; + + /* Add the time at migration */ + s->tick_offset = s->tick_offset + now; + + return 0; +} + +static int rtc_post_load(void *opaque, int version_id) +{ + XlnxZynqMPRTC *s = opaque; + int64_t now = qemu_clock_get_ns(rtc_clock) / NANOSECONDS_PER_SECOND; + + /* Subtract the time after migration. This combined with the pre_save + * action results in us having subtracted the time that the guest was + * stopped to the offset. + */ + s->tick_offset = s->tick_offset - now; + + return 0; } static const VMStateDescription vmstate_rtc = { .name = TYPE_XLNX_ZYNQMP_RTC, .version_id = 1, .minimum_version_id = 1, + .pre_save = rtc_pre_save, + .post_load = rtc_post_load, .fields = (VMStateField[]) { VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPRTC, XLNX_ZYNQMP_RTC_R_MAX), + VMSTATE_UINT32(tick_offset, XlnxZynqMPRTC), VMSTATE_END_OF_LIST(), } }; diff --git a/hw/timer/trace-events b/hw/timer/trace-events index 640722b5d1..e6e042fddb 100644 --- a/hw/timer/trace-events +++ b/hw/timer/trace-events @@ -60,3 +60,6 @@ systick_write(uint64_t addr, uint32_t value, unsigned size) "systick write addr cmsdk_apb_timer_read(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB timer read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u" cmsdk_apb_timer_write(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB timer write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u" cmsdk_apb_timer_reset(void) "CMSDK APB timer: reset" + +# hw/timer/xlnx-zynqmp-rtc.c +xlnx_zynqmp_rtc_gettime(int year, int month, int day, int hour, int min, int sec) "Get time from host: %d-%d-%d %2d:%02d:%02d"