From: Youling Tang <tangyouling@loongson.cn>
To: WANG Xuerui <i.swmail@xen0n.name>
Cc: binutils@sourceware.org, Chenghua Xu <xuchenghua@loongson.cn>,
Zhensong Liu <liuzhensong@loongson.cn>
Subject: Re: [PATCH] bfd: Add support for LoongArch64 EFI (efi-*-loongarch64).
Date: Fri, 5 Aug 2022 18:07:29 +0800 [thread overview]
Message-ID: <b70f4c62-3d8f-2b43-3a0e-599d9ea77515@loongson.cn> (raw)
In-Reply-To: <24a9300d-24f9-d4cf-4b71-198d5f4da511@xen0n.name>
Hi, Xuerui
On 08/05/2022 05:41 PM, WANG Xuerui wrote:
>
> On 2022/8/5 10:26, Youling Tang wrote:
>> This adds support for efi-loongarch64 by virtue of adding a new PEI
>> target
>> pei-loongarch64. This is not a full target and only exists to support
>> EFI at
>> this time.
>>
>> This means that this target does not support relocation processing and
>> is mostly
>> a container format. This format has been added to elf based
>> loongarch64 targets
>> such that efi images can be made natively on Linux.
>>
>> However this target is not valid for use with gas but only with objcopy.
>>
>> We should't limit addresses to 32-bits for 64-bit vma, otherwise there
>> will be
>> "RVA truncated" error when using objcopy on loongarch64.
>>
>> With these changes the resulting file is recognized as an efi image.
>>
>> Any magic number is based on the Microsoft PE specification [1].
>>
>> The test results are as follows:
>> $ make check-binutils RUNTESTFLAGS='loongarch64.exp'
>> PASS: Check if efi app format is recognized
>>
>> $ objdump -h -f tmpdir/loongarch64copy.o
>> tmpdir/loongarch64copy.o: file format pei-loongarch64
>> architecture: Loongarch64, flags 0x00000132:
>> EXEC_P, HAS_SYMS, HAS_LOCALS, D_PAGED
>> start address 0x0000000000000000
>>
>> Sections:
>> Idx Name Size VMA LMA
>> File off Algn
>> 0 .text 0000003c 00000000200000b0 00000000200000b0
>> 00000200 2**2
>> CONTENTS, ALLOC, LOAD, READONLY, CODE
>>
>> [1] https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
>>
>> bfd:
>> * .gitignore (pe-loongarch64igen.c): New.
>> * Makefile.am (pei-loongarch64.lo, pe-loongarch64igen.lo,
>> pei-loongarch64.c,
>> pe-loongarch64igen.c): Add support.
>> * Makefile.in: Likewise.
>> * bfd.c (bfd_get_sign_extend_vma): Add pei-loongarch64.
>> * coff-loongarch64.c: New file.
>> * coffcode.h (coff_set_arch_mach_hook, coff_set_flags,
>> coff_write_object_contents) Add loongarch64 (loongarch64_pei_vec)
>> support.
>> * config.bfd: Likewise.
>> * configure: Likewise.
>> * configure.ac: Likewise.
>> * libpei.h (GET_OPTHDR_IMAGE_BASE, PUT_OPTHDR_IMAGE_BASE,
>> GET_OPTHDR_SIZE_OF_STACK_RESERVE, PUT_OPTHDR_SIZE_OF_STACK_RESERVE,
>> GET_OPTHDR_SIZE_OF_STACK_COMMIT, PUT_OPTHDR_SIZE_OF_STACK_COMMIT,
>> GET_OPTHDR_SIZE_OF_HEAP_RESERVE, PUT_OPTHDR_SIZE_OF_HEAP_RESERVE,
>> GET_OPTHDR_SIZE_OF_HEAP_COMMIT, PUT_OPTHDR_SIZE_OF_HEAP_COMMIT,
>> GET_PDATA_ENTRY, _bfd_peLoongArch64_bfd_copy_private_bfd_data_common,
>> _bfd_peLoongArch64_bfd_copy_private_section_data,
>> _bfd_peLoongArch64_get_symbol_info,
>> _bfd_peLoongArch64_only_swap_filehdr_out,
>> _bfd_peLoongArch64_print_private_bfd_data_common,
>> _bfd_peLoongArch64i_final_link_postscript,
>> _bfd_peLoongArch64i_only_swap_filehdr_out,
>> _bfd_peLoongArch64i_swap_aouthdr_in,
>> _bfd_peLoongArch64i_swap_aouthdr_out, _bfd_peLoongArch64i_swap_aux_in,
>> _bfd_peLoongArch64i_swap_aux_out, _bfd_peLoongArch64i_swap_lineno_in,
>> _bfd_peLoongArch64i_swap_lineno_out,
>> _bfd_peLoongArch64i_swap_scnhdr_out,
>> _bfd_peLoongArch64i_swap_sym_in, _bfd_peLoongArch64i_swap_sym_out,
>> _bfd_peLoongArch64i_swap_debugdir_in,
>> _bfd_peLoongArch64i_swap_debugdir_out,
>> _bfd_peLoongArch64i_write_codeview_record,
>> _bfd_peLoongArch64i_slurp_codeview_record,
>> _bfd_peLoongArch64_print_ce_compressed_pdata): New.
>> * peXXigen.c (_bfd_XXi_swap_aouthdr_in, _bfd_XXi_swap_aouthdr_out,
>> _bfd_XXi_swap_scnhdr_out, pe_print_pdata,
>> _bfd_XX_print_private_bfd_data_common,
>> _bfd_XX_bfd_copy_private_section_data,
>> _bfd_XXi_final_link_postscript):
>> Support COFF_WITH_peLoongArch64,
>> * pei-loongarch64.c: New file.
>> * peicode.h (coff_swap_scnhdr_in, pe_ILF_build_a_bfd,
>> pe_ILF_object_p):
>> Support COFF_WITH_peLoongArch64.
>> (jtab): Add dummy entry that traps.
>> * targets.c (loongarch64_pei_vec): New.
>>
>> binutils
>> * NEWS: Add new support.
>> * testsuite/binutils-all/loongarch64/loongarch64.exp: New file.
>> * testsuite/binutils-all/loongarch64/pei-loongarch64.d: New test.
>> * testsuite/binutils-all/loongarch64/pei-loongarch64.s: New test.
>>
>> include
>> * coff/loongarch64.h: New file.
>> * coff/pe.h (IMAGE_FILE_MACHINE_LOONGARCH64): New.
>>
>> Signed-off-by: Youling Tang <tangyouling@loongson.cn>
>> ---
>> bfd/.gitignore | 1 +
>> bfd/Makefile.am | 9 +-
>> bfd/Makefile.in | 11 +-
>> bfd/bfd.c | 1 +
>> bfd/coff-loongarch64.c | 165 ++++++++++++++++++
>> bfd/coffcode.h | 19 +-
>> bfd/config.bfd | 2 +-
>> bfd/configure | 1 +
>> bfd/configure.ac | 1 +
>> bfd/libpei.h | 36 ++++
>> bfd/peXXigen.c | 49 +++---
>> bfd/pei-loongarch64.c | 75 ++++++++
>> bfd/peicode.h | 21 ++-
>> bfd/targets.c | 2 +
>> binutils/NEWS | 3 +
>> .../binutils-all/loongarch64/loongarch64.exp | 30 ++++
>> .../loongarch64/pei-loongarch64.d | 15 ++
>> .../loongarch64/pei-loongarch64.s | 33 ++++
>> include/coff/loongarch64.h | 61 +++++++
>> include/coff/pe.h | 1 +
>> 20 files changed, 509 insertions(+), 27 deletions(-)
>> create mode 100644 bfd/coff-loongarch64.c
>> create mode 100644 bfd/pei-loongarch64.c
>> create mode 100644
>> binutils/testsuite/binutils-all/loongarch64/loongarch64.exp
>> create mode 100644
>> binutils/testsuite/binutils-all/loongarch64/pei-loongarch64.d
>> create mode 100644
>> binutils/testsuite/binutils-all/loongarch64/pei-loongarch64.s
>> create mode 100644 include/coff/loongarch64.h
>>
>> <snip>
>>
>> diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
>> index 5ab09387e72..ba12cf8cba0 100644
>> --- a/bfd/peXXigen.c
>> +++ b/bfd/peXXigen.c
>> @@ -60,9 +60,9 @@
>> on this code has a chance of getting something accomplished without
>> wasting too much time. */
>> -/* This expands into COFF_WITH_pe, COFF_WITH_pep, COFF_WITH_pex64 or
>> - COFF_WITH_peAArch64 depending on whether we're compiling for straight
>> - PE or PE+. */
>> +/* This expands into COFF_WITH_pe, COFF_WITH_pep, COFF_WITH_pex64 ,
> Nit: extra space before the comma.
my carelessness.
>> + COFF_WITH_peAArch64 or COFF_WITH_peLoongArch64 depending on
>> whether we're
>> + compiling for straight PE or PE+. */
>> #define COFF_WITH_XX
>> #include "sysdep.h"
>>
>> <snip>
>>
>> diff --git a/bfd/pei-loongarch64.c b/bfd/pei-loongarch64.c
>> new file mode 100644
>> index 00000000000..28220074157
>> --- /dev/null
>> +++ b/bfd/pei-loongarch64.c
>> @@ -0,0 +1,75 @@
>> +/* BFD back-end for LoongArch64 PE IMAGE COFF files.
>> + Copyright (C) 2022 Free Software Foundation, Inc.
>> +
>> + This file is part of BFD, the Binary File Descriptor library.
>> +
>> + This program is free software; you can redistribute it and/or modify
>> + it under the terms of the GNU General Public License as published by
>> + the Free Software Foundation; either version 3 of the License, or
>> + (at your option) any later version.
>> +
>> + This program is distributed in the hope that it will be useful,
>> + but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + GNU General Public License for more details.
>> +
>> + You should have received a copy of the GNU General Public License
>> + along with this program; if not, write to the Free Software
>> + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
>> + MA 02110-1301, USA. */
>> +
>> +#include "sysdep.h"
>> +#include "bfd.h"
>> +
>> +#define TARGET_SYM loongarch64_pei_vec
>> +#define TARGET_NAME "pei-loongarch64"
>> +#define TARGET_ARCHITECTURE bfd_arch_loongarch
>> +#define TARGET_PAGESIZE 0x4000
>> +#define TARGET_BIG_ENDIAN 0
>> +#define TARGET_ARCHIVE 0
>> +#define TARGET_PRIORITY 0
>> +
>> +#define COFF_IMAGE_WITH_PE
>> +/* Rename the above into.. */
> I know this is copied from bfd/pei-aarch64.c, but you could reformat it
> a little by adding an additional period and space, for style consistency.
In the previous macro definition, I used tab alignment. Do you want to
use space alignment?
>> +#define COFF_WITH_peLoongArch64
>> +#define COFF_WITH_PE
>> +#define PCRELOFFSET true
>> +
>> +/* Long section names not allowed in executable images, only object
>> files. */
>> +#define COFF_LONG_SECTION_NAMES 0
>> +
>> +#define COFF_SECTION_ALIGNMENT_ENTRIES \
>> +{ COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
>> +{ COFF_SECTION_NAME_EXACT_MATCH (".data"), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
>> +{ COFF_SECTION_NAME_EXACT_MATCH (".rdata"), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
>> +{ COFF_SECTION_NAME_EXACT_MATCH (".text"), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
>> +{ COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
>> +{ COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
>> +{ COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
>> +{ COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi."), \
>> + COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
>> +
>> +#define PEI_HEADERS
>> +#include "sysdep.h"
>> +#include "bfd.h"
>> +#include "libbfd.h"
>> +#include "coff/loongarch64.h"
>> +#include "coff/internal.h"
>> +#include "coff/pe.h"
>> +#include "libcoff.h"
>> +#include "libpei.h"
>> +#include "libiberty.h"
>> +
>> +/* Make sure we're setting a 64-bit format. */
>> +#undef AOUTSZ
>> +#define AOUTSZ PEPAOUTSZ
>> +#define PEAOUTHDR PEPAOUTHDR
>> +
>> +#include "coff-loongarch64.c"
>> diff --git a/bfd/peicode.h b/bfd/peicode.h
>> index 02573c84694..a337493994c 100644
>> --- a/bfd/peicode.h
>> +++ b/bfd/peicode.h
>> @@ -231,7 +231,7 @@ coff_swap_scnhdr_in (bfd * abfd, void * ext, void
>> * in)
>> {
>> scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
>> /* Do not cut upper 32-bits for 64-bit vma. */
>> -#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
>> +#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) &&
>> !defined(COFF_WITH_peLoongArch64)
>> scnhdr_int->s_vaddr &= 0xffffffff;
>> #endif
>> }
>> @@ -763,6 +763,17 @@ static const jump_table jtab[] =
>> 16, 12
>> },
>> #endif
>> +
>> +#ifdef LOONGARCH64MAGIC
>> +/* We don't currently support jumping to DLLs, so if
>> + someone does try emit a runtime trap. Through UDF #0. */
>> + { LOONGARCH64MAGIC,
>> + { 0x00, 0x00, 0x00, 0x00 },
> I think "UDF #0" is an ARM instruction. Here I think we could use a
> "BREAK 0" or something like that instead... The instruction word for
> BREAK 0 is 0x002a0000, FYI.
Thanks for the suggestion, I will use the "break 0" instruction.
>> + 4, 0
>> + },
>> +
>> +#endif
>> +
>> { 0, { 0 }, 0, 0 }
>> };
>> @@ -920,7 +931,7 @@ pe_ILF_build_a_bfd (bfd * abfd,
>> /* See PR 20907 for a reproducer. */
>> goto error_return;
>> -#if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)
>> +#if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) ||
>> defined(COFF_WITH_peLoongArch64)
>> ((unsigned int *) id4->contents)[0] = ordinal;
>> ((unsigned int *) id4->contents)[1] = 0x80000000;
>> ((unsigned int *) id5->contents)[0] = ordinal;
>> @@ -1222,6 +1233,12 @@ pe_ILF_object_p (bfd * abfd)
>> #endif
>> break;
>> + case IMAGE_FILE_MACHINE_LOONGARCH64:
>> +#ifdef LOONGARCH64MAGIC
>> + magic = LOONGARCH64MAGIC;
>> +#endif
>> + break;
>> +
>> case IMAGE_FILE_MACHINE_THUMB:
>> #ifdef THUMBPEMAGIC
>> {
>> diff --git a/bfd/targets.c b/bfd/targets.c
>> index 3284bb88aa8..8ad3ef366ce 100644
>> --- a/bfd/targets.c
>> +++ b/bfd/targets.c
>> @@ -768,6 +768,7 @@ extern const bfd_target lm32_elf32_vec;
>> extern const bfd_target lm32_elf32_fdpic_vec;
>> extern const bfd_target loongarch_elf64_vec;
>> extern const bfd_target loongarch_elf32_vec;
>> +extern const bfd_target loongarch64_pei_vec;
>> extern const bfd_target m32c_elf32_vec;
>> extern const bfd_target m32r_elf32_vec;
>> extern const bfd_target m32r_elf32_le_vec;
>> @@ -1358,6 +1359,7 @@ static const bfd_target * const
>> _bfd_target_vector[] =
>> #ifdef BFD64
>> &loongarch_elf32_vec,
>> &loongarch_elf64_vec,
>> + &loongarch64_pei_vec,
>> #endif
>> #endif /* not SELECT_VECS */
>> diff --git a/binutils/NEWS b/binutils/NEWS
>> index 4fdf1c3b4e8..3b5a96b9819 100644
>> --- a/binutils/NEWS
>> +++ b/binutils/NEWS
>> @@ -14,6 +14,9 @@ Changes in 2.39:
>> architectures. Use the --disassembler-color=MODE command line
>> flag, with
>> mode being either off, color, or extended-color.
>> +* Support for pei-loongarch64 has been added to objcopy in order to
>> enable
>> + UEFI development using binutils.
>> +
> Isn't binutils 2.39 already frozen?
I will add to the next version.
Thanks,
Youling
next prev parent reply other threads:[~2022-08-05 10:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-05 2:26 Youling Tang
2022-08-05 9:41 ` WANG Xuerui
2022-08-05 10:07 ` Youling Tang [this message]
2022-08-05 10:22 ` WANG Xuerui
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b70f4c62-3d8f-2b43-3a0e-599d9ea77515@loongson.cn \
--to=tangyouling@loongson.cn \
--cc=binutils@sourceware.org \
--cc=i.swmail@xen0n.name \
--cc=liuzhensong@loongson.cn \
--cc=xuchenghua@loongson.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).