From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by mx.groups.io with SMTP id smtpd.web09.11025.1615752408135178116 for ; Sun, 14 Mar 2021 13:06:48 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=hw9R+bmq; spf=pass (domain: linaro.org, ip: 209.85.221.45, mailfrom: etienne.carriere@linaro.org) Received: by mail-wr1-f45.google.com with SMTP id x13so4654095wrs.9 for ; Sun, 14 Mar 2021 13:06:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=yFVlQ1/WeeVzk3A9MHfaKMcXoSGbJYiwWA3vrSxwNVk=; b=hw9R+bmq5Eqk1ZqgLqInUXceHF47lgVn67fqP07p9pgw52paViZBvCebtxt+zpKRZQ Twr3VCK5A5pbhbeu5+e72vdCnNjY51Wh8e+0QZ4xi0IX+vih0EFTKg7dzkSh5CPJrsyv 9dH7HZa483MM/8jL81xA5VLmDtkSMXF6u3xDRlM9dSyxB2nQbZk/YpfUTTrlL8VNN3rp BW4m8ExY5EjONP8QeecnYSVR9mwjzDmD40kkOHgh7PFxVK/yngpCqJdLRYNVWX2zsavF dg0zOn49f40XhjL7lBC40AIWshH8GkoSNO/uoh+4RgXE8lYxfk2nd8/qJ8pkca4UWJSs n4ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=yFVlQ1/WeeVzk3A9MHfaKMcXoSGbJYiwWA3vrSxwNVk=; b=DkqaUJf2f+C79EzdfUBaDbKaq8jAbTgoZBNA/D2MFn1cWuJDfoBoybOajQ3A3b9syl NCrsiyBNs1ianZNFMH8bPn1IKP7Q1ofFoo+vQF7eii7hpH5KoT1+DPxFfY+vFS93zcF+ gtLC1aXnd7LQ4i2ElIsLH/bskQ76lJLEGwVm/PC+GBRV0zM371DpetWKLkLcQO7t1Opt C+e6HoONEo4AMpRsBvb02hVpXWvpl+qJp/Gj09nI52WQKqyJCaSTcqn3jAWgGuJV12HY Ywh9j8UvwsN8I0nSkOKgbyaEXF/RpZXL7cisuTGvYjwCK+U089+Ox7pPUdFwa/oNn3Yt SsCQ== X-Gm-Message-State: AOAM533vN9tNWHOSWtVShW1GLZwxO3zf9pi/g9KVayWbszGYCh2UzfC+ U9QheNRcFtMgLcT+PmKDCETim0Al34Vr1vvm X-Google-Smtp-Source: ABdhPJzSTewcwcc55x1xcaMEN2mFzvI+0NEw8zq/PhCqpM1EbNMq6/3JQCN1+m95ggRFtEh4DWEtIA== X-Received: by 2002:a5d:4307:: with SMTP id h7mr18280926wrq.227.1615752406536; Sun, 14 Mar 2021 13:06:46 -0700 (PDT) Return-Path: Received: from lmecxl0524.lme.st.com (2a01cb058b85080038d9665c555bdad2.ipv6.abo.wanadoo.fr. [2a01:cb05:8b85:800:38d9:665c:555b:dad2]) by smtp.gmail.com with ESMTPSA id b65sm10176045wmh.4.2021.03.14.13.06.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Mar 2021 13:06:46 -0700 (PDT) From: "Etienne Carriere" To: devel@edk2.groups.io Cc: Etienne Carriere Subject: [PATCH 3/5] GenGv: Arm: support images entered in Thumb mode Date: Sun, 14 Mar 2021 21:06:26 +0100 Message-Id: X-Mailer: git-send-email 2.17.1 In-Reply-To: <5a0fdcf767151d786afd8d14bff57cf6fdb8fefc.1615752383.git.etienne.carriere@linaro.org> References: <5a0fdcf767151d786afd8d14bff57cf6fdb8fefc.1615752383.git.etienne.carriere@linaro.org> In-Reply-To: <5a0fdcf767151d786afd8d14bff57cf6fdb8fefc.1615752383.git.etienne.carriere@linaro.org> References: <5a0fdcf767151d786afd8d14bff57cf6fdb8fefc.1615752383.git.etienne.carriere@linaro.org> Change GenFv for Arm architecture to generate a specific jump instruction as image entry instruction when the target entry label is assembled with Thumb instruction set. This is possible since SecCoreEntryAddress value fetched from the PE32 as its LSBit set when the entry instruction executes in Thumb mode. Signed-off-by: Etienne Carriere --- BaseTools/Source/C/GenFv/GenFvInternalLib.c | 39 ++++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.c b/BaseTools/Source/C/GenFv/GenFvInternalLib.c index 6e296b8ad6..1b12cb9165 100644 --- a/BaseTools/Source/C/GenFv/GenFvInternalLib.c +++ b/BaseTools/Source/C/GenFv/GenFvInternalLib.c @@ -34,9 +34,28 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "FvLib.h" #include "PeCoffLib.h" -#define ARMT_UNCONDITIONAL_JUMP_INSTRUCTION 0xEB000000 #define ARM64_UNCONDITIONAL_JUMP_INSTRUCTION 0x14000000 +// +// Arm instruction to jump to Fv enry instruction in Arm or Thumb mode. +// From ARM Arch Ref Manual versions b/c/d, section A8.8.25 BL, BLX (immediate) +// BLX (encoding A2) branches to offset in Thumb instruction set mode. +// BL (encoding A1) branches to offset in Arm instruction set mode. +// +#define ARM_JUMP_OFFSET_MAX 0xffffff +#define ARM_JUMP_TO_ARM(Offset) (0xeb000000 | ((Offset - 8) >> 2)) + +#define _ARM_JUMP_TO_THUMB(Imm32) (0xfa000000 | \ + (((Imm32) & (1 << 1)) << (24 - 1)) | \ + (((Imm32) >> 2) & 0x7fffff)) +#define ARM_JUMP_TO_THUMB(Offset) _ARM_JUMP_TO_THUMB((Offset) - 8) + +// +// Arm instruction to retrun from exception (MOVS PC, LR) +// +#define ARM_RETURN_FROM_EXCEPTION 0xE1B0F07E + + BOOLEAN mArm = FALSE; BOOLEAN mRiscV = FALSE; STATIC UINT32 MaxFfsAlignment = 0; @@ -2203,23 +2222,25 @@ Returns: // if we found an SEC core entry point then generate a branch instruction // to it and populate a debugger SWI entry as well if (UpdateVectorSec) { + UINT32 EntryOffset; VerboseMsg("UpdateArmResetVectorIfNeeded updating ARM SEC vector"); - // B SecEntryPoint - signed_immed_24 part +/-32MB offset - // on ARM, the PC is always 8 ahead, so we're not really jumping from the base address, but from base address + 8 - ResetVector[0] = (INT32)(SecCoreEntryAddress - FvInfo->BaseAddress - 8) >> 2; + EntryOffset = (INT32)(SecCoreEntryAddress - FvInfo->BaseAddress); - if (ResetVector[0] > 0x00FFFFFF) { - Error(NULL, 0, 3000, "Invalid", "SEC Entry point must be within 32MB of the start of the FV"); + if (EntryOffset > ARM_JUMP_OFFSET_MAX) { + Error(NULL, 0, 3000, "Invalid", "SEC Entry point offset above 1MB of the start of the FV"); return EFI_ABORTED; } - // Add opcode for an unconditional branch with no link. i.e.: " B SecEntryPoint" - ResetVector[0] |= ARMT_UNCONDITIONAL_JUMP_INSTRUCTION; + if (SecCoreEntryAddress & 1) { + ResetVector[0] = ARM_JUMP_TO_THUMB(EntryOffset); + } else { + ResetVector[0] = ARM_JUMP_TO_ARM(EntryOffset); + } // SWI handler movs pc,lr. Just in case a debugger uses SWI - ResetVector[2] = 0xE1B0F07E; + ResetVector[2] = ARM_RETURN_FROM_EXCEPTION; // Place holder to support a common interrupt handler from ROM. // Currently not supported. For this to be used the reset vector would not be in this FV -- 2.17.1