From patchwork Tue Apr 5 17:11:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antonio Borneo X-Patchwork-Id: 8755151 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 84C65C0553 for ; Tue, 5 Apr 2016 21:09:58 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BBE4720364 for ; Tue, 5 Apr 2016 21:09:57 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CB99E20351 for ; Tue, 5 Apr 2016 21:09:56 +0000 (UTC) Received: from localhost ([::1]:39322 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anYEW-00087n-6A for patchwork-qemu-devel@patchwork.kernel.org; Tue, 05 Apr 2016 17:09:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56257) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anUWz-00047m-Ea for qemu-devel@nongnu.org; Tue, 05 Apr 2016 13:12:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1anUWw-0002PN-HZ for qemu-devel@nongnu.org; Tue, 05 Apr 2016 13:12:45 -0400 Received: from mail-wm0-x236.google.com ([2a00:1450:400c:c09::236]:33271) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anUWw-0002PJ-71 for qemu-devel@nongnu.org; Tue, 05 Apr 2016 13:12:42 -0400 Received: by mail-wm0-x236.google.com with SMTP id f198so40933327wme.0 for ; Tue, 05 Apr 2016 10:12:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=M+GFZPGixHAdN5xE1izR+5MKDpav4WW2r2DXJ3D7Ats=; b=mWoJjQy1spljI+ZQiFe3VmNZcq2wnSHimT1Bs/OkHOGKED9II4tt1yM6St8+QGKpEh 3F3lYTE4NGUYxek8WGtdFIyI8gxSwd2LZnRcOIr2PYGVKrpsVQpBFkMpYyTiVCzDxeJ4 hPVhfy5JdYJUvyjmoyUdLZWeg2jdFLj/RmJt4/CtBv+9s1fbq+3RnChHdYBd19P1BApT cY2nRfXTWNeuu8Qjpv9j2TB/u46n23Yr3wK0ePmPVWTzn7xZ6cimTe/RJ3zobyWsWpA/ 7CoDom3/M1aXshhMJh3It6WuSlVF7xA2USPrmkxDKMKGtmLuhfXyT51pCS21lsQAJ8F+ xrYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=M+GFZPGixHAdN5xE1izR+5MKDpav4WW2r2DXJ3D7Ats=; b=WM2JeRevW8XzlDb7eWGn+4YosvJxM0gtm2g3OOOwjYSJX/ea6XiTPnT9V3HHLtBgW5 6DUZrsm3wA/pzfBykWLNT+hDPyVpdDVHsvGvUcJQoQ8PzLhOblMpq3Z2tKkX5eQZ41qq /RFFRgkhRs8dafXsykTE8HKh6rHNHQmSMnoADGfcuGoOw9aT3r2MEeiRsnfmIjsquky/ cPSzq2yIUWUiyAFQKWmvv80LO1g0npIBwnZ8DWk1ANmC3gYrS8bEcpC81ewmq2da5VtR yn4J6gL1EWrz2cyW7fOl+hotLX1r+BpZJ6GEyMkscEmRAprxvxaEkhUVa6JlT6P8cgiX F2yg== X-Gm-Message-State: AD7BkJLHskhwkf4NXkkXgrPOf2Hk+ROcTn7j2O8JU7eLhzTTTpbWg1BVcCoo9tjHkmeXtw== X-Received: by 10.28.30.79 with SMTP id e76mr19861332wme.27.1459876361397; Tue, 05 Apr 2016 10:12:41 -0700 (PDT) Received: from localhost ([158.110.27.95]) by smtp.gmail.com with ESMTPSA id wr2sm35736451wjc.49.2016.04.05.10.12.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Apr 2016 10:12:40 -0700 (PDT) From: Antonio Borneo To: "Michael S. Tsirkin" , Paolo Bonzini , Richard Henderson , Eduardo Habkost Date: Tue, 5 Apr 2016 19:11:28 +0200 Message-Id: <1459876288-1640-1-git-send-email-borneo.antonio@gmail.com> X-Mailer: git-send-email 2.8.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::236 X-Mailman-Approved-At: Tue, 05 Apr 2016 17:09:36 -0400 Cc: Antonio Borneo , Sebastian Andrzej Siewior , qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH] hw/i386: add device tree support 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP With "-dtb" on command-line: - append the device tree blob to the kernel image; - pass the blob's pointer to the kernel through setup_data, as requested by upstream kernel commit da6b737b9ab7 ("x86: Add device tree support"). The device tree blob is passed as-is to the guest; none of its fields is modified nor updated. This is not an issue; the kernel commit above uses the device tree only as an extension to the traditional kernel configuration. To: "Michael S. Tsirkin" To: Paolo Bonzini To: Richard Henderson To: Eduardo Habkost Cc: qemu-devel@nongnu.org Cc: Sebastian Andrzej Siewior Signed-off-by: Antonio Borneo --- Hi, I'm not expert on the x86 memory map at boot and during kernel boot; I found easy to just append the dtb to the kernel image. From my tests this patch is working fine. If you have any hint for a different loading address for dtb, I would be glad to modify this code. Regards, Antonio hw/i386/pc.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 2ac97c4..d928b90 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -813,11 +813,26 @@ static long get_file_size(FILE *f) return size; } +/* setup_data types */ +#define SETUP_NONE 0 +#define SETUP_E820_EXT 1 +#define SETUP_DTB 2 +#define SETUP_PCI 3 +#define SETUP_EFI 4 + +struct setup_data { + uint64_t next; + uint32_t type; + uint32_t len; + uint8_t data[0]; +} __attribute__((packed)); + static void load_linux(PCMachineState *pcms, FWCfgState *fw_cfg) { uint16_t protocol; int setup_size, kernel_size, initrd_size = 0, cmdline_size; + int dtb_size, setup_data_offset; uint32_t initrd_max; uint8_t header[8192], *setup, *kernel, *initrd_data; hwaddr real_addr, prot_addr, cmdline_addr, initrd_addr = 0; @@ -825,8 +840,10 @@ static void load_linux(PCMachineState *pcms, char *vmode; MachineState *machine = MACHINE(pcms); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + struct setup_data *setup_data; const char *kernel_filename = machine->kernel_filename; const char *initrd_filename = machine->initrd_filename; + const char *dtb_filename = machine->dtb; const char *kernel_cmdline = machine->kernel_cmdline; /* Align to 16 bytes as a paranoia measure */ @@ -989,6 +1006,35 @@ static void load_linux(PCMachineState *pcms, exit(1); } fclose(f); + + /* append dtb to kernel */ + if (dtb_filename) { + if (protocol < 0x209) { + fprintf(stderr, "qemu: Linux kernel too old to load a dtb\n"); + exit(1); + } + + dtb_size = get_image_size(dtb_filename); + if (dtb_size <= 0) { + fprintf(stderr, "qemu: error reading dtb %s: %s\n", + dtb_filename, strerror(errno)); + exit(1); + } + + setup_data_offset = QEMU_ALIGN_UP(kernel_size, 16); + kernel_size = setup_data_offset + sizeof(struct setup_data) + dtb_size; + kernel = g_realloc(kernel, kernel_size); + + stq_p(header+0x250, prot_addr + setup_data_offset); + + setup_data = (struct setup_data *)(kernel + setup_data_offset); + setup_data->next = 0; + setup_data->type = cpu_to_le32(SETUP_DTB); + setup_data->len = cpu_to_le32(dtb_size); + + load_image(dtb_filename, setup_data->data); + } + memcpy(setup, header, MIN(sizeof(header), setup_size)); fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, prot_addr);