Stable branch for v5.10 shared between the EFI and RISC-V trees
The RISC-V EFI boot and runtime support will be merged for v5.10 via the RISC-V tree. However, it incorporates some changes that conflict with other EFI changes that are in flight, so this tag serves as a shared base that allows those conflicts to be resolved beforehand. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEnNKg2mrY9zMBdeK7wjcgfpV0+n0FAl9iNdMACgkQwjcgfpV0 +n2trwgAtERh/04Islqjl0QL95wQIK6husJ8y2OGAGHoddXjvD6MJsezQ3twafhw tr6tT8x6kyuD4NlSMeFcnaCSM2MWnUqSUdQOYQsn+HPUajnbHUKORcgcQ8tp/IQl ItiImYb4q3dKBx5WJC8ULloiogzxaj3SZlbhBfK7/Gqh4jt2aJOT0tvnmmuyz8VS wDKLGvVKBKv2adOm7fP/RcqlmcOPEBoYMUxBmcWbYuHfFKCZCGKnKics9ublVdmG jK2VLHhMpqoW3CqtaS2RL9El29Np4dqbhi6TIdP5+rD/Z2gudjlLpuMlmO6ERC3s TKDRZ6YTurfOYd1Nk9X3SBj8qGOeAw== =PxZx -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEKzw3R0RoQ7JKlDp6LhMZ81+7GIkFAl93m90THHBhbG1lckBk YWJiZWx0LmNvbQAKCRAuExnzX7sYiUspD/9QU8+X5ECPC2Z5bIxQjlooOXpUFXq8 Qri6nq/vWNnyIwVdxJbEVrRxzGQOFYdDPUk2YcbQmTp1Y+yXCy0dGSCH2ziV+80v SFqA+jVD6X1SMKxQ6SFG6OuHyHep6p+oqJIOZNdyIkPSXT7ZeAIjOOKWauEcyIAL JQ+KgXtyU98h2P3MdPTBH6yYVZJmlUQ8X1hXebxcKu5cKRU8totqn+RqrJEFkd20 Xg04twYxpM4tA+dQUyVpy0ng0xZzZpGyKt1HmsPjiPH8uv1giwjOVSa6d5Md8lQM IIoV5P02OKx94yCOfWHI7gpQUPo+7Ij4OySEOuz87FcYd3siScUQRm+ilHQ6oHbG 7uDEKWtaqW+IqFi30hQaiAllKl4FKkke4D8VZrBVucTtfYChAHKXnSVVE0Thtwy8 jevXx99BNw4+kwwIpDgIKWeCmoD+y0d2t5KDhGhySwgLOEA4xljpcRuzLZzcelra kpBaXf+M/zSixCnfYPO/OcLQE2g9BHeCKk9tY7NorhyfNqATR98d6q7OuS8Ui+ok lUOzSr1xLUdAvv6ApKES0RAfIATw8flrfJIbnDr7gboK85hAScgC2WMlZiEG4A2F gvi0o4RsHwrwMJNPn/ks7vHfqPepJwz91mTeABFQNvgKE4eJeirFBmq2Zgi2CtNo NqjPotcKvDG86A== =z9Re -----END PGP SIGNATURE----- Merge tag 'efi-riscv-shared-for-v5.10' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/efi/efi into for-next Stable branch for v5.10 shared between the EFI and RISC-V trees The RISC-V EFI boot and runtime support will be merged for v5.10 via the RISC-V tree. However, it incorporates some changes that conflict with other EFI changes that are in flight, so this tag serves as a shared base that allows those conflicts to be resolved beforehand. * tag 'efi-riscv-shared-for-v5.10' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/efi/efi: efi/libstub: arm32: Use low allocation for the uncompressed kernel efi/libstub: Export efi_low_alloc_above() to other units efi/libstub: arm32: Base FDT and initrd placement on image address efi: Rename arm-init to efi-init common for all arch include: pe.h: Add RISC-V related PE definition
This commit is contained in:
Коммит
8a3f30c431
|
@ -66,25 +66,24 @@ static inline void efifb_setup_from_dmi(struct screen_info *si, const char *opt)
|
|||
#define MAX_UNCOMP_KERNEL_SIZE SZ_32M
|
||||
|
||||
/*
|
||||
* The kernel zImage should preferably be located between 32 MB and 128 MB
|
||||
* from the base of DRAM. The min address leaves space for a maximal size
|
||||
* uncompressed image, and the max address is due to how the zImage decompressor
|
||||
* picks a destination address.
|
||||
* phys-to-virt patching requires that the physical to virtual offset fits
|
||||
* into the immediate field of an add/sub instruction, which comes down to the
|
||||
* 24 least significant bits being zero, and so the offset should be a multiple
|
||||
* of 16 MB. Since PAGE_OFFSET itself is a multiple of 16 MB, the physical
|
||||
* base should be aligned to 16 MB as well.
|
||||
*/
|
||||
#define ZIMAGE_OFFSET_LIMIT SZ_128M
|
||||
#define MIN_ZIMAGE_OFFSET MAX_UNCOMP_KERNEL_SIZE
|
||||
#define EFI_PHYS_ALIGN SZ_16M
|
||||
|
||||
/* on ARM, the FDT should be located in the first 128 MB of RAM */
|
||||
static inline unsigned long efi_get_max_fdt_addr(unsigned long dram_base)
|
||||
/* on ARM, the FDT should be located in a lowmem region */
|
||||
static inline unsigned long efi_get_max_fdt_addr(unsigned long image_addr)
|
||||
{
|
||||
return dram_base + ZIMAGE_OFFSET_LIMIT;
|
||||
return round_down(image_addr, EFI_PHYS_ALIGN) + SZ_512M;
|
||||
}
|
||||
|
||||
/* on ARM, the initrd should be loaded in a lowmem region */
|
||||
static inline unsigned long efi_get_max_initrd_addr(unsigned long dram_base,
|
||||
unsigned long image_addr)
|
||||
static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
|
||||
{
|
||||
return dram_base + SZ_512M;
|
||||
return round_down(image_addr, EFI_PHYS_ALIGN) + SZ_512M;
|
||||
}
|
||||
|
||||
struct efi_arm_entry_state {
|
||||
|
|
|
@ -65,7 +65,7 @@ efi_status_t __efi_rt_asm_wrapper(void *, const char *, ...);
|
|||
(SEGMENT_ALIGN > THREAD_ALIGN ? SEGMENT_ALIGN : THREAD_ALIGN)
|
||||
|
||||
/* on arm64, the FDT may be located anywhere in system RAM */
|
||||
static inline unsigned long efi_get_max_fdt_addr(unsigned long dram_base)
|
||||
static inline unsigned long efi_get_max_fdt_addr(unsigned long image_addr)
|
||||
{
|
||||
return ULONG_MAX;
|
||||
}
|
||||
|
@ -80,8 +80,7 @@ static inline unsigned long efi_get_max_fdt_addr(unsigned long dram_base)
|
|||
* apply to other bootloaders, and are required for some kernel
|
||||
* configurations.
|
||||
*/
|
||||
static inline unsigned long efi_get_max_initrd_addr(unsigned long dram_base,
|
||||
unsigned long image_addr)
|
||||
static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
|
||||
{
|
||||
return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ obj-$(CONFIG_EFI_EMBEDDED_FIRMWARE) += embedded-firmware.o
|
|||
fake_map-y += fake_mem.o
|
||||
fake_map-$(CONFIG_X86) += x86_fake_mem.o
|
||||
|
||||
arm-obj-$(CONFIG_EFI) := arm-init.o arm-runtime.o
|
||||
arm-obj-$(CONFIG_EFI) := efi-init.o arm-runtime.o
|
||||
obj-$(CONFIG_ARM) += $(arm-obj-y)
|
||||
obj-$(CONFIG_ARM64) += $(arm-obj-y)
|
||||
obj-$(CONFIG_EFI_CAPSULE_LOADER) += capsule-loader.o
|
||||
|
|
|
@ -113,162 +113,58 @@ void free_screen_info(struct screen_info *si)
|
|||
efi_bs_call(free_pool, si);
|
||||
}
|
||||
|
||||
static efi_status_t reserve_kernel_base(unsigned long dram_base,
|
||||
unsigned long *reserve_addr,
|
||||
unsigned long *reserve_size)
|
||||
{
|
||||
efi_physical_addr_t alloc_addr;
|
||||
efi_memory_desc_t *memory_map;
|
||||
unsigned long nr_pages, map_size, desc_size, buff_size;
|
||||
efi_status_t status;
|
||||
unsigned long l;
|
||||
|
||||
struct efi_boot_memmap map = {
|
||||
.map = &memory_map,
|
||||
.map_size = &map_size,
|
||||
.desc_size = &desc_size,
|
||||
.desc_ver = NULL,
|
||||
.key_ptr = NULL,
|
||||
.buff_size = &buff_size,
|
||||
};
|
||||
|
||||
/*
|
||||
* Reserve memory for the uncompressed kernel image. This is
|
||||
* all that prevents any future allocations from conflicting
|
||||
* with the kernel. Since we can't tell from the compressed
|
||||
* image how much DRAM the kernel actually uses (due to BSS
|
||||
* size uncertainty) we allocate the maximum possible size.
|
||||
* Do this very early, as prints can cause memory allocations
|
||||
* that may conflict with this.
|
||||
*/
|
||||
alloc_addr = dram_base + MAX_UNCOMP_KERNEL_SIZE;
|
||||
nr_pages = MAX_UNCOMP_KERNEL_SIZE / EFI_PAGE_SIZE;
|
||||
status = efi_bs_call(allocate_pages, EFI_ALLOCATE_MAX_ADDRESS,
|
||||
EFI_BOOT_SERVICES_DATA, nr_pages, &alloc_addr);
|
||||
if (status == EFI_SUCCESS) {
|
||||
if (alloc_addr == dram_base) {
|
||||
*reserve_addr = alloc_addr;
|
||||
*reserve_size = MAX_UNCOMP_KERNEL_SIZE;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
/*
|
||||
* If we end up here, the allocation succeeded but starts below
|
||||
* dram_base. This can only occur if the real base of DRAM is
|
||||
* not a multiple of 128 MB, in which case dram_base will have
|
||||
* been rounded up. Since this implies that a part of the region
|
||||
* was already occupied, we need to fall through to the code
|
||||
* below to ensure that the existing allocations don't conflict.
|
||||
* For this reason, we use EFI_BOOT_SERVICES_DATA above and not
|
||||
* EFI_LOADER_DATA, which we wouldn't able to distinguish from
|
||||
* allocations that we want to disallow.
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* If the allocation above failed, we may still be able to proceed:
|
||||
* if the only allocations in the region are of types that will be
|
||||
* released to the OS after ExitBootServices(), the decompressor can
|
||||
* safely overwrite them.
|
||||
*/
|
||||
status = efi_get_memory_map(&map);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("reserve_kernel_base(): Unable to retrieve memory map.\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
for (l = 0; l < map_size; l += desc_size) {
|
||||
efi_memory_desc_t *desc;
|
||||
u64 start, end;
|
||||
|
||||
desc = (void *)memory_map + l;
|
||||
start = desc->phys_addr;
|
||||
end = start + desc->num_pages * EFI_PAGE_SIZE;
|
||||
|
||||
/* Skip if entry does not intersect with region */
|
||||
if (start >= dram_base + MAX_UNCOMP_KERNEL_SIZE ||
|
||||
end <= dram_base)
|
||||
continue;
|
||||
|
||||
switch (desc->type) {
|
||||
case EFI_BOOT_SERVICES_CODE:
|
||||
case EFI_BOOT_SERVICES_DATA:
|
||||
/* Ignore types that are released to the OS anyway */
|
||||
continue;
|
||||
|
||||
case EFI_CONVENTIONAL_MEMORY:
|
||||
/* Skip soft reserved conventional memory */
|
||||
if (efi_soft_reserve_enabled() &&
|
||||
(desc->attribute & EFI_MEMORY_SP))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Reserve the intersection between this entry and the
|
||||
* region.
|
||||
*/
|
||||
start = max(start, (u64)dram_base);
|
||||
end = min(end, (u64)dram_base + MAX_UNCOMP_KERNEL_SIZE);
|
||||
|
||||
status = efi_bs_call(allocate_pages,
|
||||
EFI_ALLOCATE_ADDRESS,
|
||||
EFI_LOADER_DATA,
|
||||
(end - start) / EFI_PAGE_SIZE,
|
||||
&start);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("reserve_kernel_base(): alloc failed.\n");
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
||||
case EFI_LOADER_CODE:
|
||||
case EFI_LOADER_DATA:
|
||||
/*
|
||||
* These regions may be released and reallocated for
|
||||
* another purpose (including EFI_RUNTIME_SERVICE_DATA)
|
||||
* at any time during the execution of the OS loader,
|
||||
* so we cannot consider them as safe.
|
||||
*/
|
||||
default:
|
||||
/*
|
||||
* Treat any other allocation in the region as unsafe */
|
||||
status = EFI_OUT_OF_RESOURCES;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
status = EFI_SUCCESS;
|
||||
out:
|
||||
efi_bs_call(free_pool, memory_map);
|
||||
return status;
|
||||
}
|
||||
|
||||
efi_status_t handle_kernel_image(unsigned long *image_addr,
|
||||
unsigned long *image_size,
|
||||
unsigned long *reserve_addr,
|
||||
unsigned long *reserve_size,
|
||||
unsigned long dram_base,
|
||||
efi_loaded_image_t *image)
|
||||
{
|
||||
unsigned long kernel_base;
|
||||
const int slack = TEXT_OFFSET - 5 * PAGE_SIZE;
|
||||
int alloc_size = MAX_UNCOMP_KERNEL_SIZE + EFI_PHYS_ALIGN;
|
||||
unsigned long alloc_base, kernel_base;
|
||||
efi_status_t status;
|
||||
|
||||
/* use a 16 MiB aligned base for the decompressed kernel */
|
||||
kernel_base = round_up(dram_base, SZ_16M) + TEXT_OFFSET;
|
||||
|
||||
/*
|
||||
* Note that some platforms (notably, the Raspberry Pi 2) put
|
||||
* spin-tables and other pieces of firmware at the base of RAM,
|
||||
* abusing the fact that the window of TEXT_OFFSET bytes at the
|
||||
* base of the kernel image is only partially used at the moment.
|
||||
* (Up to 5 pages are used for the swapper page tables)
|
||||
* Allocate space for the decompressed kernel as low as possible.
|
||||
* The region should be 16 MiB aligned, but the first 'slack' bytes
|
||||
* are not used by Linux, so we allow those to be occupied by the
|
||||
* firmware.
|
||||
*/
|
||||
status = reserve_kernel_base(kernel_base - 5 * PAGE_SIZE, reserve_addr,
|
||||
reserve_size);
|
||||
status = efi_low_alloc_above(alloc_size, EFI_PAGE_SIZE, &alloc_base, 0x0);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("Unable to allocate memory for uncompressed kernel.\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
*image_addr = kernel_base;
|
||||
if ((alloc_base % EFI_PHYS_ALIGN) > slack) {
|
||||
/*
|
||||
* More than 'slack' bytes are already occupied at the base of
|
||||
* the allocation, so we need to advance to the next 16 MiB block.
|
||||
*/
|
||||
kernel_base = round_up(alloc_base, EFI_PHYS_ALIGN);
|
||||
efi_info("Free memory starts at 0x%lx, setting kernel_base to 0x%lx\n",
|
||||
alloc_base, kernel_base);
|
||||
} else {
|
||||
kernel_base = round_down(alloc_base, EFI_PHYS_ALIGN);
|
||||
}
|
||||
|
||||
*reserve_addr = kernel_base + slack;
|
||||
*reserve_size = MAX_UNCOMP_KERNEL_SIZE;
|
||||
|
||||
/* now free the parts that we will not use */
|
||||
if (*reserve_addr > alloc_base) {
|
||||
efi_bs_call(free_pages, alloc_base,
|
||||
(*reserve_addr - alloc_base) / EFI_PAGE_SIZE);
|
||||
alloc_size -= *reserve_addr - alloc_base;
|
||||
}
|
||||
efi_bs_call(free_pages, *reserve_addr + MAX_UNCOMP_KERNEL_SIZE,
|
||||
(alloc_size - MAX_UNCOMP_KERNEL_SIZE) / EFI_PAGE_SIZE);
|
||||
|
||||
*image_addr = kernel_base + TEXT_OFFSET;
|
||||
*image_size = 0;
|
||||
|
||||
efi_debug("image addr == 0x%lx, reserve_addr == 0x%lx\n",
|
||||
*image_addr, *reserve_addr);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -50,7 +50,6 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
|||
unsigned long *image_size,
|
||||
unsigned long *reserve_addr,
|
||||
unsigned long *reserve_size,
|
||||
unsigned long dram_base,
|
||||
efi_loaded_image_t *image)
|
||||
{
|
||||
efi_status_t status;
|
||||
|
|
|
@ -87,40 +87,6 @@ static void install_memreserve_table(void)
|
|||
efi_err("Failed to install memreserve config table!\n");
|
||||
}
|
||||
|
||||
static unsigned long get_dram_base(void)
|
||||
{
|
||||
efi_status_t status;
|
||||
unsigned long map_size, buff_size;
|
||||
unsigned long membase = EFI_ERROR;
|
||||
struct efi_memory_map map;
|
||||
efi_memory_desc_t *md;
|
||||
struct efi_boot_memmap boot_map;
|
||||
|
||||
boot_map.map = (efi_memory_desc_t **)&map.map;
|
||||
boot_map.map_size = &map_size;
|
||||
boot_map.desc_size = &map.desc_size;
|
||||
boot_map.desc_ver = NULL;
|
||||
boot_map.key_ptr = NULL;
|
||||
boot_map.buff_size = &buff_size;
|
||||
|
||||
status = efi_get_memory_map(&boot_map);
|
||||
if (status != EFI_SUCCESS)
|
||||
return membase;
|
||||
|
||||
map.map_end = map.map + map_size;
|
||||
|
||||
for_each_efi_memory_desc_in_map(&map, md) {
|
||||
if (md->attribute & EFI_MEMORY_WB) {
|
||||
if (membase > md->phys_addr)
|
||||
membase = md->phys_addr;
|
||||
}
|
||||
}
|
||||
|
||||
efi_bs_call(free_pool, map.map);
|
||||
|
||||
return membase;
|
||||
}
|
||||
|
||||
/*
|
||||
* EFI entry point for the arm/arm64 EFI stubs. This is the entrypoint
|
||||
* that is described in the PE/COFF header. Most of the code is the same
|
||||
|
@ -134,7 +100,6 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
|||
efi_status_t status;
|
||||
unsigned long image_addr;
|
||||
unsigned long image_size = 0;
|
||||
unsigned long dram_base;
|
||||
/* addr/point and size pairs for memory management*/
|
||||
unsigned long initrd_addr = 0;
|
||||
unsigned long initrd_size = 0;
|
||||
|
@ -174,13 +139,6 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
dram_base = get_dram_base();
|
||||
if (dram_base == EFI_ERROR) {
|
||||
efi_err("Failed to find DRAM base\n");
|
||||
status = EFI_LOAD_ERROR;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the command line from EFI, using the LOADED_IMAGE
|
||||
* protocol. We are going to copy the command line into the
|
||||
|
@ -218,7 +176,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
|||
status = handle_kernel_image(&image_addr, &image_size,
|
||||
&reserve_addr,
|
||||
&reserve_size,
|
||||
dram_base, image);
|
||||
image);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("Failed to relocate kernel\n");
|
||||
goto fail_free_screeninfo;
|
||||
|
@ -262,7 +220,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
|||
efi_info("Generating empty DTB\n");
|
||||
|
||||
if (!efi_noinitrd) {
|
||||
max_addr = efi_get_max_initrd_addr(dram_base, image_addr);
|
||||
max_addr = efi_get_max_initrd_addr(image_addr);
|
||||
status = efi_load_initrd(image, &initrd_addr, &initrd_size,
|
||||
ULONG_MAX, max_addr);
|
||||
if (status != EFI_SUCCESS)
|
||||
|
@ -306,7 +264,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
|||
install_memreserve_table();
|
||||
|
||||
status = allocate_new_fdt_and_exit_boot(handle, &fdt_addr,
|
||||
efi_get_max_fdt_addr(dram_base),
|
||||
efi_get_max_fdt_addr(image_addr),
|
||||
initrd_addr, initrd_size,
|
||||
cmdline_ptr, fdt_addr, fdt_size);
|
||||
if (status != EFI_SUCCESS)
|
||||
|
|
|
@ -10,9 +10,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <asm/efi.h>
|
||||
|
||||
/* error code which can't be mistaken for valid address */
|
||||
#define EFI_ERROR (~0UL)
|
||||
|
||||
/*
|
||||
* __init annotations should not be used in the EFI stub, since the code is
|
||||
* either included in the decompressor (x86, ARM) where they have no effect,
|
||||
|
@ -740,6 +737,9 @@ efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
|
|||
efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
|
||||
unsigned long max, unsigned long align);
|
||||
|
||||
efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
|
||||
unsigned long *addr, unsigned long min);
|
||||
|
||||
efi_status_t efi_relocate_kernel(unsigned long *image_addr,
|
||||
unsigned long image_size,
|
||||
unsigned long alloc_size,
|
||||
|
@ -786,7 +786,6 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
|||
unsigned long *image_size,
|
||||
unsigned long *reserve_addr,
|
||||
unsigned long *reserve_size,
|
||||
unsigned long dram_base,
|
||||
efi_loaded_image_t *image);
|
||||
|
||||
asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint,
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
*
|
||||
* Return: status code
|
||||
*/
|
||||
static efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
|
||||
unsigned long *addr, unsigned long min)
|
||||
efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
|
||||
unsigned long *addr, unsigned long min)
|
||||
{
|
||||
unsigned long map_size, desc_size, buff_size;
|
||||
efi_memory_desc_t *map;
|
||||
|
|
|
@ -55,6 +55,9 @@
|
|||
#define IMAGE_FILE_MACHINE_POWERPC 0x01f0
|
||||
#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
|
||||
#define IMAGE_FILE_MACHINE_R4000 0x0166
|
||||
#define IMAGE_FILE_MACHINE_RISCV32 0x5032
|
||||
#define IMAGE_FILE_MACHINE_RISCV64 0x5064
|
||||
#define IMAGE_FILE_MACHINE_RISCV128 0x5128
|
||||
#define IMAGE_FILE_MACHINE_SH3 0x01a2
|
||||
#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
|
||||
#define IMAGE_FILE_MACHINE_SH3E 0x01a4
|
||||
|
|
Загрузка…
Ссылка в новой задаче