From patchwork Fri Sep 20 13:39:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Sakoman X-Patchwork-Id: 49364 X-Patchwork-Delegate: steve@sakoman.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1757AC7884F for ; Fri, 20 Sep 2024 13:39:40 +0000 (UTC) Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) by mx.groups.io with SMTP id smtpd.web11.18282.1726839579052610476 for ; Fri, 20 Sep 2024 06:39:39 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@sakoman-com.20230601.gappssmtp.com header.s=20230601 header.b=CFhYRko4; spf=softfail (domain: sakoman.com, ip: 209.85.210.169, mailfrom: steve@sakoman.com) Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-71957eb256bso1729834b3a.3 for ; Fri, 20 Sep 2024 06:39:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakoman-com.20230601.gappssmtp.com; s=20230601; t=1726839578; x=1727444378; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=OqNMU1kc40UysLixlmKUqzDBnAZNTUKqjCHkaYTw9DM=; b=CFhYRko4xpBvpa3Ixf/GDeY15pdC6ycwByjtcR1qYSUTHdlIcZNJQs37s2bAmB7eUE MgaOiSDVbNr+XDW3qSErytBgeEPIWxnjLNXFnfLtGhxrbV5csTnKW9FIgrkq0wGKClQN lcz7LvlWKOddXAZdbRpdV5EQCsaP8Cq3TsqeTFs4yNrpCbWqFvX+MhdtvxLvmt8NVnHh 9MWY1EOMu1S5pSPIDui6MC4bwF6W9EILqCUgeGKjsLMDoJHxoEiq9KunLS/aq6urWunZ A9TvkUrzl3MGJHmdM2p/lcN+nUqxkqTFmvYkv9yPghfoKXp/tzoIQ8vpM3MCASwGHsOr RgtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726839578; x=1727444378; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OqNMU1kc40UysLixlmKUqzDBnAZNTUKqjCHkaYTw9DM=; b=m72StTglGxM29u3g6DSCAOsIg3VYevc+IF/QPhA3Y4GM/qF+qjRK9x2E3sRGPLZQhz mQod5MwkdjxOCcBMIweSxCIIebb04ELXd0mOto0tlQZDUK/h/haK7hVuZVVLyAyG5WI6 GNbab3xTryK3JDhVuslctPxdHWCwfFZejwcTvYkiYEW5uuUKIEIpfOP2uVHaddv7lof5 yxSg0Iv56D09AI4mnmKxhVrQQ71wVUXO2KrjLh9h1doC+G0xpduOHfjLxBSuAJRzMt5+ UbyCZ2Z0BoMNP8y3bXXTjFbVtZkYheYFp5qF3rydVdvtYDqA3FwRxtiIHo4MGHmc4n5R lLzQ== X-Gm-Message-State: AOJu0YzkO6+Be3+UF/qjWJT9tqDNYFuqandzJZ4wtw8ZtRBlP6oaG1Hx KYCIMWPp+BsaEWsbZhYQEeUiZNO4Oc3b1rNshXOidtXRMCoMKNKYDPfNdQoo2bE9B3HNPzHvLPA j X-Google-Smtp-Source: AGHT+IGeH2Vd7l+La9x/XQI9EJA2FUhUQVf9xYWsFW35Hb12fTkETGa5CWBlnvFXKi7Y0h1jEcZdEg== X-Received: by 2002:a05:6a20:8814:b0:1d3:e4e:ff55 with SMTP id adf61e73a8af0-1d30e4effe7mr2499478637.7.1726839578048; Fri, 20 Sep 2024 06:39:38 -0700 (PDT) Received: from hexa.. ([98.142.47.158]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71944b97e45sm9811846b3a.164.2024.09.20.06.39.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Sep 2024 06:39:37 -0700 (PDT) From: Steve Sakoman To: openembedded-core@lists.openembedded.org Subject: [OE-core][scarthgap 10/16] qemu: back port patches to fix riscv64 build failure Date: Fri, 20 Sep 2024 06:39:08 -0700 Message-Id: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 20 Sep 2024 13:39:40 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/204749 From: Chen Qi Backport patches to fix riscv64 build failure. Signed-off-by: Chen Qi Signed-off-by: Steve Sakoman --- meta/recipes-devtools/qemu/qemu.inc | 3 + ...kvm-change-KVM_REG_RISCV_FP_F-to-u32.patch | 75 ++++++++++++ ...kvm-change-KVM_REG_RISCV_FP_D-to-u64.patch | 73 ++++++++++++ ...cv-kvm-change-timer-regs-size-to-u64.patch | 107 ++++++++++++++++++ 4 files changed, 258 insertions(+) create mode 100644 meta/recipes-devtools/qemu/qemu/0001-target-riscv-kvm-change-KVM_REG_RISCV_FP_F-to-u32.patch create mode 100644 meta/recipes-devtools/qemu/qemu/0002-target-riscv-kvm-change-KVM_REG_RISCV_FP_D-to-u64.patch create mode 100644 meta/recipes-devtools/qemu/qemu/0003-target-riscv-kvm-change-timer-regs-size-to-u64.patch diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc index a1d8a309a0..e9f63b9eaf 100644 --- a/meta/recipes-devtools/qemu/qemu.inc +++ b/meta/recipes-devtools/qemu/qemu.inc @@ -49,6 +49,9 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \ file://CVE-2024-7409-0002.patch \ file://CVE-2024-7409-0003.patch \ file://CVE-2024-7409-0004.patch \ + file://0001-target-riscv-kvm-change-KVM_REG_RISCV_FP_F-to-u32.patch \ + file://0002-target-riscv-kvm-change-KVM_REG_RISCV_FP_D-to-u64.patch \ + file://0003-target-riscv-kvm-change-timer-regs-size-to-u64.patch \ " UPSTREAM_CHECK_REGEX = "qemu-(?P\d+(\.\d+)+)\.tar" diff --git a/meta/recipes-devtools/qemu/qemu/0001-target-riscv-kvm-change-KVM_REG_RISCV_FP_F-to-u32.patch b/meta/recipes-devtools/qemu/qemu/0001-target-riscv-kvm-change-KVM_REG_RISCV_FP_F-to-u32.patch new file mode 100644 index 0000000000..39a6a85162 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/0001-target-riscv-kvm-change-KVM_REG_RISCV_FP_F-to-u32.patch @@ -0,0 +1,75 @@ +From bbdcc89678daa5cb131ef22a6cd41a5f7f9dcea9 Mon Sep 17 00:00:00 2001 +From: Daniel Henrique Barboza +Date: Fri, 8 Dec 2023 15:38:31 -0300 +Subject: [PATCH 1/3] target/riscv/kvm: change KVM_REG_RISCV_FP_F to u32 + +KVM_REG_RISCV_FP_F regs have u32 size according to the API, but by using +kvm_riscv_reg_id() in RISCV_FP_F_REG() we're returning u64 sizes when +running with TARGET_RISCV64. The most likely reason why no one noticed +this is because we're not implementing kvm_cpu_synchronize_state() in +RISC-V yet. + +Create a new helper that returns a KVM ID with u32 size and use it in +RISCV_FP_F_REG(). + +Reported-by: Andrew Jones +Signed-off-by: Daniel Henrique Barboza +Reviewed-by: Andrew Jones +Message-ID: <20231208183835.2411523-2-dbarboza@ventanamicro.com> +Signed-off-by: Alistair Francis +(cherry picked from commit 49c211ffca00fdf7c0c29072c224e88527a14838) +Signed-off-by: Michael Tokarev + +Upstream-Status: Backport [bbdcc89678daa5cb131ef22a6cd41a5f7f9dcea9] + +Signed-off-by: Chen Qi +--- + target/riscv/kvm/kvm-cpu.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c +index c1675158fe..2eef2be86a 100644 +--- a/target/riscv/kvm/kvm-cpu.c ++++ b/target/riscv/kvm/kvm-cpu.c +@@ -72,6 +72,11 @@ static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type, + return id; + } + ++static uint64_t kvm_riscv_reg_id_u32(uint64_t type, uint64_t idx) ++{ ++ return KVM_REG_RISCV | KVM_REG_SIZE_U32 | type | idx; ++} ++ + #define RISCV_CORE_REG(env, name) kvm_riscv_reg_id(env, KVM_REG_RISCV_CORE, \ + KVM_REG_RISCV_CORE_REG(name)) + +@@ -81,7 +86,7 @@ static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type, + #define RISCV_TIMER_REG(env, name) kvm_riscv_reg_id(env, KVM_REG_RISCV_TIMER, \ + KVM_REG_RISCV_TIMER_REG(name)) + +-#define RISCV_FP_F_REG(env, idx) kvm_riscv_reg_id(env, KVM_REG_RISCV_FP_F, idx) ++#define RISCV_FP_F_REG(idx) kvm_riscv_reg_id_u32(KVM_REG_RISCV_FP_F, idx) + + #define RISCV_FP_D_REG(env, idx) kvm_riscv_reg_id(env, KVM_REG_RISCV_FP_D, idx) + +@@ -586,7 +591,7 @@ static int kvm_riscv_get_regs_fp(CPUState *cs) + if (riscv_has_ext(env, RVF)) { + uint32_t reg; + for (i = 0; i < 32; i++) { +- ret = kvm_get_one_reg(cs, RISCV_FP_F_REG(env, i), ®); ++ ret = kvm_get_one_reg(cs, RISCV_FP_F_REG(i), ®); + if (ret) { + return ret; + } +@@ -620,7 +625,7 @@ static int kvm_riscv_put_regs_fp(CPUState *cs) + uint32_t reg; + for (i = 0; i < 32; i++) { + reg = env->fpr[i]; +- ret = kvm_set_one_reg(cs, RISCV_FP_F_REG(env, i), ®); ++ ret = kvm_set_one_reg(cs, RISCV_FP_F_REG(i), ®); + if (ret) { + return ret; + } +-- +2.25.1 + diff --git a/meta/recipes-devtools/qemu/qemu/0002-target-riscv-kvm-change-KVM_REG_RISCV_FP_D-to-u64.patch b/meta/recipes-devtools/qemu/qemu/0002-target-riscv-kvm-change-KVM_REG_RISCV_FP_D-to-u64.patch new file mode 100644 index 0000000000..9480d3e0b5 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/0002-target-riscv-kvm-change-KVM_REG_RISCV_FP_D-to-u64.patch @@ -0,0 +1,73 @@ +From 125b95d79e746cbab6b72683b3382dd372e38c61 Mon Sep 17 00:00:00 2001 +From: Daniel Henrique Barboza +Date: Fri, 8 Dec 2023 15:38:32 -0300 +Subject: [PATCH 2/3] target/riscv/kvm: change KVM_REG_RISCV_FP_D to u64 + +KVM_REG_RISCV_FP_D regs are always u64 size. Using kvm_riscv_reg_id() in +RISCV_FP_D_REG() ends up encoding the wrong size if we're running with +TARGET_RISCV32. + +Create a new helper that returns a KVM ID with u64 size and use it with +RISCV_FP_D_REG(). + +Reported-by: Andrew Jones +Signed-off-by: Daniel Henrique Barboza +Reviewed-by: Andrew Jones +Message-ID: <20231208183835.2411523-3-dbarboza@ventanamicro.com> +Signed-off-by: Alistair Francis +(cherry picked from commit 450bd6618fda3d2e2ab02b2fce1c79efd5b66084) +Signed-off-by: Michael Tokarev + +Upstream-Status: Backport [125b95d79e746cbab6b72683b3382dd372e38c61] + +Signed-off-by: Chen Qi +--- + target/riscv/kvm/kvm-cpu.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c +index 2eef2be86a..82ed4455a5 100644 +--- a/target/riscv/kvm/kvm-cpu.c ++++ b/target/riscv/kvm/kvm-cpu.c +@@ -77,6 +77,11 @@ static uint64_t kvm_riscv_reg_id_u32(uint64_t type, uint64_t idx) + return KVM_REG_RISCV | KVM_REG_SIZE_U32 | type | idx; + } + ++static uint64_t kvm_riscv_reg_id_u64(uint64_t type, uint64_t idx) ++{ ++ return KVM_REG_RISCV | KVM_REG_SIZE_U64 | type | idx; ++} ++ + #define RISCV_CORE_REG(env, name) kvm_riscv_reg_id(env, KVM_REG_RISCV_CORE, \ + KVM_REG_RISCV_CORE_REG(name)) + +@@ -88,7 +93,7 @@ static uint64_t kvm_riscv_reg_id_u32(uint64_t type, uint64_t idx) + + #define RISCV_FP_F_REG(idx) kvm_riscv_reg_id_u32(KVM_REG_RISCV_FP_F, idx) + +-#define RISCV_FP_D_REG(env, idx) kvm_riscv_reg_id(env, KVM_REG_RISCV_FP_D, idx) ++#define RISCV_FP_D_REG(idx) kvm_riscv_reg_id_u64(KVM_REG_RISCV_FP_D, idx) + + #define KVM_RISCV_GET_CSR(cs, env, csr, reg) \ + do { \ +@@ -579,7 +584,7 @@ static int kvm_riscv_get_regs_fp(CPUState *cs) + if (riscv_has_ext(env, RVD)) { + uint64_t reg; + for (i = 0; i < 32; i++) { +- ret = kvm_get_one_reg(cs, RISCV_FP_D_REG(env, i), ®); ++ ret = kvm_get_one_reg(cs, RISCV_FP_D_REG(i), ®); + if (ret) { + return ret; + } +@@ -613,7 +618,7 @@ static int kvm_riscv_put_regs_fp(CPUState *cs) + uint64_t reg; + for (i = 0; i < 32; i++) { + reg = env->fpr[i]; +- ret = kvm_set_one_reg(cs, RISCV_FP_D_REG(env, i), ®); ++ ret = kvm_set_one_reg(cs, RISCV_FP_D_REG(i), ®); + if (ret) { + return ret; + } +-- +2.25.1 + diff --git a/meta/recipes-devtools/qemu/qemu/0003-target-riscv-kvm-change-timer-regs-size-to-u64.patch b/meta/recipes-devtools/qemu/qemu/0003-target-riscv-kvm-change-timer-regs-size-to-u64.patch new file mode 100644 index 0000000000..1ea1bcfe70 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/0003-target-riscv-kvm-change-timer-regs-size-to-u64.patch @@ -0,0 +1,107 @@ +From cbae1080988e0f1af0fb4c816205f7647f6de16f Mon Sep 17 00:00:00 2001 +From: Daniel Henrique Barboza +Date: Fri, 8 Dec 2023 15:38:33 -0300 +Subject: [PATCH 3/3] target/riscv/kvm: change timer regs size to u64 + +KVM_REG_RISCV_TIMER regs are always u64 according to the KVM API, but at +this moment we'll return u32 regs if we're running a RISCV32 target. + +Use the kvm_riscv_reg_id_u64() helper in RISCV_TIMER_REG() to fix it. + +Reported-by: Andrew Jones +Signed-off-by: Daniel Henrique Barboza +Reviewed-by: Andrew Jones +Message-ID: <20231208183835.2411523-4-dbarboza@ventanamicro.com> +Signed-off-by: Alistair Francis +(cherry picked from commit 10f86d1b845087d14b58d65dd2a6e3411d1b6529) +Signed-off-by: Michael Tokarev + +Upstream-Status: Backport [cbae1080988e0f1af0fb4c816205f7647f6de16f] + +Signed-off-by: Chen Qi +--- + target/riscv/kvm/kvm-cpu.c | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c +index 82ed4455a5..ddbe820e10 100644 +--- a/target/riscv/kvm/kvm-cpu.c ++++ b/target/riscv/kvm/kvm-cpu.c +@@ -88,7 +88,7 @@ static uint64_t kvm_riscv_reg_id_u64(uint64_t type, uint64_t idx) + #define RISCV_CSR_REG(env, name) kvm_riscv_reg_id(env, KVM_REG_RISCV_CSR, \ + KVM_REG_RISCV_CSR_REG(name)) + +-#define RISCV_TIMER_REG(env, name) kvm_riscv_reg_id(env, KVM_REG_RISCV_TIMER, \ ++#define RISCV_TIMER_REG(name) kvm_riscv_reg_id_u64(KVM_REG_RISCV_TIMER, \ + KVM_REG_RISCV_TIMER_REG(name)) + + #define RISCV_FP_F_REG(idx) kvm_riscv_reg_id_u32(KVM_REG_RISCV_FP_F, idx) +@@ -111,17 +111,17 @@ static uint64_t kvm_riscv_reg_id_u64(uint64_t type, uint64_t idx) + } \ + } while (0) + +-#define KVM_RISCV_GET_TIMER(cs, env, name, reg) \ ++#define KVM_RISCV_GET_TIMER(cs, name, reg) \ + do { \ +- int ret = kvm_get_one_reg(cs, RISCV_TIMER_REG(env, name), ®); \ ++ int ret = kvm_get_one_reg(cs, RISCV_TIMER_REG(name), ®); \ + if (ret) { \ + abort(); \ + } \ + } while (0) + +-#define KVM_RISCV_SET_TIMER(cs, env, name, reg) \ ++#define KVM_RISCV_SET_TIMER(cs, name, reg) \ + do { \ +- int ret = kvm_set_one_reg(cs, RISCV_TIMER_REG(env, name), ®); \ ++ int ret = kvm_set_one_reg(cs, RISCV_TIMER_REG(name), ®); \ + if (ret) { \ + abort(); \ + } \ +@@ -649,10 +649,10 @@ static void kvm_riscv_get_regs_timer(CPUState *cs) + return; + } + +- KVM_RISCV_GET_TIMER(cs, env, time, env->kvm_timer_time); +- KVM_RISCV_GET_TIMER(cs, env, compare, env->kvm_timer_compare); +- KVM_RISCV_GET_TIMER(cs, env, state, env->kvm_timer_state); +- KVM_RISCV_GET_TIMER(cs, env, frequency, env->kvm_timer_frequency); ++ KVM_RISCV_GET_TIMER(cs, time, env->kvm_timer_time); ++ KVM_RISCV_GET_TIMER(cs, compare, env->kvm_timer_compare); ++ KVM_RISCV_GET_TIMER(cs, state, env->kvm_timer_state); ++ KVM_RISCV_GET_TIMER(cs, frequency, env->kvm_timer_frequency); + + env->kvm_timer_dirty = true; + } +@@ -666,8 +666,8 @@ static void kvm_riscv_put_regs_timer(CPUState *cs) + return; + } + +- KVM_RISCV_SET_TIMER(cs, env, time, env->kvm_timer_time); +- KVM_RISCV_SET_TIMER(cs, env, compare, env->kvm_timer_compare); ++ KVM_RISCV_SET_TIMER(cs, time, env->kvm_timer_time); ++ KVM_RISCV_SET_TIMER(cs, compare, env->kvm_timer_compare); + + /* + * To set register of RISCV_TIMER_REG(state) will occur a error from KVM +@@ -676,7 +676,7 @@ static void kvm_riscv_put_regs_timer(CPUState *cs) + * TODO If KVM changes, adapt here. + */ + if (env->kvm_timer_state) { +- KVM_RISCV_SET_TIMER(cs, env, state, env->kvm_timer_state); ++ KVM_RISCV_SET_TIMER(cs, state, env->kvm_timer_state); + } + + /* +@@ -685,7 +685,7 @@ static void kvm_riscv_put_regs_timer(CPUState *cs) + * during the migration. + */ + if (migration_is_running(migrate_get_current()->state)) { +- KVM_RISCV_GET_TIMER(cs, env, frequency, reg); ++ KVM_RISCV_GET_TIMER(cs, frequency, reg); + if (reg != env->kvm_timer_frequency) { + error_report("Dst Hosts timer frequency != Src Hosts"); + } +-- +2.25.1 +