mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
Merge 3ee3723b40 ("Merge tag 'm68k-for-v5.8-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k") into android-mainline
Steps along the way to 5.8-rc1 Change-Id: I9b3945d9f149835b7db64d8eba015d8de4160013 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
6103983f46
|
|
@ -1748,6 +1748,13 @@
|
|||
|
||||
initrd= [BOOT] Specify the location of the initial ramdisk
|
||||
|
||||
initrdmem= [KNL] Specify a physical address and size from which to
|
||||
load the initrd. If an initrd is compiled in or
|
||||
specified in the bootparams, it takes priority over this
|
||||
setting.
|
||||
Format: ss[KMG],nn[KMG]
|
||||
Default is 0, 0
|
||||
|
||||
init_on_alloc= [MM] Fill newly allocated pages and heap objects with
|
||||
zeroes.
|
||||
Format: 0 | 1
|
||||
|
|
|
|||
|
|
@ -5,8 +5,9 @@ Memory Protection Keys
|
|||
======================
|
||||
|
||||
Memory Protection Keys for Userspace (PKU aka PKEYs) is a feature
|
||||
which is found on Intel's Skylake "Scalable Processor" Server CPUs.
|
||||
It will be avalable in future non-server parts.
|
||||
which is found on Intel's Skylake (and later) "Scalable Processor"
|
||||
Server CPUs. It will be available in future non-server Intel parts
|
||||
and future AMD processors.
|
||||
|
||||
For anyone wishing to test or use this feature, it is available in
|
||||
Amazon's EC2 C5 instances and is known to work there using an Ubuntu
|
||||
|
|
|
|||
|
|
@ -2,8 +2,10 @@
|
|||
What is efifb?
|
||||
==============
|
||||
|
||||
This is a generic EFI platform driver for Intel based Apple computers.
|
||||
efifb is only for EFI booted Intel Macs.
|
||||
This is a generic EFI platform driver for systems with UEFI firmware. The
|
||||
system must be booted via the EFI stub for this to be usable. efifb supports
|
||||
both firmware with Graphics Output Protocol (GOP) displays as well as older
|
||||
systems with only Universal Graphics Adapter (UGA) displays.
|
||||
|
||||
Supported Hardware
|
||||
==================
|
||||
|
|
@ -12,11 +14,14 @@ Supported Hardware
|
|||
- Macbook
|
||||
- Macbook Pro 15"/17"
|
||||
- MacMini
|
||||
- ARM/ARM64/X86 systems with UEFI firmware
|
||||
|
||||
How to use it?
|
||||
==============
|
||||
|
||||
efifb does not have any kind of autodetection of your machine.
|
||||
For UGA displays, efifb does not have any kind of autodetection of your
|
||||
machine.
|
||||
|
||||
You have to add the following kernel parameters in your elilo.conf::
|
||||
|
||||
Macbook :
|
||||
|
|
@ -28,6 +33,9 @@ You have to add the following kernel parameters in your elilo.conf::
|
|||
Macbook Pro 17", iMac 20" :
|
||||
video=efifb:i20
|
||||
|
||||
For GOP displays, efifb can autodetect the display's resolution and framebuffer
|
||||
address, so these should work out of the box without any special parameters.
|
||||
|
||||
Accepted options:
|
||||
|
||||
======= ===========================================================
|
||||
|
|
@ -36,4 +44,28 @@ nowc Don't map the framebuffer write combined. This can be used
|
|||
when large amounts of console data are written.
|
||||
======= ===========================================================
|
||||
|
||||
Options for GOP displays:
|
||||
|
||||
mode=n
|
||||
The EFI stub will set the mode of the display to mode number n if
|
||||
possible.
|
||||
|
||||
<xres>x<yres>[-(rgb|bgr|<bpp>)]
|
||||
The EFI stub will search for a display mode that matches the specified
|
||||
horizontal and vertical resolution, and optionally bit depth, and set
|
||||
the mode of the display to it if one is found. The bit depth can either
|
||||
"rgb" or "bgr" to match specifically those pixel formats, or a number
|
||||
for a mode with matching bits per pixel.
|
||||
|
||||
auto
|
||||
The EFI stub will choose the mode with the highest resolution (product
|
||||
of horizontal and vertical resolution). If there are multiple modes
|
||||
with the highest resolution, it will choose one with the highest color
|
||||
depth.
|
||||
|
||||
list
|
||||
The EFI stub will list out all the display modes that are available. A
|
||||
specific mode can then be chosen using one of the above options for the
|
||||
next boot.
|
||||
|
||||
Edgar Hucek <gimli@dark-green.com>
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ More details follow::
|
|||
|
|
||||
|
|
||||
v
|
||||
disable_nonboot_cpus()
|
||||
freeze_secondary_cpus()
|
||||
/* start */
|
||||
|
|
||||
v
|
||||
|
|
@ -83,7 +83,7 @@ More details follow::
|
|||
Release cpu_add_remove_lock
|
||||
|
|
||||
v
|
||||
/* disable_nonboot_cpus() complete */
|
||||
/* freeze_secondary_cpus() complete */
|
||||
|
|
||||
v
|
||||
Do suspend
|
||||
|
|
@ -93,7 +93,7 @@ More details follow::
|
|||
Resuming back is likewise, with the counterparts being (in the order of
|
||||
execution during resume):
|
||||
|
||||
* enable_nonboot_cpus() which involves::
|
||||
* thaw_secondary_cpus() which involves::
|
||||
|
||||
| Acquire cpu_add_remove_lock
|
||||
| Decrease cpu_hotplug_disabled, thereby enabling regular cpu hotplug
|
||||
|
|
|
|||
|
|
@ -1955,7 +1955,7 @@ config EFI
|
|||
select UCS2_STRING
|
||||
select EFI_PARAMS_FROM_FDT
|
||||
select EFI_STUB
|
||||
select EFI_ARMSTUB
|
||||
select EFI_GENERIC_STUB
|
||||
select EFI_RUNTIME_WRAPPERS
|
||||
---help---
|
||||
This option provides support for runtime services provided
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ optional_header:
|
|||
.long __pecoff_code_size @ SizeOfCode
|
||||
.long __pecoff_data_size @ SizeOfInitializedData
|
||||
.long 0 @ SizeOfUninitializedData
|
||||
.long efi_entry - start @ AddressOfEntryPoint
|
||||
.long efi_pe_entry - start @ AddressOfEntryPoint
|
||||
.long start_offset @ BaseOfCode
|
||||
.long __pecoff_data_start - start @ BaseOfData
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ SECTIONS
|
|||
* The EFI stub always executes from RAM, and runs strictly before the
|
||||
* decompressor, so we can make an exception for its r/w data, and keep it
|
||||
*/
|
||||
*(.data.efistub)
|
||||
*(.data.efistub .bss.efistub)
|
||||
__pecoff_data_end = .;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -50,14 +50,6 @@ void efi_virtmap_unload(void);
|
|||
|
||||
/* arch specific definitions used by the stub code */
|
||||
|
||||
#define efi_bs_call(func, ...) efi_system_table()->boottime->func(__VA_ARGS__)
|
||||
#define efi_rt_call(func, ...) efi_system_table()->runtime->func(__VA_ARGS__)
|
||||
#define efi_is_native() (true)
|
||||
|
||||
#define efi_table_attr(inst, attr) (inst->attr)
|
||||
|
||||
#define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
|
||||
|
||||
struct screen_info *alloc_screen_info(void);
|
||||
void free_screen_info(struct screen_info *si);
|
||||
|
||||
|
|
|
|||
|
|
@ -1811,7 +1811,7 @@ config EFI
|
|||
select EFI_PARAMS_FROM_FDT
|
||||
select EFI_RUNTIME_WRAPPERS
|
||||
select EFI_STUB
|
||||
select EFI_ARMSTUB
|
||||
select EFI_GENERIC_STUB
|
||||
default y
|
||||
help
|
||||
This option provides support for runtime services provided
|
||||
|
|
|
|||
|
|
@ -86,14 +86,6 @@ static inline unsigned long efi_get_max_initrd_addr(unsigned long dram_base,
|
|||
return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
|
||||
}
|
||||
|
||||
#define efi_bs_call(func, ...) efi_system_table()->boottime->func(__VA_ARGS__)
|
||||
#define efi_rt_call(func, ...) efi_system_table()->runtime->func(__VA_ARGS__)
|
||||
#define efi_is_native() (true)
|
||||
|
||||
#define efi_table_attr(inst, attr) (inst->attr)
|
||||
|
||||
#define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
|
||||
|
||||
#define alloc_screen_info(x...) &screen_info
|
||||
|
||||
static inline void free_screen_info(struct screen_info *si)
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
SYM_CODE_START(efi_enter_kernel)
|
||||
/*
|
||||
* efi_entry() will have copied the kernel image if necessary and we
|
||||
* efi_pe_entry() will have copied the kernel image if necessary and we
|
||||
* end up here with device tree address in x1 and the kernel entry
|
||||
* point stored in x0. Save those values in registers which are
|
||||
* callee preserved.
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ optional_header:
|
|||
.long __initdata_begin - efi_header_end // SizeOfCode
|
||||
.long __pecoff_data_size // SizeOfInitializedData
|
||||
.long 0 // SizeOfUninitializedData
|
||||
.long __efistub_efi_entry - _head // AddressOfEntryPoint
|
||||
.long __efistub_efi_pe_entry - _head // AddressOfEntryPoint
|
||||
.long efi_header_end - _head // BaseOfCode
|
||||
|
||||
extra_header_fields:
|
||||
|
|
|
|||
|
|
@ -57,12 +57,12 @@ unsigned long hcdp_phys = EFI_INVALID_TABLE_ADDR;
|
|||
unsigned long sal_systab_phys = EFI_INVALID_TABLE_ADDR;
|
||||
|
||||
static const efi_config_table_type_t arch_tables[] __initconst = {
|
||||
{ESI_TABLE_GUID, "ESI", &esi_phys},
|
||||
{HCDP_TABLE_GUID, "HCDP", &hcdp_phys},
|
||||
{MPS_TABLE_GUID, "MPS", &mps_phys},
|
||||
{PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID, "PALO", &palo_phys},
|
||||
{SAL_SYSTEM_TABLE_GUID, "SALsystab", &sal_systab_phys},
|
||||
{NULL_GUID, NULL, 0},
|
||||
{ESI_TABLE_GUID, &esi_phys, "ESI" },
|
||||
{HCDP_TABLE_GUID, &hcdp_phys, "HCDP" },
|
||||
{MPS_TABLE_GUID, &mps_phys, "MPS" },
|
||||
{PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID, &palo_phys, "PALO" },
|
||||
{SAL_SYSTEM_TABLE_GUID, &sal_systab_phys, "SALsystab" },
|
||||
{},
|
||||
};
|
||||
|
||||
extern efi_status_t efi_call_phys (void *, ...);
|
||||
|
|
|
|||
|
|
@ -221,6 +221,7 @@ static void __init amiga_identify(void)
|
|||
case AMI_1200:
|
||||
AMIGAHW_SET(A1200_IDE);
|
||||
AMIGAHW_SET(PCMCIA);
|
||||
fallthrough;
|
||||
case AMI_500:
|
||||
case AMI_500PLUS:
|
||||
case AMI_1000:
|
||||
|
|
@ -233,7 +234,7 @@ static void __init amiga_identify(void)
|
|||
case AMI_3000T:
|
||||
AMIGAHW_SET(AMBER_FF);
|
||||
AMIGAHW_SET(MAGIC_REKICK);
|
||||
/* fall through */
|
||||
fallthrough;
|
||||
case AMI_3000PLUS:
|
||||
AMIGAHW_SET(A3000_SCSI);
|
||||
AMIGAHW_SET(A3000_CLK);
|
||||
|
|
@ -242,7 +243,7 @@ static void __init amiga_identify(void)
|
|||
|
||||
case AMI_4000T:
|
||||
AMIGAHW_SET(A4000_SCSI);
|
||||
/* fall through */
|
||||
fallthrough;
|
||||
case AMI_4000:
|
||||
AMIGAHW_SET(A4000_IDE);
|
||||
AMIGAHW_SET(A3000_CLK);
|
||||
|
|
@ -628,7 +629,7 @@ struct savekmsg {
|
|||
unsigned long magic2; /* SAVEKMSG_MAGIC2 */
|
||||
unsigned long magicptr; /* address of magic1 */
|
||||
unsigned long size;
|
||||
char data[0];
|
||||
char data[];
|
||||
};
|
||||
|
||||
static struct savekmsg *savekmsg;
|
||||
|
|
|
|||
|
|
@ -100,7 +100,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -381,6 +380,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -452,6 +452,7 @@ CONFIG_RTC_CLASS=y
|
|||
CONFIG_RTC_DRV_MSM6242=m
|
||||
CONFIG_RTC_DRV_RP5C01=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -472,6 +473,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -619,9 +621,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -96,7 +96,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -360,6 +359,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -408,6 +408,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -428,6 +429,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -575,9 +577,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -103,7 +103,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -376,6 +375,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -430,6 +430,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -450,6 +451,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -597,9 +599,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -358,6 +357,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -401,6 +401,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -421,6 +422,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -568,9 +570,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -95,7 +95,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -359,6 +358,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -410,6 +410,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -430,6 +431,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -577,9 +579,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -94,7 +94,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -375,6 +374,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -432,6 +432,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -452,6 +453,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -599,9 +601,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -114,7 +114,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -419,6 +418,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -518,6 +518,7 @@ CONFIG_RTC_DRV_MSM6242=m
|
|||
CONFIG_RTC_DRV_RP5C01=m
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -538,6 +539,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -685,9 +687,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -92,7 +92,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -357,6 +356,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -400,6 +400,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -420,6 +421,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -567,9 +569,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -358,6 +357,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -401,6 +401,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -421,6 +422,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -568,9 +570,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -94,7 +94,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -365,6 +364,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -419,6 +419,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -439,6 +440,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -586,9 +588,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -90,7 +90,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -355,6 +354,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -403,6 +403,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -423,6 +424,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -570,8 +572,10 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -90,7 +90,6 @@ CONFIG_NF_CONNTRACK_SANE=m
|
|||
CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_SET=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
CONFIG_NFT_NUMGEN=m
|
||||
|
|
@ -355,6 +354,7 @@ CONFIG_IPVLAN=m
|
|||
CONFIG_IPVTAP=m
|
||||
CONFIG_VXLAN=m
|
||||
CONFIG_GENEVE=m
|
||||
CONFIG_BAREUDP=m
|
||||
CONFIG_GTP=m
|
||||
CONFIG_MACSEC=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
|
|
@ -402,6 +402,7 @@ CONFIG_RTC_CLASS=y
|
|||
# CONFIG_RTC_NVMEM is not set
|
||||
CONFIG_RTC_DRV_GENERIC=m
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_DAX=m
|
||||
CONFIG_EXT4_FS=y
|
||||
|
|
@ -422,6 +423,7 @@ CONFIG_ZISOFS=y
|
|||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_CHILDREN=y
|
||||
CONFIG_TMPFS=y
|
||||
|
|
@ -569,9 +571,11 @@ CONFIG_XZ_DEC_TEST=m
|
|||
CONFIG_STRING_SELFTEST=m
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_TEST_LOCKUP=m
|
||||
CONFIG_WW_MUTEX_SELFTEST=m
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_TEST_LIST_SORT=m
|
||||
CONFIG_TEST_MIN_HEAP=m
|
||||
CONFIG_TEST_SORT=m
|
||||
CONFIG_REED_SOLOMON_TEST=m
|
||||
CONFIG_ATOMIC64_SELFTEST=m
|
||||
|
|
|
|||
|
|
@ -257,6 +257,7 @@ extern int rbv_present,via_alt_mapping;
|
|||
|
||||
struct irq_desc;
|
||||
|
||||
extern void via_l2_flush(int writeback);
|
||||
extern void via_register_interrupts(void);
|
||||
extern void via_irq_enable(int);
|
||||
extern void via_irq_disable(int);
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ asm volatile ("\n" \
|
|||
__get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \
|
||||
break; \
|
||||
case 8: { \
|
||||
const void *__gu_ptr = (ptr); \
|
||||
const void __user *__gu_ptr = (ptr); \
|
||||
union { \
|
||||
u64 l; \
|
||||
__typeof__(*(ptr)) t; \
|
||||
|
|
|
|||
|
|
@ -59,7 +59,6 @@ extern void iop_preinit(void);
|
|||
extern void iop_init(void);
|
||||
extern void via_init(void);
|
||||
extern void via_init_clock(irq_handler_t func);
|
||||
extern void via_flush_cache(void);
|
||||
extern void oss_init(void);
|
||||
extern void psc_init(void);
|
||||
extern void baboon_init(void);
|
||||
|
|
@ -130,21 +129,6 @@ int __init mac_parse_bootinfo(const struct bi_record *record)
|
|||
return unknown;
|
||||
}
|
||||
|
||||
/*
|
||||
* Flip into 24bit mode for an instant - flushes the L2 cache card. We
|
||||
* have to disable interrupts for this. Our IRQ handlers will crap
|
||||
* themselves if they take an IRQ in 24bit mode!
|
||||
*/
|
||||
|
||||
static void mac_cache_card_flush(int writeback)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
via_flush_cache();
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
void __init config_mac(void)
|
||||
{
|
||||
if (!MACH_IS_MAC)
|
||||
|
|
@ -175,9 +159,8 @@ void __init config_mac(void)
|
|||
* not.
|
||||
*/
|
||||
|
||||
if (macintosh_config->ident == MAC_MODEL_IICI
|
||||
|| macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
mach_l2_flush = mac_cache_card_flush;
|
||||
if (macintosh_config->ident == MAC_MODEL_IICI)
|
||||
mach_l2_flush = via_l2_flush;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -299,7 +299,6 @@ void __init iop_init(void)
|
|||
|
||||
/*
|
||||
* Register the interrupt handler for the IOPs.
|
||||
* TODO: might be wrong for non-OSS machines. Anyone?
|
||||
*/
|
||||
|
||||
void __init iop_register_interrupts(void)
|
||||
|
|
@ -566,36 +565,42 @@ irqreturn_t iop_ism_irq(int irq, void *dev_id)
|
|||
uint iop_num = (uint) dev_id;
|
||||
volatile struct mac_iop *iop = iop_base[iop_num];
|
||||
int i,state;
|
||||
u8 events = iop->status_ctrl & (IOP_INT0 | IOP_INT1);
|
||||
|
||||
iop_pr_debug("status %02X\n", iop->status_ctrl);
|
||||
|
||||
/* INT0 indicates a state change on an outgoing message channel */
|
||||
|
||||
if (iop->status_ctrl & IOP_INT0) {
|
||||
iop->status_ctrl = IOP_INT0 | IOP_RUN | IOP_AUTOINC;
|
||||
iop_pr_debug("new status %02X, send states", iop->status_ctrl);
|
||||
for (i = 0 ; i < NUM_IOP_CHAN ; i++) {
|
||||
state = iop_readb(iop, IOP_ADDR_SEND_STATE + i);
|
||||
iop_pr_cont(" %02X", state);
|
||||
if (state == IOP_MSG_COMPLETE) {
|
||||
iop_handle_send(iop_num, i);
|
||||
do {
|
||||
/* INT0 indicates state change on an outgoing message channel */
|
||||
if (events & IOP_INT0) {
|
||||
iop->status_ctrl = IOP_INT0 | IOP_RUN | IOP_AUTOINC;
|
||||
iop_pr_debug("new status %02X, send states",
|
||||
iop->status_ctrl);
|
||||
for (i = 0; i < NUM_IOP_CHAN; i++) {
|
||||
state = iop_readb(iop, IOP_ADDR_SEND_STATE + i);
|
||||
iop_pr_cont(" %02X", state);
|
||||
if (state == IOP_MSG_COMPLETE)
|
||||
iop_handle_send(iop_num, i);
|
||||
}
|
||||
iop_pr_cont("\n");
|
||||
}
|
||||
iop_pr_cont("\n");
|
||||
}
|
||||
|
||||
if (iop->status_ctrl & IOP_INT1) { /* INT1 for incoming msgs */
|
||||
iop->status_ctrl = IOP_INT1 | IOP_RUN | IOP_AUTOINC;
|
||||
iop_pr_debug("new status %02X, recv states", iop->status_ctrl);
|
||||
for (i = 0 ; i < NUM_IOP_CHAN ; i++) {
|
||||
state = iop_readb(iop, IOP_ADDR_RECV_STATE + i);
|
||||
iop_pr_cont(" %02X", state);
|
||||
if (state == IOP_MSG_NEW) {
|
||||
iop_handle_recv(iop_num, i);
|
||||
/* INT1 for incoming messages */
|
||||
if (events & IOP_INT1) {
|
||||
iop->status_ctrl = IOP_INT1 | IOP_RUN | IOP_AUTOINC;
|
||||
iop_pr_debug("new status %02X, recv states",
|
||||
iop->status_ctrl);
|
||||
for (i = 0; i < NUM_IOP_CHAN; i++) {
|
||||
state = iop_readb(iop, IOP_ADDR_RECV_STATE + i);
|
||||
iop_pr_cont(" %02X", state);
|
||||
if (state == IOP_MSG_NEW)
|
||||
iop_handle_recv(iop_num, i);
|
||||
}
|
||||
iop_pr_cont("\n");
|
||||
}
|
||||
iop_pr_cont("\n");
|
||||
}
|
||||
|
||||
events = iop->status_ctrl & (IOP_INT0 | IOP_INT1);
|
||||
} while (events);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -294,10 +294,14 @@ void via_debug_dump(void)
|
|||
* the system into 24-bit mode for an instant.
|
||||
*/
|
||||
|
||||
void via_flush_cache(void)
|
||||
void via_l2_flush(int writeback)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
via2[gBufB] &= ~VIA2B_vMode32;
|
||||
via2[gBufB] |= VIA2B_vMode32;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ struct savekmsg {
|
|||
u_long magic2; /* SAVEKMSG_MAGIC2 */
|
||||
u_long magicptr; /* address of magic1 */
|
||||
u_long size;
|
||||
char data[0];
|
||||
char data[];
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1613,19 +1613,10 @@ config NODES_SHIFT
|
|||
Specify the maximum number of NUMA Nodes available on the target
|
||||
system. Increases memory reserved to accommodate various tables.
|
||||
|
||||
config ARCH_HAVE_MEMORY_PRESENT
|
||||
def_bool y
|
||||
depends on X86_32 && DISCONTIGMEM
|
||||
|
||||
config ARCH_FLATMEM_ENABLE
|
||||
def_bool y
|
||||
depends on X86_32 && !NUMA
|
||||
|
||||
config ARCH_DISCONTIGMEM_ENABLE
|
||||
def_bool n
|
||||
depends on NUMA && X86_32
|
||||
depends on BROKEN
|
||||
|
||||
config ARCH_SPARSEMEM_ENABLE
|
||||
def_bool y
|
||||
depends on X86_64 || NUMA || X86_32 || X86_32_NON_STANDARD
|
||||
|
|
@ -1890,10 +1881,10 @@ config X86_UMIP
|
|||
results are dummy.
|
||||
|
||||
config X86_INTEL_MEMORY_PROTECTION_KEYS
|
||||
prompt "Intel Memory Protection Keys"
|
||||
prompt "Memory Protection Keys"
|
||||
def_bool y
|
||||
# Note: only available in 64-bit mode
|
||||
depends on CPU_SUP_INTEL && X86_64
|
||||
depends on X86_64 && (CPU_SUP_INTEL || CPU_SUP_AMD)
|
||||
select ARCH_USES_HIGH_VMA_FLAGS
|
||||
select ARCH_HAS_PKEYS
|
||||
---help---
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ drivers-$(CONFIG_FB) += arch/x86/video/
|
|||
|
||||
boot := arch/x86/boot
|
||||
|
||||
BOOT_TARGETS = bzlilo bzdisk fdimage fdimage144 fdimage288 isoimage
|
||||
BOOT_TARGETS = bzdisk fdimage fdimage144 fdimage288 isoimage
|
||||
|
||||
PHONY += bzImage $(BOOT_TARGETS)
|
||||
|
||||
|
|
@ -272,8 +272,8 @@ endif
|
|||
$(BOOT_TARGETS): vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
PHONY += install
|
||||
install:
|
||||
PHONY += install bzlilo
|
||||
install bzlilo:
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
PHONY += vdso_install
|
||||
|
|
|
|||
|
|
@ -57,11 +57,10 @@ $(obj)/cpu.o: $(obj)/cpustr.h
|
|||
|
||||
quiet_cmd_cpustr = CPUSTR $@
|
||||
cmd_cpustr = $(obj)/mkcpustr > $@
|
||||
targets += cpustr.h
|
||||
$(obj)/cpustr.h: $(obj)/mkcpustr FORCE
|
||||
$(call if_changed,cpustr)
|
||||
endif
|
||||
clean-files += cpustr.h
|
||||
targets += cpustr.h
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
|
@ -129,6 +128,8 @@ quiet_cmd_genimage = GENIMAGE $3
|
|||
cmd_genimage = sh $(srctree)/$(src)/genimage.sh $2 $3 $(obj)/bzImage \
|
||||
$(obj)/mtools.conf '$(image_cmdline)' $(FDINITRD)
|
||||
|
||||
PHONY += bzdisk fdimage fdimage144 fdimage288 isoimage bzlilo install
|
||||
|
||||
# This requires write access to /dev/fd0
|
||||
bzdisk: $(obj)/bzImage $(obj)/mtools.conf
|
||||
$(call cmd,genimage,bzdisk,/dev/fd0)
|
||||
|
|
@ -146,7 +147,7 @@ isoimage: $(obj)/bzImage
|
|||
$(call cmd,genimage,isoimage,$(obj)/image.iso)
|
||||
@$(kecho) 'Kernel: $(obj)/image.iso is ready'
|
||||
|
||||
bzlilo: $(obj)/bzImage
|
||||
bzlilo:
|
||||
if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi
|
||||
if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi
|
||||
cat $(obj)/bzImage > $(INSTALL_PATH)/vmlinuz
|
||||
|
|
|
|||
|
|
@ -280,9 +280,9 @@ acpi_physical_address get_rsdp_addr(void)
|
|||
*/
|
||||
#define MAX_ADDR_LEN 19
|
||||
|
||||
static acpi_physical_address get_cmdline_acpi_rsdp(void)
|
||||
static unsigned long get_cmdline_acpi_rsdp(void)
|
||||
{
|
||||
acpi_physical_address addr = 0;
|
||||
unsigned long addr = 0;
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
char val[MAX_ADDR_LEN] = { };
|
||||
|
|
@ -292,7 +292,7 @@ static acpi_physical_address get_cmdline_acpi_rsdp(void)
|
|||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
if (kstrtoull(val, 16, &addr))
|
||||
if (boot_kstrtoul(val, 16, &addr))
|
||||
return 0;
|
||||
#endif
|
||||
return addr;
|
||||
|
|
@ -314,7 +314,6 @@ static unsigned long get_acpi_srat_table(void)
|
|||
* different ideas about whether to trust a command-line parameter.
|
||||
*/
|
||||
rsdp = (struct acpi_table_rsdp *)get_cmdline_acpi_rsdp();
|
||||
|
||||
if (!rsdp)
|
||||
rsdp = (struct acpi_table_rsdp *)(long)
|
||||
boot_params->acpi_rsdp_addr;
|
||||
|
|
|
|||
|
|
@ -28,8 +28,6 @@ SYM_FUNC_START(__efi64_thunk)
|
|||
push %rbx
|
||||
|
||||
leaq 1f(%rip), %rbp
|
||||
leaq efi_gdt64(%rip), %rbx
|
||||
movl %ebx, 2(%rbx) /* Fixup the gdt base address */
|
||||
|
||||
movl %ds, %eax
|
||||
push %rax
|
||||
|
|
@ -48,7 +46,8 @@ SYM_FUNC_START(__efi64_thunk)
|
|||
movl %r8d, 0xc(%rsp)
|
||||
movl %r9d, 0x10(%rsp)
|
||||
|
||||
sgdt 0x14(%rsp)
|
||||
leaq 0x14(%rsp), %rbx
|
||||
sgdt (%rbx)
|
||||
|
||||
/*
|
||||
* Switch to gdt with 32-bit segments. This is the firmware GDT
|
||||
|
|
@ -68,8 +67,7 @@ SYM_FUNC_START(__efi64_thunk)
|
|||
pushq %rax
|
||||
lretq
|
||||
|
||||
1: lgdt 0x14(%rsp)
|
||||
addq $32, %rsp
|
||||
1: addq $32, %rsp
|
||||
movq %rdi, %rax
|
||||
|
||||
pop %rbx
|
||||
|
|
@ -175,14 +173,3 @@ SYM_DATA_END(efi32_boot_cs)
|
|||
SYM_DATA_START(efi32_boot_ds)
|
||||
.word 0
|
||||
SYM_DATA_END(efi32_boot_ds)
|
||||
|
||||
SYM_DATA_START(efi_gdt64)
|
||||
.word efi_gdt64_end - efi_gdt64
|
||||
.long 0 /* Filled out by user */
|
||||
.word 0
|
||||
.quad 0x0000000000000000 /* NULL descriptor */
|
||||
.quad 0x00af9a000000ffff /* __KERNEL_CS */
|
||||
.quad 0x00cf92000000ffff /* __KERNEL_DS */
|
||||
.quad 0x0080890000000000 /* TS descriptor */
|
||||
.quad 0x0000000000000000 /* TS continued */
|
||||
SYM_DATA_END_LABEL(efi_gdt64, SYM_L_LOCAL, efi_gdt64_end)
|
||||
|
|
|
|||
|
|
@ -49,16 +49,17 @@
|
|||
* Position Independent Executable (PIE) so that linker won't optimize
|
||||
* R_386_GOT32X relocation to its fixed symbol address. Older
|
||||
* linkers generate R_386_32 relocations against locally defined symbols,
|
||||
* _bss, _ebss, _got and _egot, in PIE. It isn't wrong, just less
|
||||
* _bss, _ebss, _got, _egot and _end, in PIE. It isn't wrong, just less
|
||||
* optimal than R_386_RELATIVE. But the x86 kernel fails to properly handle
|
||||
* R_386_32 relocations when relocating the kernel. To generate
|
||||
* R_386_RELATIVE relocations, we mark _bss, _ebss, _got and _egot as
|
||||
* R_386_RELATIVE relocations, we mark _bss, _ebss, _got, _egot and _end as
|
||||
* hidden:
|
||||
*/
|
||||
.hidden _bss
|
||||
.hidden _ebss
|
||||
.hidden _got
|
||||
.hidden _egot
|
||||
.hidden _end
|
||||
|
||||
__HEAD
|
||||
SYM_FUNC_START(startup_32)
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
.hidden _ebss
|
||||
.hidden _got
|
||||
.hidden _egot
|
||||
.hidden _end
|
||||
|
||||
__HEAD
|
||||
.code32
|
||||
|
|
@ -393,6 +394,14 @@ SYM_CODE_START(startup_64)
|
|||
addq %rax, 2(%rax)
|
||||
lgdt (%rax)
|
||||
|
||||
/* Reload CS so IRET returns to a CS actually in the GDT */
|
||||
pushq $__KERNEL_CS
|
||||
leaq .Lon_kernel_cs(%rip), %rax
|
||||
pushq %rax
|
||||
lretq
|
||||
|
||||
.Lon_kernel_cs:
|
||||
|
||||
/*
|
||||
* paging_prepare() sets up the trampoline and checks if we need to
|
||||
* enable 5-level paging.
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ SECTIONS
|
|||
_data = . ;
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.bss.efistub)
|
||||
_edata = . ;
|
||||
}
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
|
|
@ -73,4 +74,6 @@ SECTIONS
|
|||
#endif
|
||||
. = ALIGN(PAGE_SIZE); /* keep ZO size page aligned */
|
||||
_end = .;
|
||||
|
||||
DISCARDS
|
||||
}
|
||||
|
|
|
|||
|
|
@ -117,7 +117,6 @@ static unsigned int simple_guess_base(const char *cp)
|
|||
* @endp: A pointer to the end of the parsed string will be placed here
|
||||
* @base: The number base to use
|
||||
*/
|
||||
|
||||
unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
|
||||
{
|
||||
unsigned long long result = 0;
|
||||
|
|
@ -335,3 +334,45 @@ int kstrtoull(const char *s, unsigned int base, unsigned long long *res)
|
|||
s++;
|
||||
return _kstrtoull(s, base, res);
|
||||
}
|
||||
|
||||
static int _kstrtoul(const char *s, unsigned int base, unsigned long *res)
|
||||
{
|
||||
unsigned long long tmp;
|
||||
int rv;
|
||||
|
||||
rv = kstrtoull(s, base, &tmp);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
if (tmp != (unsigned long)tmp)
|
||||
return -ERANGE;
|
||||
*res = tmp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* kstrtoul - convert a string to an unsigned long
|
||||
* @s: The start of the string. The string must be null-terminated, and may also
|
||||
* include a single newline before its terminating null. The first character
|
||||
* may also be a plus sign, but not a minus sign.
|
||||
* @base: The number base to use. The maximum supported base is 16. If base is
|
||||
* given as 0, then the base of the string is automatically detected with the
|
||||
* conventional semantics - If it begins with 0x the number will be parsed as a
|
||||
* hexadecimal (case insensitive), if it otherwise begins with 0, it will be
|
||||
* parsed as an octal number. Otherwise it will be parsed as a decimal.
|
||||
* @res: Where to write the result of the conversion on success.
|
||||
*
|
||||
* Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error.
|
||||
* Used as a replacement for the simple_strtoull.
|
||||
*/
|
||||
int boot_kstrtoul(const char *s, unsigned int base, unsigned long *res)
|
||||
{
|
||||
/*
|
||||
* We want to shortcut function call, but
|
||||
* __builtin_types_compatible_p(unsigned long, unsigned long long) = 0.
|
||||
*/
|
||||
if (sizeof(unsigned long) == sizeof(unsigned long long) &&
|
||||
__alignof__(unsigned long) == __alignof__(unsigned long long))
|
||||
return kstrtoull(s, base, (unsigned long long *)res);
|
||||
else
|
||||
return _kstrtoul(s, base, res);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,4 +30,5 @@ extern unsigned long long simple_strtoull(const char *cp, char **endp,
|
|||
unsigned int base);
|
||||
|
||||
int kstrtoull(const char *s, unsigned int base, unsigned long long *res);
|
||||
int boot_kstrtoul(const char *s, unsigned int base, unsigned long *res);
|
||||
#endif /* BOOT_STRING_H */
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ VDSO32-$(CONFIG_IA32_EMULATION) := y
|
|||
|
||||
# files to link into the vdso
|
||||
vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o
|
||||
vobjs32-y := vdso32/note.o vdso32/system_call.o vdso32/sigreturn.o
|
||||
vobjs32-y += vdso32/vclock_gettime.o
|
||||
|
||||
# files to link into kernel
|
||||
obj-y += vma.o
|
||||
|
|
@ -36,10 +38,12 @@ vdso_img-$(VDSO32-y) += 32
|
|||
obj-$(VDSO32-y) += vdso32-setup.o
|
||||
|
||||
vobjs := $(foreach F,$(vobjs-y),$(obj)/$F)
|
||||
vobjs32 := $(foreach F,$(vobjs32-y),$(obj)/$F)
|
||||
|
||||
$(obj)/vdso.o: $(obj)/vdso.so
|
||||
|
||||
targets += vdso.lds $(vobjs-y)
|
||||
targets += vdso32/vdso32.lds $(vobjs32-y)
|
||||
|
||||
# Build the vDSO image C files and link them in.
|
||||
vdso_img_objs := $(vdso_img-y:%=vdso-image-%.o)
|
||||
|
|
@ -129,10 +133,6 @@ $(obj)/vdsox32.so.dbg: $(obj)/vdsox32.lds $(vobjx32s) FORCE
|
|||
CPPFLAGS_vdso32/vdso32.lds = $(CPPFLAGS_vdso.lds)
|
||||
VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -soname linux-gate.so.1
|
||||
|
||||
targets += vdso32/vdso32.lds
|
||||
targets += vdso32/note.o vdso32/system_call.o vdso32/sigreturn.o
|
||||
targets += vdso32/vclock_gettime.o
|
||||
|
||||
KBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS)) -DBUILD_VDSO
|
||||
$(obj)/vdso32.so.dbg: KBUILD_AFLAGS = $(KBUILD_AFLAGS_32)
|
||||
$(obj)/vdso32.so.dbg: asflags-$(CONFIG_X86_64) += -m32
|
||||
|
|
@ -158,12 +158,7 @@ endif
|
|||
|
||||
$(obj)/vdso32.so.dbg: KBUILD_CFLAGS = $(KBUILD_CFLAGS_32)
|
||||
|
||||
$(obj)/vdso32.so.dbg: FORCE \
|
||||
$(obj)/vdso32/vdso32.lds \
|
||||
$(obj)/vdso32/vclock_gettime.o \
|
||||
$(obj)/vdso32/note.o \
|
||||
$(obj)/vdso32/system_call.o \
|
||||
$(obj)/vdso32/sigreturn.o
|
||||
$(obj)/vdso32.so.dbg: $(obj)/vdso32/vdso32.lds $(vobjs32) FORCE
|
||||
$(call if_changed,vdso_and_check)
|
||||
|
||||
#
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ static void map_input(const char *name, void **addr, size_t *len, int prot)
|
|||
|
||||
int fd = open(name, O_RDONLY);
|
||||
if (fd == -1)
|
||||
err(1, "%s", name);
|
||||
err(1, "open(%s)", name);
|
||||
|
||||
tmp_len = lseek(fd, 0, SEEK_END);
|
||||
if (tmp_len == (off_t)-1)
|
||||
|
|
@ -240,7 +240,7 @@ int main(int argc, char **argv)
|
|||
outfilename = argv[3];
|
||||
outfile = fopen(outfilename, "w");
|
||||
if (!outfile)
|
||||
err(1, "%s", argv[2]);
|
||||
err(1, "fopen(%s)", outfilename);
|
||||
|
||||
go(raw_addr, raw_len, stripped_addr, stripped_len, outfile, name);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,8 +13,7 @@ static void BITSFUNC(go)(void *raw_addr, size_t raw_len,
|
|||
unsigned long load_size = -1; /* Work around bogus warning */
|
||||
unsigned long mapping_size;
|
||||
ELF(Ehdr) *hdr = (ELF(Ehdr) *)raw_addr;
|
||||
int i;
|
||||
unsigned long j;
|
||||
unsigned long i, syms_nr;
|
||||
ELF(Shdr) *symtab_hdr = NULL, *strtab_hdr, *secstrings_hdr,
|
||||
*alt_sec = NULL;
|
||||
ELF(Dyn) *dyn = 0, *dyn_end = 0;
|
||||
|
|
@ -86,11 +85,10 @@ static void BITSFUNC(go)(void *raw_addr, size_t raw_len,
|
|||
strtab_hdr = raw_addr + GET_LE(&hdr->e_shoff) +
|
||||
GET_LE(&hdr->e_shentsize) * GET_LE(&symtab_hdr->sh_link);
|
||||
|
||||
syms_nr = GET_LE(&symtab_hdr->sh_size) / GET_LE(&symtab_hdr->sh_entsize);
|
||||
/* Walk the symbol table */
|
||||
for (i = 0;
|
||||
i < GET_LE(&symtab_hdr->sh_size) / GET_LE(&symtab_hdr->sh_entsize);
|
||||
i++) {
|
||||
int k;
|
||||
for (i = 0; i < syms_nr; i++) {
|
||||
unsigned int k;
|
||||
ELF(Sym) *sym = raw_addr + GET_LE(&symtab_hdr->sh_offset) +
|
||||
GET_LE(&symtab_hdr->sh_entsize) * i;
|
||||
const char *sym_name = raw_addr +
|
||||
|
|
@ -150,11 +148,11 @@ static void BITSFUNC(go)(void *raw_addr, size_t raw_len,
|
|||
fprintf(outfile,
|
||||
"static unsigned char raw_data[%lu] __ro_after_init __aligned(PAGE_SIZE) = {",
|
||||
mapping_size);
|
||||
for (j = 0; j < stripped_len; j++) {
|
||||
if (j % 10 == 0)
|
||||
for (i = 0; i < stripped_len; i++) {
|
||||
if (i % 10 == 0)
|
||||
fprintf(outfile, "\n\t");
|
||||
fprintf(outfile, "0x%02X, ",
|
||||
(int)((unsigned char *)stripped_addr)[j]);
|
||||
(int)((unsigned char *)stripped_addr)[i]);
|
||||
}
|
||||
fprintf(outfile, "\n};\n\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <asm/unistd_32.h>
|
||||
#include <asm/audit.h>
|
||||
|
||||
unsigned ia32_dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
|
|
|
|||
|
|
@ -25,11 +25,7 @@
|
|||
#define APBT_MIN_FREQ 1000000
|
||||
#define APBT_MMAP_SIZE 1024
|
||||
|
||||
#define APBT_DEV_USED 1
|
||||
|
||||
extern void apbt_time_init(void);
|
||||
extern unsigned long apbt_quick_calibrate(void);
|
||||
extern int arch_setup_apbt_irqs(int irq, int trigger, int mask, int cpu);
|
||||
extern void apbt_setup_secondary_clock(void);
|
||||
|
||||
extern struct sfi_timer_table_entry *sfi_get_mtmr(int hint);
|
||||
|
|
@ -38,7 +34,6 @@ extern int sfi_mtimer_num;
|
|||
|
||||
#else /* CONFIG_APB_TIMER */
|
||||
|
||||
static inline unsigned long apbt_quick_calibrate(void) {return 0; }
|
||||
static inline void apbt_time_init(void) { }
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -15,16 +15,6 @@
|
|||
|
||||
#define RDRAND_RETRY_LOOPS 10
|
||||
|
||||
#define RDRAND_INT ".byte 0x0f,0xc7,0xf0"
|
||||
#define RDSEED_INT ".byte 0x0f,0xc7,0xf8"
|
||||
#ifdef CONFIG_X86_64
|
||||
# define RDRAND_LONG ".byte 0x48,0x0f,0xc7,0xf0"
|
||||
# define RDSEED_LONG ".byte 0x48,0x0f,0xc7,0xf8"
|
||||
#else
|
||||
# define RDRAND_LONG RDRAND_INT
|
||||
# define RDSEED_LONG RDSEED_INT
|
||||
#endif
|
||||
|
||||
/* Unconditional execution of RDRAND and RDSEED */
|
||||
|
||||
static inline bool __must_check rdrand_long(unsigned long *v)
|
||||
|
|
@ -32,9 +22,9 @@ static inline bool __must_check rdrand_long(unsigned long *v)
|
|||
bool ok;
|
||||
unsigned int retry = RDRAND_RETRY_LOOPS;
|
||||
do {
|
||||
asm volatile(RDRAND_LONG
|
||||
asm volatile("rdrand %[out]"
|
||||
CC_SET(c)
|
||||
: CC_OUT(c) (ok), "=a" (*v));
|
||||
: CC_OUT(c) (ok), [out] "=r" (*v));
|
||||
if (ok)
|
||||
return true;
|
||||
} while (--retry);
|
||||
|
|
@ -46,9 +36,9 @@ static inline bool __must_check rdrand_int(unsigned int *v)
|
|||
bool ok;
|
||||
unsigned int retry = RDRAND_RETRY_LOOPS;
|
||||
do {
|
||||
asm volatile(RDRAND_INT
|
||||
asm volatile("rdrand %[out]"
|
||||
CC_SET(c)
|
||||
: CC_OUT(c) (ok), "=a" (*v));
|
||||
: CC_OUT(c) (ok), [out] "=r" (*v));
|
||||
if (ok)
|
||||
return true;
|
||||
} while (--retry);
|
||||
|
|
@ -58,18 +48,18 @@ static inline bool __must_check rdrand_int(unsigned int *v)
|
|||
static inline bool __must_check rdseed_long(unsigned long *v)
|
||||
{
|
||||
bool ok;
|
||||
asm volatile(RDSEED_LONG
|
||||
asm volatile("rdseed %[out]"
|
||||
CC_SET(c)
|
||||
: CC_OUT(c) (ok), "=a" (*v));
|
||||
: CC_OUT(c) (ok), [out] "=r" (*v));
|
||||
return ok;
|
||||
}
|
||||
|
||||
static inline bool __must_check rdseed_int(unsigned int *v)
|
||||
{
|
||||
bool ok;
|
||||
asm volatile(RDSEED_INT
|
||||
asm volatile("rdseed %[out]"
|
||||
CC_SET(c)
|
||||
: CC_OUT(c) (ok), "=a" (*v));
|
||||
: CC_OUT(c) (ok), [out] "=r" (*v));
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
|
|
|||
7
arch/x86/include/asm/audit.h
Normal file
7
arch/x86/include/asm/audit.h
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_X86_AUDIT_H
|
||||
#define _ASM_X86_AUDIT_H
|
||||
|
||||
int ia32_classify_syscall(unsigned int syscall);
|
||||
|
||||
#endif /* _ASM_X86_AUDIT_H */
|
||||
|
|
@ -20,12 +20,14 @@
|
|||
#define X86_CENTAUR_FAM6_C7_D 0xd
|
||||
#define X86_CENTAUR_FAM6_NANO 0xf
|
||||
|
||||
#define X86_STEPPINGS(mins, maxs) GENMASK(maxs, mins)
|
||||
/**
|
||||
* X86_MATCH_VENDOR_FAM_MODEL_FEATURE - Base macro for CPU matching
|
||||
* X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE - Base macro for CPU matching
|
||||
* @_vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY
|
||||
* The name is expanded to X86_VENDOR_@_vendor
|
||||
* @_family: The family number or X86_FAMILY_ANY
|
||||
* @_model: The model number, model constant or X86_MODEL_ANY
|
||||
* @_steppings: Bitmask for steppings, stepping constant or X86_STEPPING_ANY
|
||||
* @_feature: A X86_FEATURE bit or X86_FEATURE_ANY
|
||||
* @_data: Driver specific data or NULL. The internal storage
|
||||
* format is unsigned long. The supplied value, pointer
|
||||
|
|
@ -37,15 +39,34 @@
|
|||
* into another macro at the usage site for good reasons, then please
|
||||
* start this local macro with X86_MATCH to allow easy grepping.
|
||||
*/
|
||||
#define X86_MATCH_VENDOR_FAM_MODEL_FEATURE(_vendor, _family, _model, \
|
||||
_feature, _data) { \
|
||||
#define X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(_vendor, _family, _model, \
|
||||
_steppings, _feature, _data) { \
|
||||
.vendor = X86_VENDOR_##_vendor, \
|
||||
.family = _family, \
|
||||
.model = _model, \
|
||||
.steppings = _steppings, \
|
||||
.feature = _feature, \
|
||||
.driver_data = (unsigned long) _data \
|
||||
}
|
||||
|
||||
/**
|
||||
* X86_MATCH_VENDOR_FAM_MODEL_FEATURE - Macro for CPU matching
|
||||
* @_vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY
|
||||
* The name is expanded to X86_VENDOR_@_vendor
|
||||
* @_family: The family number or X86_FAMILY_ANY
|
||||
* @_model: The model number, model constant or X86_MODEL_ANY
|
||||
* @_feature: A X86_FEATURE bit or X86_FEATURE_ANY
|
||||
* @_data: Driver specific data or NULL. The internal storage
|
||||
* format is unsigned long. The supplied value, pointer
|
||||
* etc. is casted to unsigned long internally.
|
||||
*
|
||||
* The steppings arguments of X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE() is
|
||||
* set to wildcards.
|
||||
*/
|
||||
#define X86_MATCH_VENDOR_FAM_MODEL_FEATURE(vendor, family, model, feature, data) \
|
||||
X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(vendor, family, model, \
|
||||
X86_STEPPING_ANY, feature, data)
|
||||
|
||||
/**
|
||||
* X86_MATCH_VENDOR_FAM_FEATURE - Macro for matching vendor, family and CPU feature
|
||||
* @vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY
|
||||
|
|
@ -139,6 +160,10 @@
|
|||
#define X86_MATCH_INTEL_FAM6_MODEL(model, data) \
|
||||
X86_MATCH_VENDOR_FAM_MODEL(INTEL, 6, INTEL_FAM6_##model, data)
|
||||
|
||||
#define X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(model, steppings, data) \
|
||||
X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(INTEL, 6, INTEL_FAM6_##model, \
|
||||
steppings, X86_FEATURE_ANY, data)
|
||||
|
||||
/*
|
||||
* Match specific microcode revisions.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include <asm/nospec-branch.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
extern unsigned long efi_fw_vendor, efi_config_table;
|
||||
|
||||
|
|
@ -225,14 +226,21 @@ efi_status_t efi_set_virtual_address_map(unsigned long memory_map_size,
|
|||
|
||||
/* arch specific definitions used by the stub code */
|
||||
|
||||
__attribute_const__ bool efi_is_64bit(void);
|
||||
#ifdef CONFIG_EFI_MIXED
|
||||
|
||||
#define ARCH_HAS_EFISTUB_WRAPPERS
|
||||
|
||||
static inline bool efi_is_64bit(void)
|
||||
{
|
||||
extern const bool efi_is64;
|
||||
|
||||
return efi_is64;
|
||||
}
|
||||
|
||||
static inline bool efi_is_native(void)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_X86_64))
|
||||
return true;
|
||||
if (!IS_ENABLED(CONFIG_EFI_MIXED))
|
||||
return true;
|
||||
return efi_is_64bit();
|
||||
}
|
||||
|
||||
|
|
@ -286,6 +294,15 @@ static inline u32 efi64_convert_status(efi_status_t status)
|
|||
#define __efi64_argmap_allocate_pool(type, size, buffer) \
|
||||
((type), (size), efi64_zero_upper(buffer))
|
||||
|
||||
#define __efi64_argmap_create_event(type, tpl, f, c, event) \
|
||||
((type), (tpl), (f), (c), efi64_zero_upper(event))
|
||||
|
||||
#define __efi64_argmap_set_timer(event, type, time) \
|
||||
((event), (type), lower_32_bits(time), upper_32_bits(time))
|
||||
|
||||
#define __efi64_argmap_wait_for_event(num, event, index) \
|
||||
((num), (event), efi64_zero_upper(index))
|
||||
|
||||
#define __efi64_argmap_handle_protocol(handle, protocol, interface) \
|
||||
((handle), (protocol), efi64_zero_upper(interface))
|
||||
|
||||
|
|
@ -307,6 +324,10 @@ static inline u32 efi64_convert_status(efi_status_t status)
|
|||
#define __efi64_argmap_load_file(protocol, path, policy, bufsize, buf) \
|
||||
((protocol), (path), (policy), efi64_zero_upper(bufsize), (buf))
|
||||
|
||||
/* Graphics Output Protocol */
|
||||
#define __efi64_argmap_query_mode(gop, mode, size, info) \
|
||||
((gop), (mode), efi64_zero_upper(size), efi64_zero_upper(info))
|
||||
|
||||
/*
|
||||
* The macros below handle the plumbing for the argument mapping. To add a
|
||||
* mapping for a specific EFI method, simply define a macro
|
||||
|
|
@ -335,15 +356,26 @@ static inline u32 efi64_convert_status(efi_status_t status)
|
|||
|
||||
#define efi_bs_call(func, ...) \
|
||||
(efi_is_native() \
|
||||
? efi_system_table()->boottime->func(__VA_ARGS__) \
|
||||
: __efi64_thunk_map(efi_table_attr(efi_system_table(), \
|
||||
boottime), func, __VA_ARGS__))
|
||||
? efi_system_table->boottime->func(__VA_ARGS__) \
|
||||
: __efi64_thunk_map(efi_table_attr(efi_system_table, \
|
||||
boottime), \
|
||||
func, __VA_ARGS__))
|
||||
|
||||
#define efi_rt_call(func, ...) \
|
||||
(efi_is_native() \
|
||||
? efi_system_table()->runtime->func(__VA_ARGS__) \
|
||||
: __efi64_thunk_map(efi_table_attr(efi_system_table(), \
|
||||
runtime), func, __VA_ARGS__))
|
||||
? efi_system_table->runtime->func(__VA_ARGS__) \
|
||||
: __efi64_thunk_map(efi_table_attr(efi_system_table, \
|
||||
runtime), \
|
||||
func, __VA_ARGS__))
|
||||
|
||||
#else /* CONFIG_EFI_MIXED */
|
||||
|
||||
static inline bool efi_is_64bit(void)
|
||||
{
|
||||
return IS_ENABLED(CONFIG_X86_64);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_EFI_MIXED */
|
||||
|
||||
extern bool efi_reboot_required(void);
|
||||
extern bool efi_is_table_address(unsigned long phys_addr);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,8 @@ extern void fpu__save(struct fpu *fpu);
|
|||
extern int fpu__restore_sig(void __user *buf, int ia32_frame);
|
||||
extern void fpu__drop(struct fpu *fpu);
|
||||
extern int fpu__copy(struct task_struct *dst, struct task_struct *src);
|
||||
extern void fpu__clear(struct fpu *fpu);
|
||||
extern void fpu__clear_user_states(struct fpu *fpu);
|
||||
extern void fpu__clear_all(struct fpu *fpu);
|
||||
extern int fpu__exception_code(struct fpu *fpu, int trap_nr);
|
||||
extern int dump_fpu(struct pt_regs *ptregs, struct user_i387_struct *fpstate);
|
||||
|
||||
|
|
@ -92,7 +93,7 @@ static inline void fpstate_init_xstate(struct xregs_state *xsave)
|
|||
* XRSTORS requires these bits set in xcomp_bv, or it will
|
||||
* trigger #GP:
|
||||
*/
|
||||
xsave->header.xcomp_bv = XCOMP_BV_COMPACTED_FORMAT | xfeatures_mask;
|
||||
xsave->header.xcomp_bv = XCOMP_BV_COMPACTED_FORMAT | xfeatures_mask_all;
|
||||
}
|
||||
|
||||
static inline void fpstate_init_fxstate(struct fxregs_state *fx)
|
||||
|
|
@ -399,7 +400,10 @@ static inline int copy_kernel_to_xregs_err(struct xregs_state *xstate, u64 mask)
|
|||
u32 hmask = mask >> 32;
|
||||
int err;
|
||||
|
||||
XSTATE_OP(XRSTOR, xstate, lmask, hmask, err);
|
||||
if (static_cpu_has(X86_FEATURE_XSAVES))
|
||||
XSTATE_OP(XRSTORS, xstate, lmask, hmask, err);
|
||||
else
|
||||
XSTATE_OP(XRSTOR, xstate, lmask, hmask, err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,19 +21,29 @@
|
|||
#define XSAVE_YMM_SIZE 256
|
||||
#define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET)
|
||||
|
||||
/* Supervisor features */
|
||||
#define XFEATURE_MASK_SUPERVISOR (XFEATURE_MASK_PT)
|
||||
/* All currently supported user features */
|
||||
#define XFEATURE_MASK_USER_SUPPORTED (XFEATURE_MASK_FP | \
|
||||
XFEATURE_MASK_SSE | \
|
||||
XFEATURE_MASK_YMM | \
|
||||
XFEATURE_MASK_OPMASK | \
|
||||
XFEATURE_MASK_ZMM_Hi256 | \
|
||||
XFEATURE_MASK_Hi16_ZMM | \
|
||||
XFEATURE_MASK_PKRU | \
|
||||
XFEATURE_MASK_BNDREGS | \
|
||||
XFEATURE_MASK_BNDCSR)
|
||||
|
||||
/* All currently supported features */
|
||||
#define XCNTXT_MASK (XFEATURE_MASK_FP | \
|
||||
XFEATURE_MASK_SSE | \
|
||||
XFEATURE_MASK_YMM | \
|
||||
XFEATURE_MASK_OPMASK | \
|
||||
XFEATURE_MASK_ZMM_Hi256 | \
|
||||
XFEATURE_MASK_Hi16_ZMM | \
|
||||
XFEATURE_MASK_PKRU | \
|
||||
XFEATURE_MASK_BNDREGS | \
|
||||
XFEATURE_MASK_BNDCSR)
|
||||
/* All currently supported supervisor features */
|
||||
#define XFEATURE_MASK_SUPERVISOR_SUPPORTED (0)
|
||||
|
||||
/*
|
||||
* Unsupported supervisor features. When a supervisor feature in this mask is
|
||||
* supported in the future, move it to the supported supervisor feature mask.
|
||||
*/
|
||||
#define XFEATURE_MASK_SUPERVISOR_UNSUPPORTED (XFEATURE_MASK_PT)
|
||||
|
||||
/* All supervisor states including supported and unsupported states. */
|
||||
#define XFEATURE_MASK_SUPERVISOR_ALL (XFEATURE_MASK_SUPERVISOR_SUPPORTED | \
|
||||
XFEATURE_MASK_SUPERVISOR_UNSUPPORTED)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define REX_PREFIX "0x48, "
|
||||
|
|
@ -41,7 +51,18 @@
|
|||
#define REX_PREFIX
|
||||
#endif
|
||||
|
||||
extern u64 xfeatures_mask;
|
||||
extern u64 xfeatures_mask_all;
|
||||
|
||||
static inline u64 xfeatures_mask_supervisor(void)
|
||||
{
|
||||
return xfeatures_mask_all & XFEATURE_MASK_SUPERVISOR_SUPPORTED;
|
||||
}
|
||||
|
||||
static inline u64 xfeatures_mask_user(void)
|
||||
{
|
||||
return xfeatures_mask_all & XFEATURE_MASK_USER_SUPPORTED;
|
||||
}
|
||||
|
||||
extern u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
|
||||
|
||||
extern void __init update_regset_xstate_info(unsigned int size,
|
||||
|
|
@ -54,8 +75,9 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of
|
|||
int copy_xstate_to_user(void __user *ubuf, struct xregs_state *xsave, unsigned int offset, unsigned int size);
|
||||
int copy_kernel_to_xstate(struct xregs_state *xsave, const void *kbuf);
|
||||
int copy_user_to_xstate(struct xregs_state *xsave, const void __user *ubuf);
|
||||
void copy_supervisor_to_kernel(struct xregs_state *xsave);
|
||||
|
||||
/* Validate an xstate header supplied by userspace (ptrace or sigreturn) */
|
||||
extern int validate_xstate_header(const struct xstate_header *hdr);
|
||||
int validate_user_xstate_header(const struct xstate_header *hdr);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -12,12 +12,9 @@ static inline void __invpcid(unsigned long pcid, unsigned long addr,
|
|||
* stale TLB entries and, especially if we're flushing global
|
||||
* mappings, we don't want the compiler to reorder any subsequent
|
||||
* memory accesses before the TLB flush.
|
||||
*
|
||||
* The hex opcode is invpcid (%ecx), %eax in 32-bit mode and
|
||||
* invpcid (%rcx), %rax in long mode.
|
||||
*/
|
||||
asm volatile (".byte 0x66, 0x0f, 0x38, 0x82, 0x01"
|
||||
: : "m" (desc), "a" (type), "c" (&desc) : "memory");
|
||||
asm volatile("invpcid %[desc], %[type]"
|
||||
:: [desc] "m" (desc), [type] "r" (type) : "memory");
|
||||
}
|
||||
|
||||
#define INVPCID_TYPE_INDIV_ADDR 0
|
||||
|
|
|
|||
|
|
@ -14,43 +14,4 @@ extern struct pglist_data *node_data[];
|
|||
#define NODE_DATA(nid) (node_data[nid])
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
|
||||
/*
|
||||
* generic node memory support, the following assumptions apply:
|
||||
*
|
||||
* 1) memory comes in 64Mb contiguous chunks which are either present or not
|
||||
* 2) we will not have more than 64Gb in total
|
||||
*
|
||||
* for now assume that 64Gb is max amount of RAM for whole system
|
||||
* 64Gb / 4096bytes/page = 16777216 pages
|
||||
*/
|
||||
#define MAX_NR_PAGES 16777216
|
||||
#define MAX_SECTIONS 1024
|
||||
#define PAGES_PER_SECTION (MAX_NR_PAGES/MAX_SECTIONS)
|
||||
|
||||
extern s8 physnode_map[];
|
||||
|
||||
static inline int pfn_to_nid(unsigned long pfn)
|
||||
{
|
||||
#ifdef CONFIG_NUMA
|
||||
return((int) physnode_map[(pfn) / PAGES_PER_SECTION]);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int pfn_valid(int pfn)
|
||||
{
|
||||
int nid = pfn_to_nid(pfn);
|
||||
|
||||
if (nid >= 0)
|
||||
return (pfn < node_end_pfn(nid));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define early_pfn_valid(pfn) pfn_valid((pfn))
|
||||
|
||||
#endif /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
#endif /* _ASM_X86_MMZONE_32_H */
|
||||
|
|
|
|||
|
|
@ -66,8 +66,7 @@ do { \
|
|||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* kern_addr_valid() is (1) for FLATMEM and (0) for
|
||||
* SPARSEMEM and DISCONTIGMEM
|
||||
* kern_addr_valid() is (1) for FLATMEM and (0) for SPARSEMEM
|
||||
*/
|
||||
#ifdef CONFIG_FLATMEM
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
|
|
|||
|
|
@ -3,29 +3,7 @@
|
|||
#define _ASM_X86_SPINLOCK_TYPES_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_PARAVIRT_SPINLOCKS
|
||||
#define __TICKET_LOCK_INC 2
|
||||
#define TICKET_SLOWPATH_FLAG ((__ticket_t)1)
|
||||
#else
|
||||
#define __TICKET_LOCK_INC 1
|
||||
#define TICKET_SLOWPATH_FLAG ((__ticket_t)0)
|
||||
#endif
|
||||
|
||||
#if (CONFIG_NR_CPUS < (256 / __TICKET_LOCK_INC))
|
||||
typedef u8 __ticket_t;
|
||||
typedef u16 __ticketpair_t;
|
||||
#else
|
||||
typedef u16 __ticket_t;
|
||||
typedef u32 __ticketpair_t;
|
||||
#endif
|
||||
|
||||
#define TICKET_LOCK_INC ((__ticket_t)__TICKET_LOCK_INC)
|
||||
|
||||
#define TICKET_SHIFT (sizeof(__ticket_t) * 8)
|
||||
|
||||
#include <asm-generic/qspinlock_types.h>
|
||||
|
||||
#include <asm-generic/qrwlock_types.h>
|
||||
|
||||
#endif /* _ASM_X86_SPINLOCK_TYPES_H */
|
||||
|
|
|
|||
|
|
@ -123,12 +123,6 @@ enum uv_memprotect {
|
|||
UV_MEMPROT_ALLOW_RW
|
||||
};
|
||||
|
||||
/*
|
||||
* bios calls have 6 parameters
|
||||
*/
|
||||
extern s64 uv_bios_call(enum uv_bios_cmd, u64, u64, u64, u64, u64);
|
||||
extern s64 uv_bios_call_irqsave(enum uv_bios_cmd, u64, u64, u64, u64, u64);
|
||||
|
||||
extern s64 uv_bios_get_sn_info(int, int *, long *, long *, long *, long *);
|
||||
extern s64 uv_bios_freq_base(u64, u64 *);
|
||||
extern int uv_bios_mq_watchlist_alloc(unsigned long, unsigned int,
|
||||
|
|
@ -146,7 +140,6 @@ extern long sn_partition_id;
|
|||
extern long sn_coherency_id;
|
||||
extern long sn_region_size;
|
||||
extern long system_serial_number;
|
||||
#define uv_partition_coherence_id() (sn_coherency_id)
|
||||
|
||||
extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ static inline bool is_early_uv_system(void)
|
|||
}
|
||||
extern int is_uv_system(void);
|
||||
extern int is_uv_hubbed(int uvtype);
|
||||
extern int is_uv_hubless(int uvtype);
|
||||
extern void uv_cpu_init(void);
|
||||
extern void uv_nmi_init(void);
|
||||
extern void uv_system_init(void);
|
||||
|
|
@ -44,7 +43,6 @@ static inline enum uv_system_type get_uv_system_type(void) { return UV_NONE; }
|
|||
static inline bool is_early_uv_system(void) { return 0; }
|
||||
static inline int is_uv_system(void) { return 0; }
|
||||
static inline int is_uv_hubbed(int uv) { return 0; }
|
||||
static inline int is_uv_hubless(int uv) { return 0; }
|
||||
static inline void uv_cpu_init(void) { }
|
||||
static inline void uv_system_init(void) { }
|
||||
static inline const struct cpumask *
|
||||
|
|
|
|||
|
|
@ -219,20 +219,6 @@ static inline struct uv_hub_info_s *uv_cpu_hub_info(int cpu)
|
|||
return (struct uv_hub_info_s *)uv_cpu_info_per(cpu)->p_uv_hub_info;
|
||||
}
|
||||
|
||||
#define UV_HUB_INFO_VERSION 0x7150
|
||||
extern int uv_hub_info_version(void);
|
||||
static inline int uv_hub_info_check(int version)
|
||||
{
|
||||
if (uv_hub_info_version() == version)
|
||||
return 0;
|
||||
|
||||
pr_crit("UV: uv_hub_info version(%x) mismatch, expecting(%x)\n",
|
||||
uv_hub_info_version(), version);
|
||||
|
||||
BUG(); /* Catastrophic - cannot continue on unknown UV system */
|
||||
}
|
||||
#define _uv_hub_info_check() uv_hub_info_check(UV_HUB_INFO_VERSION)
|
||||
|
||||
/*
|
||||
* HUB revision ranges for each UV HUB architecture.
|
||||
* This is a software convention - NOT the hardware revision numbers in
|
||||
|
|
@ -244,51 +230,32 @@ static inline int uv_hub_info_check(int version)
|
|||
#define UV4_HUB_REVISION_BASE 7
|
||||
#define UV4A_HUB_REVISION_BASE 8 /* UV4 (fixed) rev 2 */
|
||||
|
||||
/* WARNING: UVx_HUB_IS_SUPPORTED defines are deprecated and will be removed */
|
||||
static inline int is_uv1_hub(void)
|
||||
{
|
||||
#ifdef UV1_HUB_IS_SUPPORTED
|
||||
return is_uv_hubbed(uv(1));
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int is_uv2_hub(void)
|
||||
{
|
||||
#ifdef UV2_HUB_IS_SUPPORTED
|
||||
return is_uv_hubbed(uv(2));
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int is_uv3_hub(void)
|
||||
{
|
||||
#ifdef UV3_HUB_IS_SUPPORTED
|
||||
return is_uv_hubbed(uv(3));
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* First test "is UV4A", then "is UV4" */
|
||||
static inline int is_uv4a_hub(void)
|
||||
{
|
||||
#ifdef UV4A_HUB_IS_SUPPORTED
|
||||
if (is_uv_hubbed(uv(4)))
|
||||
return (uv_hub_info->hub_revision == UV4A_HUB_REVISION_BASE);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int is_uv4_hub(void)
|
||||
{
|
||||
#ifdef UV4_HUB_IS_SUPPORTED
|
||||
return is_uv_hubbed(uv(4));
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int is_uvx_hub(void)
|
||||
|
|
@ -692,7 +659,6 @@ static inline int uv_cpu_blade_processor_id(int cpu)
|
|||
{
|
||||
return uv_cpu_info_per(cpu)->blade_cpu_id;
|
||||
}
|
||||
#define _uv_cpu_blade_processor_id 1 /* indicate function available */
|
||||
|
||||
/* Blade number to Node number (UV1..UV4 is 1:1) */
|
||||
static inline int uv_blade_to_node(int blade)
|
||||
|
|
@ -856,26 +822,6 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value)
|
|||
}
|
||||
|
||||
extern unsigned int uv_apicid_hibits;
|
||||
static unsigned long uv_hub_ipi_value(int apicid, int vector, int mode)
|
||||
{
|
||||
apicid |= uv_apicid_hibits;
|
||||
return (1UL << UVH_IPI_INT_SEND_SHFT) |
|
||||
((apicid) << UVH_IPI_INT_APIC_ID_SHFT) |
|
||||
(mode << UVH_IPI_INT_DELIVERY_MODE_SHFT) |
|
||||
(vector << UVH_IPI_INT_VECTOR_SHFT);
|
||||
}
|
||||
|
||||
static inline void uv_hub_send_ipi(int pnode, int apicid, int vector)
|
||||
{
|
||||
unsigned long val;
|
||||
unsigned long dmode = dest_Fixed;
|
||||
|
||||
if (vector == NMI_VECTOR)
|
||||
dmode = dest_NMI;
|
||||
|
||||
val = uv_hub_ipi_value(apicid, vector, dmode);
|
||||
uv_write_global_mmr64(pnode, UVH_IPI_INT, val);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the minimum revision number of the hub chips within the partition.
|
||||
|
|
|
|||
|
|
@ -99,13 +99,6 @@
|
|||
#define UV3_HUB_PART_NUMBER_X 0x4321
|
||||
#define UV4_HUB_PART_NUMBER 0x99a1
|
||||
|
||||
/* Compat: Indicate which UV Hubs are supported. */
|
||||
#define UV1_HUB_IS_SUPPORTED 1
|
||||
#define UV2_HUB_IS_SUPPORTED 1
|
||||
#define UV3_HUB_IS_SUPPORTED 1
|
||||
#define UV4_HUB_IS_SUPPORTED 1
|
||||
#define UV4A_HUB_IS_SUPPORTED 1
|
||||
|
||||
/* Error function to catch undefined references */
|
||||
extern unsigned long uv_undefined(char *str);
|
||||
|
||||
|
|
|
|||
|
|
@ -345,56 +345,3 @@ void __init apbt_time_init(void)
|
|||
apb_timer_block_enabled = 0;
|
||||
panic("failed to enable APB timer\n");
|
||||
}
|
||||
|
||||
/* called before apb_timer_enable, use early map */
|
||||
unsigned long apbt_quick_calibrate(void)
|
||||
{
|
||||
int i, scale;
|
||||
u64 old, new;
|
||||
u64 t1, t2;
|
||||
unsigned long khz = 0;
|
||||
u32 loop, shift;
|
||||
|
||||
apbt_set_mapping();
|
||||
dw_apb_clocksource_start(clocksource_apbt);
|
||||
|
||||
/* check if the timer can count down, otherwise return */
|
||||
old = dw_apb_clocksource_read(clocksource_apbt);
|
||||
i = 10000;
|
||||
while (--i) {
|
||||
if (old != dw_apb_clocksource_read(clocksource_apbt))
|
||||
break;
|
||||
}
|
||||
if (!i)
|
||||
goto failed;
|
||||
|
||||
/* count 16 ms */
|
||||
loop = (apbt_freq / 1000) << 4;
|
||||
|
||||
/* restart the timer to ensure it won't get to 0 in the calibration */
|
||||
dw_apb_clocksource_start(clocksource_apbt);
|
||||
|
||||
old = dw_apb_clocksource_read(clocksource_apbt);
|
||||
old += loop;
|
||||
|
||||
t1 = rdtsc();
|
||||
|
||||
do {
|
||||
new = dw_apb_clocksource_read(clocksource_apbt);
|
||||
} while (new < old);
|
||||
|
||||
t2 = rdtsc();
|
||||
|
||||
shift = 5;
|
||||
if (unlikely(loop >> shift == 0)) {
|
||||
printk(KERN_INFO
|
||||
"APBT TSC calibration failed, not enough resolution\n");
|
||||
return 0;
|
||||
}
|
||||
scale = (int)div_u64((t2 - t1), loop >> shift);
|
||||
khz = (scale * (apbt_freq / 1000)) >> shift;
|
||||
printk(KERN_INFO "TSC freq calculated by APB timer is %lu khz\n", khz);
|
||||
return khz;
|
||||
failed:
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -544,46 +544,20 @@ static struct clock_event_device lapic_clockevent = {
|
|||
};
|
||||
static DEFINE_PER_CPU(struct clock_event_device, lapic_events);
|
||||
|
||||
static __init u32 hsx_deadline_rev(void)
|
||||
{
|
||||
switch (boot_cpu_data.x86_stepping) {
|
||||
case 0x02: return 0x3a; /* EP */
|
||||
case 0x04: return 0x0f; /* EX */
|
||||
}
|
||||
|
||||
return ~0U;
|
||||
}
|
||||
|
||||
static __init u32 bdx_deadline_rev(void)
|
||||
{
|
||||
switch (boot_cpu_data.x86_stepping) {
|
||||
case 0x02: return 0x00000011;
|
||||
case 0x03: return 0x0700000e;
|
||||
case 0x04: return 0x0f00000c;
|
||||
case 0x05: return 0x0e000003;
|
||||
}
|
||||
|
||||
return ~0U;
|
||||
}
|
||||
|
||||
static __init u32 skx_deadline_rev(void)
|
||||
{
|
||||
switch (boot_cpu_data.x86_stepping) {
|
||||
case 0x03: return 0x01000136;
|
||||
case 0x04: return 0x02000014;
|
||||
}
|
||||
|
||||
if (boot_cpu_data.x86_stepping > 4)
|
||||
return 0;
|
||||
|
||||
return ~0U;
|
||||
}
|
||||
|
||||
static const struct x86_cpu_id deadline_match[] __initconst = {
|
||||
X86_MATCH_INTEL_FAM6_MODEL( HASWELL_X, &hsx_deadline_rev),
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(HASWELL_X, X86_STEPPINGS(0x2, 0x2), 0x3a), /* EP */
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(HASWELL_X, X86_STEPPINGS(0x4, 0x4), 0x0f), /* EX */
|
||||
|
||||
X86_MATCH_INTEL_FAM6_MODEL( BROADWELL_X, 0x0b000020),
|
||||
X86_MATCH_INTEL_FAM6_MODEL( BROADWELL_D, &bdx_deadline_rev),
|
||||
X86_MATCH_INTEL_FAM6_MODEL( SKYLAKE_X, &skx_deadline_rev),
|
||||
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(BROADWELL_D, X86_STEPPINGS(0x2, 0x2), 0x00000011),
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(BROADWELL_D, X86_STEPPINGS(0x3, 0x3), 0x0700000e),
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(BROADWELL_D, X86_STEPPINGS(0x4, 0x4), 0x0f00000c),
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(BROADWELL_D, X86_STEPPINGS(0x5, 0x5), 0x0e000003),
|
||||
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(SKYLAKE_X, X86_STEPPINGS(0x3, 0x3), 0x01000136),
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(SKYLAKE_X, X86_STEPPINGS(0x4, 0x4), 0x02000014),
|
||||
X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(SKYLAKE_X, X86_STEPPINGS(0x5, 0xf), 0),
|
||||
|
||||
X86_MATCH_INTEL_FAM6_MODEL( HASWELL, 0x22),
|
||||
X86_MATCH_INTEL_FAM6_MODEL( HASWELL_L, 0x20),
|
||||
|
|
@ -615,14 +589,7 @@ static __init bool apic_validate_deadline_timer(void)
|
|||
if (!m)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Function pointers will have the MSB set due to address layout,
|
||||
* immediate revisions will not.
|
||||
*/
|
||||
if ((long)m->driver_data < 0)
|
||||
rev = ((u32 (*)(void))(m->driver_data))();
|
||||
else
|
||||
rev = (u32)m->driver_data;
|
||||
rev = (u32)m->driver_data;
|
||||
|
||||
if (boot_cpu_data.microcode >= rev)
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -154,19 +154,6 @@ static inline bool mp_is_legacy_irq(int irq)
|
|||
return irq >= 0 && irq < nr_legacy_irqs();
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize all legacy IRQs and all pins on the first IOAPIC
|
||||
* if we have legacy interrupt controller. Kernel boot option "pirq="
|
||||
* may rely on non-legacy pins on the first IOAPIC.
|
||||
*/
|
||||
static inline int mp_init_irq_at_boot(int ioapic, int irq)
|
||||
{
|
||||
if (!nr_legacy_irqs())
|
||||
return 0;
|
||||
|
||||
return ioapic == 0 || mp_is_legacy_irq(irq);
|
||||
}
|
||||
|
||||
static inline struct irq_domain *mp_ioapic_irqdomain(int ioapic)
|
||||
{
|
||||
return ioapics[ioapic].irqdomain;
|
||||
|
|
|
|||
|
|
@ -30,8 +30,6 @@ static enum uv_system_type uv_system_type;
|
|||
static int uv_hubbed_system;
|
||||
static int uv_hubless_system;
|
||||
static u64 gru_start_paddr, gru_end_paddr;
|
||||
static u64 gru_dist_base, gru_first_node_paddr = -1LL, gru_last_node_paddr;
|
||||
static u64 gru_dist_lmask, gru_dist_umask;
|
||||
static union uvh_apicid uvh_apicid;
|
||||
|
||||
/* Unpack OEM/TABLE ID's to be NULL terminated strings */
|
||||
|
|
@ -48,11 +46,9 @@ static struct {
|
|||
unsigned int gnode_shift;
|
||||
} uv_cpuid;
|
||||
|
||||
int uv_min_hub_revision_id;
|
||||
EXPORT_SYMBOL_GPL(uv_min_hub_revision_id);
|
||||
static int uv_min_hub_revision_id;
|
||||
|
||||
unsigned int uv_apicid_hibits;
|
||||
EXPORT_SYMBOL_GPL(uv_apicid_hibits);
|
||||
|
||||
static struct apic apic_x2apic_uv_x;
|
||||
static struct uv_hub_info_s uv_hub_info_node0;
|
||||
|
|
@ -85,20 +81,7 @@ static unsigned long __init uv_early_read_mmr(unsigned long addr)
|
|||
|
||||
static inline bool is_GRU_range(u64 start, u64 end)
|
||||
{
|
||||
if (gru_dist_base) {
|
||||
u64 su = start & gru_dist_umask; /* Upper (incl pnode) bits */
|
||||
u64 sl = start & gru_dist_lmask; /* Base offset bits */
|
||||
u64 eu = end & gru_dist_umask;
|
||||
u64 el = end & gru_dist_lmask;
|
||||
|
||||
/* Must reside completely within a single GRU range: */
|
||||
return (sl == gru_dist_base && el == gru_dist_base &&
|
||||
su >= gru_first_node_paddr &&
|
||||
su <= gru_last_node_paddr &&
|
||||
eu == su);
|
||||
} else {
|
||||
return start >= gru_start_paddr && end <= gru_end_paddr;
|
||||
}
|
||||
return start >= gru_start_paddr && end <= gru_end_paddr;
|
||||
}
|
||||
|
||||
static bool uv_is_untracked_pat_range(u64 start, u64 end)
|
||||
|
|
@ -385,11 +368,10 @@ int is_uv_hubbed(int uvtype)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(is_uv_hubbed);
|
||||
|
||||
int is_uv_hubless(int uvtype)
|
||||
static int is_uv_hubless(int uvtype)
|
||||
{
|
||||
return (uv_hubless_system & uvtype);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(is_uv_hubless);
|
||||
|
||||
void **__uv_hub_info_list;
|
||||
EXPORT_SYMBOL_GPL(__uv_hub_info_list);
|
||||
|
|
@ -417,12 +399,6 @@ static __initdata struct uv_gam_range_s *_gr_table;
|
|||
|
||||
#define SOCK_EMPTY ((unsigned short)~0)
|
||||
|
||||
extern int uv_hub_info_version(void)
|
||||
{
|
||||
return UV_HUB_INFO_VERSION;
|
||||
}
|
||||
EXPORT_SYMBOL(uv_hub_info_version);
|
||||
|
||||
/* Default UV memory block size is 2GB */
|
||||
static unsigned long mem_block_size __initdata = (2UL << 30);
|
||||
|
||||
|
|
@ -590,12 +566,21 @@ static int uv_wakeup_secondary(int phys_apicid, unsigned long start_rip)
|
|||
|
||||
static void uv_send_IPI_one(int cpu, int vector)
|
||||
{
|
||||
unsigned long apicid;
|
||||
int pnode;
|
||||
unsigned long apicid = per_cpu(x86_cpu_to_apicid, cpu);
|
||||
int pnode = uv_apicid_to_pnode(apicid);
|
||||
unsigned long dmode, val;
|
||||
|
||||
apicid = per_cpu(x86_cpu_to_apicid, cpu);
|
||||
pnode = uv_apicid_to_pnode(apicid);
|
||||
uv_hub_send_ipi(pnode, apicid, vector);
|
||||
if (vector == NMI_VECTOR)
|
||||
dmode = dest_NMI;
|
||||
else
|
||||
dmode = dest_Fixed;
|
||||
|
||||
val = (1UL << UVH_IPI_INT_SEND_SHFT) |
|
||||
((apicid | uv_apicid_hibits) << UVH_IPI_INT_APIC_ID_SHFT) |
|
||||
(dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) |
|
||||
(vector << UVH_IPI_INT_VECTOR_SHFT);
|
||||
|
||||
uv_write_global_mmr64(pnode, UVH_IPI_INT, val);
|
||||
}
|
||||
|
||||
static void uv_send_IPI_mask(const struct cpumask *mask, int vector)
|
||||
|
|
@ -797,42 +782,6 @@ static __init void map_high(char *id, unsigned long base, int pshift, int bshift
|
|||
init_extra_mapping_wb(paddr, bytes);
|
||||
}
|
||||
|
||||
static __init void map_gru_distributed(unsigned long c)
|
||||
{
|
||||
union uvh_rh_gam_gru_overlay_config_mmr_u gru;
|
||||
u64 paddr;
|
||||
unsigned long bytes;
|
||||
int nid;
|
||||
|
||||
gru.v = c;
|
||||
|
||||
/* Only base bits 42:28 relevant in dist mode */
|
||||
gru_dist_base = gru.v & 0x000007fff0000000UL;
|
||||
if (!gru_dist_base) {
|
||||
pr_info("UV: Map GRU_DIST base address NULL\n");
|
||||
return;
|
||||
}
|
||||
|
||||
bytes = 1UL << UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT;
|
||||
gru_dist_lmask = ((1UL << uv_hub_info->m_val) - 1) & ~(bytes - 1);
|
||||
gru_dist_umask = ~((1UL << uv_hub_info->m_val) - 1);
|
||||
gru_dist_base &= gru_dist_lmask; /* Clear bits above M */
|
||||
|
||||
for_each_online_node(nid) {
|
||||
paddr = ((u64)uv_node_to_pnode(nid) << uv_hub_info->m_val) |
|
||||
gru_dist_base;
|
||||
init_extra_mapping_wb(paddr, bytes);
|
||||
gru_first_node_paddr = min(paddr, gru_first_node_paddr);
|
||||
gru_last_node_paddr = max(paddr, gru_last_node_paddr);
|
||||
}
|
||||
|
||||
/* Save upper (63:M) bits of address only for is_GRU_range */
|
||||
gru_first_node_paddr &= gru_dist_umask;
|
||||
gru_last_node_paddr &= gru_dist_umask;
|
||||
|
||||
pr_debug("UV: Map GRU_DIST base 0x%016llx 0x%016llx - 0x%016llx\n", gru_dist_base, gru_first_node_paddr, gru_last_node_paddr);
|
||||
}
|
||||
|
||||
static __init void map_gru_high(int max_pnode)
|
||||
{
|
||||
union uvh_rh_gam_gru_overlay_config_mmr_u gru;
|
||||
|
|
@ -846,12 +795,6 @@ static __init void map_gru_high(int max_pnode)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Only UV3 has distributed GRU mode */
|
||||
if (is_uv3_hub() && gru.s3.mode) {
|
||||
map_gru_distributed(gru.v);
|
||||
return;
|
||||
}
|
||||
|
||||
base = (gru.v & mask) >> shift;
|
||||
map_high("GRU", base, shift, shift, max_pnode, map_wb);
|
||||
gru_start_paddr = ((u64)base << shift);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/audit.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/audit.h>
|
||||
|
||||
static unsigned dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
|
|
@ -41,7 +42,6 @@ int audit_classify_arch(int arch)
|
|||
int audit_classify_syscall(int abi, unsigned syscall)
|
||||
{
|
||||
#ifdef CONFIG_IA32_EMULATION
|
||||
extern int ia32_classify_syscall(unsigned);
|
||||
if (abi == AUDIT_ARCH_I386)
|
||||
return ia32_classify_syscall(syscall);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1145,8 +1145,7 @@ static const int amd_erratum_383[] =
|
|||
|
||||
/* #1054: Instructions Retired Performance Counter May Be Inaccurate */
|
||||
static const int amd_erratum_1054[] =
|
||||
AMD_OSVW_ERRATUM(0, AMD_MODEL_RANGE(0x17, 0, 0, 0x2f, 0xf));
|
||||
|
||||
AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x17, 0, 0, 0x2f, 0xf));
|
||||
|
||||
static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -39,13 +39,18 @@ const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match)
|
|||
const struct x86_cpu_id *m;
|
||||
struct cpuinfo_x86 *c = &boot_cpu_data;
|
||||
|
||||
for (m = match; m->vendor | m->family | m->model | m->feature; m++) {
|
||||
for (m = match;
|
||||
m->vendor | m->family | m->model | m->steppings | m->feature;
|
||||
m++) {
|
||||
if (m->vendor != X86_VENDOR_ANY && c->x86_vendor != m->vendor)
|
||||
continue;
|
||||
if (m->family != X86_FAMILY_ANY && c->x86 != m->family)
|
||||
continue;
|
||||
if (m->model != X86_MODEL_ANY && c->x86_model != m->model)
|
||||
continue;
|
||||
if (m->steppings != X86_STEPPING_ANY &&
|
||||
!(BIT(c->x86_stepping) & m->steppings))
|
||||
continue;
|
||||
if (m->feature != X86_FEATURE_ANY && !cpu_has(c, m->feature))
|
||||
continue;
|
||||
return m;
|
||||
|
|
|
|||
|
|
@ -910,14 +910,6 @@ static int __init parse_memmap_one(char *p)
|
|||
return -EINVAL;
|
||||
|
||||
if (!strncmp(p, "exactmap", 8)) {
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
/*
|
||||
* If we are doing a crash dump, we still need to know
|
||||
* the real memory size before the original memory map is
|
||||
* reset.
|
||||
*/
|
||||
saved_max_pfn = e820__end_of_ram_pfn();
|
||||
#endif
|
||||
e820_table->nr_entries = 0;
|
||||
userdef = 1;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -15,12 +15,9 @@
|
|||
#include <xen/hvc-console.h>
|
||||
#include <asm/pci-direct.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/intel-mid.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <linux/usb/ehci_def.h>
|
||||
#include <linux/usb/xhci-dbgp.h>
|
||||
#include <linux/efi.h>
|
||||
#include <asm/efi.h>
|
||||
#include <asm/pci_x86.h>
|
||||
|
||||
/* Simple VGA output */
|
||||
|
|
|
|||
|
|
@ -291,15 +291,13 @@ void fpu__drop(struct fpu *fpu)
|
|||
}
|
||||
|
||||
/*
|
||||
* Clear FPU registers by setting them up from
|
||||
* the init fpstate:
|
||||
* Clear FPU registers by setting them up from the init fpstate.
|
||||
* Caller must do fpregs_[un]lock() around it.
|
||||
*/
|
||||
static inline void copy_init_fpstate_to_fpregs(void)
|
||||
static inline void copy_init_fpstate_to_fpregs(u64 features_mask)
|
||||
{
|
||||
fpregs_lock();
|
||||
|
||||
if (use_xsave())
|
||||
copy_kernel_to_xregs(&init_fpstate.xsave, -1);
|
||||
copy_kernel_to_xregs(&init_fpstate.xsave, features_mask);
|
||||
else if (static_cpu_has(X86_FEATURE_FXSR))
|
||||
copy_kernel_to_fxregs(&init_fpstate.fxsave);
|
||||
else
|
||||
|
|
@ -307,9 +305,6 @@ static inline void copy_init_fpstate_to_fpregs(void)
|
|||
|
||||
if (boot_cpu_has(X86_FEATURE_OSPKE))
|
||||
copy_init_pkru_to_fpregs();
|
||||
|
||||
fpregs_mark_activate();
|
||||
fpregs_unlock();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -318,18 +313,40 @@ static inline void copy_init_fpstate_to_fpregs(void)
|
|||
* Called by sys_execve(), by the signal handler code and by various
|
||||
* error paths.
|
||||
*/
|
||||
void fpu__clear(struct fpu *fpu)
|
||||
static void fpu__clear(struct fpu *fpu, bool user_only)
|
||||
{
|
||||
WARN_ON_FPU(fpu != ¤t->thread.fpu); /* Almost certainly an anomaly */
|
||||
WARN_ON_FPU(fpu != ¤t->thread.fpu);
|
||||
|
||||
fpu__drop(fpu);
|
||||
if (!static_cpu_has(X86_FEATURE_FPU)) {
|
||||
fpu__drop(fpu);
|
||||
fpu__initialize(fpu);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure fpstate is cleared and initialized.
|
||||
*/
|
||||
fpu__initialize(fpu);
|
||||
if (static_cpu_has(X86_FEATURE_FPU))
|
||||
copy_init_fpstate_to_fpregs();
|
||||
fpregs_lock();
|
||||
|
||||
if (user_only) {
|
||||
if (!fpregs_state_valid(fpu, smp_processor_id()) &&
|
||||
xfeatures_mask_supervisor())
|
||||
copy_kernel_to_xregs(&fpu->state.xsave,
|
||||
xfeatures_mask_supervisor());
|
||||
copy_init_fpstate_to_fpregs(xfeatures_mask_user());
|
||||
} else {
|
||||
copy_init_fpstate_to_fpregs(xfeatures_mask_all);
|
||||
}
|
||||
|
||||
fpregs_mark_activate();
|
||||
fpregs_unlock();
|
||||
}
|
||||
|
||||
void fpu__clear_user_states(struct fpu *fpu)
|
||||
{
|
||||
fpu__clear(fpu, true);
|
||||
}
|
||||
|
||||
void fpu__clear_all(struct fpu *fpu)
|
||||
{
|
||||
fpu__clear(fpu, false);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -224,7 +224,8 @@ static void __init fpu__init_system_xstate_size_legacy(void)
|
|||
*/
|
||||
u64 __init fpu__get_supported_xfeatures_mask(void)
|
||||
{
|
||||
return XCNTXT_MASK;
|
||||
return XFEATURE_MASK_USER_SUPPORTED |
|
||||
XFEATURE_MASK_SUPERVISOR_SUPPORTED;
|
||||
}
|
||||
|
||||
/* Legacy code to initialize eager fpu mode. */
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset,
|
|||
} else {
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, xsave, 0, -1);
|
||||
if (!ret)
|
||||
ret = validate_xstate_header(&xsave->header);
|
||||
ret = validate_user_xstate_header(&xsave->header);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -211,9 +211,9 @@ int copy_fpstate_to_sigframe(void __user *buf, void __user *buf_fx, int size)
|
|||
}
|
||||
|
||||
static inline void
|
||||
sanitize_restored_xstate(union fpregs_state *state,
|
||||
struct user_i387_ia32_struct *ia32_env,
|
||||
u64 xfeatures, int fx_only)
|
||||
sanitize_restored_user_xstate(union fpregs_state *state,
|
||||
struct user_i387_ia32_struct *ia32_env,
|
||||
u64 user_xfeatures, int fx_only)
|
||||
{
|
||||
struct xregs_state *xsave = &state->xsave;
|
||||
struct xstate_header *header = &xsave->header;
|
||||
|
|
@ -226,13 +226,22 @@ sanitize_restored_xstate(union fpregs_state *state,
|
|||
*/
|
||||
|
||||
/*
|
||||
* Init the state that is not present in the memory
|
||||
* layout and not enabled by the OS.
|
||||
* 'user_xfeatures' might have bits clear which are
|
||||
* set in header->xfeatures. This represents features that
|
||||
* were in init state prior to a signal delivery, and need
|
||||
* to be reset back to the init state. Clear any user
|
||||
* feature bits which are set in the kernel buffer to get
|
||||
* them back to the init state.
|
||||
*
|
||||
* Supervisor state is unchanged by input from userspace.
|
||||
* Ensure supervisor state bits stay set and supervisor
|
||||
* state is not modified.
|
||||
*/
|
||||
if (fx_only)
|
||||
header->xfeatures = XFEATURE_MASK_FPSSE;
|
||||
else
|
||||
header->xfeatures &= xfeatures;
|
||||
header->xfeatures &= user_xfeatures |
|
||||
xfeatures_mask_supervisor();
|
||||
}
|
||||
|
||||
if (use_fxsr()) {
|
||||
|
|
@ -252,16 +261,24 @@ sanitize_restored_xstate(union fpregs_state *state,
|
|||
*/
|
||||
static int copy_user_to_fpregs_zeroing(void __user *buf, u64 xbv, int fx_only)
|
||||
{
|
||||
u64 init_bv;
|
||||
int r;
|
||||
|
||||
if (use_xsave()) {
|
||||
if (fx_only) {
|
||||
u64 init_bv = xfeatures_mask & ~XFEATURE_MASK_FPSSE;
|
||||
copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
|
||||
return copy_user_to_fxregs(buf);
|
||||
} else {
|
||||
u64 init_bv = xfeatures_mask & ~xbv;
|
||||
if (unlikely(init_bv))
|
||||
init_bv = xfeatures_mask_user() & ~XFEATURE_MASK_FPSSE;
|
||||
|
||||
r = copy_user_to_fxregs(buf);
|
||||
if (!r)
|
||||
copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
|
||||
return copy_user_to_xregs(buf, xbv);
|
||||
return r;
|
||||
} else {
|
||||
init_bv = xfeatures_mask_user() & ~xbv;
|
||||
|
||||
r = copy_user_to_xregs(buf, xbv);
|
||||
if (!r && unlikely(init_bv))
|
||||
copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
|
||||
return r;
|
||||
}
|
||||
} else if (use_fxsr()) {
|
||||
return copy_user_to_fxregs(buf);
|
||||
|
|
@ -277,7 +294,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
|||
struct task_struct *tsk = current;
|
||||
struct fpu *fpu = &tsk->thread.fpu;
|
||||
struct user_i387_ia32_struct env;
|
||||
u64 xfeatures = 0;
|
||||
u64 user_xfeatures = 0;
|
||||
int fx_only = 0;
|
||||
int ret = 0;
|
||||
|
||||
|
|
@ -285,7 +302,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
|||
IS_ENABLED(CONFIG_IA32_EMULATION));
|
||||
|
||||
if (!buf) {
|
||||
fpu__clear(fpu);
|
||||
fpu__clear_user_states(fpu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -310,32 +327,14 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
|||
trace_x86_fpu_xstate_check_failed(fpu);
|
||||
} else {
|
||||
state_size = fx_sw_user.xstate_size;
|
||||
xfeatures = fx_sw_user.xfeatures;
|
||||
user_xfeatures = fx_sw_user.xfeatures;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The current state of the FPU registers does not matter. By setting
|
||||
* TIF_NEED_FPU_LOAD unconditionally it is ensured that the our xstate
|
||||
* is not modified on context switch and that the xstate is considered
|
||||
* to be loaded again on return to userland (overriding last_cpu avoids
|
||||
* the optimisation).
|
||||
*/
|
||||
set_thread_flag(TIF_NEED_FPU_LOAD);
|
||||
__fpu_invalidate_fpregs_state(fpu);
|
||||
|
||||
if ((unsigned long)buf_fx % 64)
|
||||
fx_only = 1;
|
||||
/*
|
||||
* For 32-bit frames with fxstate, copy the fxstate so it can be
|
||||
* reconstructed later.
|
||||
*/
|
||||
if (ia32_fxstate) {
|
||||
ret = __copy_from_user(&env, buf, sizeof(env));
|
||||
if (ret)
|
||||
goto err_out;
|
||||
envp = &env;
|
||||
} else {
|
||||
|
||||
if (!ia32_fxstate) {
|
||||
/*
|
||||
* Attempt to restore the FPU registers directly from user
|
||||
* memory. For that to succeed, the user access cannot cause
|
||||
|
|
@ -345,20 +344,65 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
|||
*/
|
||||
fpregs_lock();
|
||||
pagefault_disable();
|
||||
ret = copy_user_to_fpregs_zeroing(buf_fx, xfeatures, fx_only);
|
||||
ret = copy_user_to_fpregs_zeroing(buf_fx, user_xfeatures, fx_only);
|
||||
pagefault_enable();
|
||||
if (!ret) {
|
||||
|
||||
/*
|
||||
* Restore supervisor states: previous context switch
|
||||
* etc has done XSAVES and saved the supervisor states
|
||||
* in the kernel buffer from which they can be restored
|
||||
* now.
|
||||
*
|
||||
* We cannot do a single XRSTORS here - which would
|
||||
* be nice - because the rest of the FPU registers are
|
||||
* being restored from a user buffer directly. The
|
||||
* single XRSTORS happens below, when the user buffer
|
||||
* has been copied to the kernel one.
|
||||
*/
|
||||
if (test_thread_flag(TIF_NEED_FPU_LOAD) &&
|
||||
xfeatures_mask_supervisor())
|
||||
copy_kernel_to_xregs(&fpu->state.xsave,
|
||||
xfeatures_mask_supervisor());
|
||||
fpregs_mark_activate();
|
||||
fpregs_unlock();
|
||||
return 0;
|
||||
}
|
||||
fpregs_deactivate(fpu);
|
||||
fpregs_unlock();
|
||||
} else {
|
||||
/*
|
||||
* For 32-bit frames with fxstate, copy the fxstate so it can
|
||||
* be reconstructed later.
|
||||
*/
|
||||
ret = __copy_from_user(&env, buf, sizeof(env));
|
||||
if (ret)
|
||||
goto err_out;
|
||||
envp = &env;
|
||||
}
|
||||
|
||||
/*
|
||||
* By setting TIF_NEED_FPU_LOAD it is ensured that our xstate is
|
||||
* not modified on context switch and that the xstate is considered
|
||||
* to be loaded again on return to userland (overriding last_cpu avoids
|
||||
* the optimisation).
|
||||
*/
|
||||
fpregs_lock();
|
||||
|
||||
if (!test_thread_flag(TIF_NEED_FPU_LOAD)) {
|
||||
|
||||
/*
|
||||
* Supervisor states are not modified by user space input. Save
|
||||
* current supervisor states first and invalidate the FPU regs.
|
||||
*/
|
||||
if (xfeatures_mask_supervisor())
|
||||
copy_supervisor_to_kernel(&fpu->state.xsave);
|
||||
set_thread_flag(TIF_NEED_FPU_LOAD);
|
||||
}
|
||||
__fpu_invalidate_fpregs_state(fpu);
|
||||
fpregs_unlock();
|
||||
|
||||
if (use_xsave() && !fx_only) {
|
||||
u64 init_bv = xfeatures_mask & ~xfeatures;
|
||||
u64 init_bv = xfeatures_mask_user() & ~user_xfeatures;
|
||||
|
||||
if (using_compacted_format()) {
|
||||
ret = copy_user_to_xstate(&fpu->state.xsave, buf_fx);
|
||||
|
|
@ -366,17 +410,24 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
|||
ret = __copy_from_user(&fpu->state.xsave, buf_fx, state_size);
|
||||
|
||||
if (!ret && state_size > offsetof(struct xregs_state, header))
|
||||
ret = validate_xstate_header(&fpu->state.xsave.header);
|
||||
ret = validate_user_xstate_header(&fpu->state.xsave.header);
|
||||
}
|
||||
if (ret)
|
||||
goto err_out;
|
||||
|
||||
sanitize_restored_xstate(&fpu->state, envp, xfeatures, fx_only);
|
||||
sanitize_restored_user_xstate(&fpu->state, envp, user_xfeatures,
|
||||
fx_only);
|
||||
|
||||
fpregs_lock();
|
||||
if (unlikely(init_bv))
|
||||
copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
|
||||
ret = copy_kernel_to_xregs_err(&fpu->state.xsave, xfeatures);
|
||||
|
||||
/*
|
||||
* Restore previously saved supervisor xstates along with
|
||||
* copied-in user xstates.
|
||||
*/
|
||||
ret = copy_kernel_to_xregs_err(&fpu->state.xsave,
|
||||
user_xfeatures | xfeatures_mask_supervisor());
|
||||
|
||||
} else if (use_fxsr()) {
|
||||
ret = __copy_from_user(&fpu->state.fxsave, buf_fx, state_size);
|
||||
|
|
@ -385,11 +436,14 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
sanitize_restored_xstate(&fpu->state, envp, xfeatures, fx_only);
|
||||
sanitize_restored_user_xstate(&fpu->state, envp, user_xfeatures,
|
||||
fx_only);
|
||||
|
||||
fpregs_lock();
|
||||
if (use_xsave()) {
|
||||
u64 init_bv = xfeatures_mask & ~XFEATURE_MASK_FPSSE;
|
||||
u64 init_bv;
|
||||
|
||||
init_bv = xfeatures_mask_user() & ~XFEATURE_MASK_FPSSE;
|
||||
copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
|
||||
}
|
||||
|
||||
|
|
@ -410,7 +464,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
|||
|
||||
err_out:
|
||||
if (ret)
|
||||
fpu__clear(fpu);
|
||||
fpu__clear_user_states(fpu);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -465,7 +519,7 @@ void fpu__init_prepare_fx_sw_frame(void)
|
|||
|
||||
fx_sw_reserved.magic1 = FP_XSTATE_MAGIC1;
|
||||
fx_sw_reserved.extended_size = size;
|
||||
fx_sw_reserved.xfeatures = xfeatures_mask;
|
||||
fx_sw_reserved.xfeatures = xfeatures_mask_user();
|
||||
fx_sw_reserved.xstate_size = fpu_user_xstate_size;
|
||||
|
||||
if (IS_ENABLED(CONFIG_IA32_EMULATION) ||
|
||||
|
|
|
|||
|
|
@ -54,13 +54,15 @@ static short xsave_cpuid_features[] __initdata = {
|
|||
};
|
||||
|
||||
/*
|
||||
* Mask of xstate features supported by the CPU and the kernel:
|
||||
* This represents the full set of bits that should ever be set in a kernel
|
||||
* XSAVE buffer, both supervisor and user xstates.
|
||||
*/
|
||||
u64 xfeatures_mask __read_mostly;
|
||||
u64 xfeatures_mask_all __read_mostly;
|
||||
|
||||
static unsigned int xstate_offsets[XFEATURE_MAX] = { [ 0 ... XFEATURE_MAX - 1] = -1};
|
||||
static unsigned int xstate_sizes[XFEATURE_MAX] = { [ 0 ... XFEATURE_MAX - 1] = -1};
|
||||
static unsigned int xstate_comp_offsets[XFEATURE_MAX] = { [ 0 ... XFEATURE_MAX - 1] = -1};
|
||||
static unsigned int xstate_supervisor_only_offsets[XFEATURE_MAX] = { [ 0 ... XFEATURE_MAX - 1] = -1};
|
||||
|
||||
/*
|
||||
* The XSAVE area of kernel can be in standard or compacted format;
|
||||
|
|
@ -76,7 +78,7 @@ unsigned int fpu_user_xstate_size;
|
|||
*/
|
||||
int cpu_has_xfeatures(u64 xfeatures_needed, const char **feature_name)
|
||||
{
|
||||
u64 xfeatures_missing = xfeatures_needed & ~xfeatures_mask;
|
||||
u64 xfeatures_missing = xfeatures_needed & ~xfeatures_mask_all;
|
||||
|
||||
if (unlikely(feature_name)) {
|
||||
long xfeature_idx, max_idx;
|
||||
|
|
@ -150,7 +152,7 @@ void fpstate_sanitize_xstate(struct fpu *fpu)
|
|||
* None of the feature bits are in init state. So nothing else
|
||||
* to do for us, as the memory layout is up to date.
|
||||
*/
|
||||
if ((xfeatures & xfeatures_mask) == xfeatures_mask)
|
||||
if ((xfeatures & xfeatures_mask_all) == xfeatures_mask_all)
|
||||
return;
|
||||
|
||||
/*
|
||||
|
|
@ -177,7 +179,7 @@ void fpstate_sanitize_xstate(struct fpu *fpu)
|
|||
* in a special way already:
|
||||
*/
|
||||
feature_bit = 0x2;
|
||||
xfeatures = (xfeatures_mask & ~xfeatures) >> 2;
|
||||
xfeatures = (xfeatures_mask_user() & ~xfeatures) >> 2;
|
||||
|
||||
/*
|
||||
* Update all the remaining memory layouts according to their
|
||||
|
|
@ -205,30 +207,39 @@ void fpstate_sanitize_xstate(struct fpu *fpu)
|
|||
*/
|
||||
void fpu__init_cpu_xstate(void)
|
||||
{
|
||||
if (!boot_cpu_has(X86_FEATURE_XSAVE) || !xfeatures_mask)
|
||||
u64 unsup_bits;
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_XSAVE) || !xfeatures_mask_all)
|
||||
return;
|
||||
/*
|
||||
* Make it clear that XSAVES supervisor states are not yet
|
||||
* implemented should anyone expect it to work by changing
|
||||
* bits in XFEATURE_MASK_* macros and XCR0.
|
||||
* Unsupported supervisor xstates should not be found in
|
||||
* the xfeatures mask.
|
||||
*/
|
||||
WARN_ONCE((xfeatures_mask & XFEATURE_MASK_SUPERVISOR),
|
||||
"x86/fpu: XSAVES supervisor states are not yet implemented.\n");
|
||||
unsup_bits = xfeatures_mask_all & XFEATURE_MASK_SUPERVISOR_UNSUPPORTED;
|
||||
WARN_ONCE(unsup_bits, "x86/fpu: Found unsupported supervisor xstates: 0x%llx\n",
|
||||
unsup_bits);
|
||||
|
||||
xfeatures_mask &= ~XFEATURE_MASK_SUPERVISOR;
|
||||
xfeatures_mask_all &= ~XFEATURE_MASK_SUPERVISOR_UNSUPPORTED;
|
||||
|
||||
cr4_set_bits(X86_CR4_OSXSAVE);
|
||||
xsetbv(XCR_XFEATURE_ENABLED_MASK, xfeatures_mask);
|
||||
|
||||
/*
|
||||
* XCR_XFEATURE_ENABLED_MASK (aka. XCR0) sets user features
|
||||
* managed by XSAVE{C, OPT, S} and XRSTOR{S}. Only XSAVE user
|
||||
* states can be set here.
|
||||
*/
|
||||
xsetbv(XCR_XFEATURE_ENABLED_MASK, xfeatures_mask_user());
|
||||
|
||||
/*
|
||||
* MSR_IA32_XSS sets supervisor states managed by XSAVES.
|
||||
*/
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVES))
|
||||
wrmsrl(MSR_IA32_XSS, xfeatures_mask_supervisor());
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that in the future we will likely need a pair of
|
||||
* functions here: one for user xstates and the other for
|
||||
* system xstates. For now, they are the same.
|
||||
*/
|
||||
static int xfeature_enabled(enum xfeature xfeature)
|
||||
static bool xfeature_enabled(enum xfeature xfeature)
|
||||
{
|
||||
return !!(xfeatures_mask & (1UL << xfeature));
|
||||
return xfeatures_mask_all & BIT_ULL(xfeature);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -382,6 +393,33 @@ static void __init setup_xstate_comp_offsets(void)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup offsets of a supervisor-state-only XSAVES buffer:
|
||||
*
|
||||
* The offsets stored in xstate_comp_offsets[] only work for one specific
|
||||
* value of the Requested Feature BitMap (RFBM). In cases where a different
|
||||
* RFBM value is used, a different set of offsets is required. This set of
|
||||
* offsets is for when RFBM=xfeatures_mask_supervisor().
|
||||
*/
|
||||
static void __init setup_supervisor_only_offsets(void)
|
||||
{
|
||||
unsigned int next_offset;
|
||||
int i;
|
||||
|
||||
next_offset = FXSAVE_SIZE + XSAVE_HDR_SIZE;
|
||||
|
||||
for (i = FIRST_EXTENDED_XFEATURE; i < XFEATURE_MAX; i++) {
|
||||
if (!xfeature_enabled(i) || !xfeature_is_supervisor(i))
|
||||
continue;
|
||||
|
||||
if (xfeature_is_aligned(i))
|
||||
next_offset = ALIGN(next_offset, 64);
|
||||
|
||||
xstate_supervisor_only_offsets[i] = next_offset;
|
||||
next_offset += xstate_sizes[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print out xstate component offsets and sizes
|
||||
*/
|
||||
|
|
@ -415,7 +453,7 @@ static void __init setup_init_fpu_buf(void)
|
|||
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVES))
|
||||
init_fpstate.xsave.header.xcomp_bv = XCOMP_BV_COMPACTED_FORMAT |
|
||||
xfeatures_mask;
|
||||
xfeatures_mask_all;
|
||||
|
||||
/*
|
||||
* Init all the features state with header.xfeatures being 0x0
|
||||
|
|
@ -438,7 +476,7 @@ static int xfeature_uncompacted_offset(int xfeature_nr)
|
|||
* format. Checking a supervisor state's uncompacted offset is
|
||||
* an error.
|
||||
*/
|
||||
if (XFEATURE_MASK_SUPERVISOR & BIT_ULL(xfeature_nr)) {
|
||||
if (XFEATURE_MASK_SUPERVISOR_ALL & BIT_ULL(xfeature_nr)) {
|
||||
WARN_ONCE(1, "No fixed offset for xstate %d\n", xfeature_nr);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -472,10 +510,10 @@ int using_compacted_format(void)
|
|||
}
|
||||
|
||||
/* Validate an xstate header supplied by userspace (ptrace or sigreturn) */
|
||||
int validate_xstate_header(const struct xstate_header *hdr)
|
||||
int validate_user_xstate_header(const struct xstate_header *hdr)
|
||||
{
|
||||
/* No unknown or supervisor features may be set */
|
||||
if (hdr->xfeatures & (~xfeatures_mask | XFEATURE_MASK_SUPERVISOR))
|
||||
if (hdr->xfeatures & ~xfeatures_mask_user())
|
||||
return -EINVAL;
|
||||
|
||||
/* Userspace must use the uncompacted format */
|
||||
|
|
@ -610,15 +648,12 @@ static void do_extra_xstate_size_checks(void)
|
|||
|
||||
|
||||
/*
|
||||
* Get total size of enabled xstates in XCR0/xfeatures_mask.
|
||||
* Get total size of enabled xstates in XCR0 | IA32_XSS.
|
||||
*
|
||||
* Note the SDM's wording here. "sub-function 0" only enumerates
|
||||
* the size of the *user* states. If we use it to size a buffer
|
||||
* that we use 'XSAVES' on, we could potentially overflow the
|
||||
* buffer because 'XSAVES' saves system states too.
|
||||
*
|
||||
* Note that we do not currently set any bits on IA32_XSS so
|
||||
* 'XCR0 | IA32_XSS == XCR0' for now.
|
||||
*/
|
||||
static unsigned int __init get_xsaves_size(void)
|
||||
{
|
||||
|
|
@ -700,7 +735,7 @@ static int __init init_xstate_size(void)
|
|||
*/
|
||||
static void fpu__init_disable_system_xstate(void)
|
||||
{
|
||||
xfeatures_mask = 0;
|
||||
xfeatures_mask_all = 0;
|
||||
cr4_clear_bits(X86_CR4_OSXSAVE);
|
||||
setup_clear_cpu_cap(X86_FEATURE_XSAVE);
|
||||
}
|
||||
|
|
@ -735,16 +770,26 @@ void __init fpu__init_system_xstate(void)
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find user xstates supported by the processor.
|
||||
*/
|
||||
cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
|
||||
xfeatures_mask = eax + ((u64)edx << 32);
|
||||
xfeatures_mask_all = eax + ((u64)edx << 32);
|
||||
|
||||
if ((xfeatures_mask & XFEATURE_MASK_FPSSE) != XFEATURE_MASK_FPSSE) {
|
||||
/*
|
||||
* Find supervisor xstates supported by the processor.
|
||||
*/
|
||||
cpuid_count(XSTATE_CPUID, 1, &eax, &ebx, &ecx, &edx);
|
||||
xfeatures_mask_all |= ecx + ((u64)edx << 32);
|
||||
|
||||
if ((xfeatures_mask_user() & XFEATURE_MASK_FPSSE) != XFEATURE_MASK_FPSSE) {
|
||||
/*
|
||||
* This indicates that something really unexpected happened
|
||||
* with the enumeration. Disable XSAVE and try to continue
|
||||
* booting without it. This is too early to BUG().
|
||||
*/
|
||||
pr_err("x86/fpu: FP/SSE not present amongst the CPU's xstate features: 0x%llx.\n", xfeatures_mask);
|
||||
pr_err("x86/fpu: FP/SSE not present amongst the CPU's xstate features: 0x%llx.\n",
|
||||
xfeatures_mask_all);
|
||||
goto out_disable;
|
||||
}
|
||||
|
||||
|
|
@ -753,10 +798,10 @@ void __init fpu__init_system_xstate(void)
|
|||
*/
|
||||
for (i = 0; i < ARRAY_SIZE(xsave_cpuid_features); i++) {
|
||||
if (!boot_cpu_has(xsave_cpuid_features[i]))
|
||||
xfeatures_mask &= ~BIT(i);
|
||||
xfeatures_mask_all &= ~BIT_ULL(i);
|
||||
}
|
||||
|
||||
xfeatures_mask &= fpu__get_supported_xfeatures_mask();
|
||||
xfeatures_mask_all &= fpu__get_supported_xfeatures_mask();
|
||||
|
||||
/* Enable xstate instructions to be able to continue with initialization: */
|
||||
fpu__init_cpu_xstate();
|
||||
|
|
@ -768,15 +813,16 @@ void __init fpu__init_system_xstate(void)
|
|||
* Update info used for ptrace frames; use standard-format size and no
|
||||
* supervisor xstates:
|
||||
*/
|
||||
update_regset_xstate_info(fpu_user_xstate_size, xfeatures_mask & ~XFEATURE_MASK_SUPERVISOR);
|
||||
update_regset_xstate_info(fpu_user_xstate_size, xfeatures_mask_user());
|
||||
|
||||
fpu__init_prepare_fx_sw_frame();
|
||||
setup_init_fpu_buf();
|
||||
setup_xstate_comp_offsets();
|
||||
setup_supervisor_only_offsets();
|
||||
print_xstate_offset_size();
|
||||
|
||||
pr_info("x86/fpu: Enabled xstate features 0x%llx, context size is %d bytes, using '%s' format.\n",
|
||||
xfeatures_mask,
|
||||
xfeatures_mask_all,
|
||||
fpu_kernel_xstate_size,
|
||||
boot_cpu_has(X86_FEATURE_XSAVES) ? "compacted" : "standard");
|
||||
return;
|
||||
|
|
@ -795,7 +841,14 @@ void fpu__resume_cpu(void)
|
|||
* Restore XCR0 on xsave capable CPUs:
|
||||
*/
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVE))
|
||||
xsetbv(XCR_XFEATURE_ENABLED_MASK, xfeatures_mask);
|
||||
xsetbv(XCR_XFEATURE_ENABLED_MASK, xfeatures_mask_user());
|
||||
|
||||
/*
|
||||
* Restore IA32_XSS. The same CPUID bit enumerates support
|
||||
* of XSAVES and MSR_IA32_XSS.
|
||||
*/
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVES))
|
||||
wrmsrl(MSR_IA32_XSS, xfeatures_mask_supervisor());
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -840,10 +893,9 @@ void *get_xsave_addr(struct xregs_state *xsave, int xfeature_nr)
|
|||
|
||||
/*
|
||||
* We should not ever be requesting features that we
|
||||
* have not enabled. Remember that xfeatures_mask is
|
||||
* what we write to the XCR0 register.
|
||||
* have not enabled.
|
||||
*/
|
||||
WARN_ONCE(!(xfeatures_mask & BIT_ULL(xfeature_nr)),
|
||||
WARN_ONCE(!(xfeatures_mask_all & BIT_ULL(xfeature_nr)),
|
||||
"get of unsupported state");
|
||||
/*
|
||||
* This assumes the last 'xsave*' instruction to
|
||||
|
|
@ -1010,7 +1062,7 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of
|
|||
*/
|
||||
memset(&header, 0, sizeof(header));
|
||||
header.xfeatures = xsave->header.xfeatures;
|
||||
header.xfeatures &= ~XFEATURE_MASK_SUPERVISOR;
|
||||
header.xfeatures &= xfeatures_mask_user();
|
||||
|
||||
if (header.xfeatures & XFEATURE_MASK_FP)
|
||||
copy_part(0, off_mxcsr,
|
||||
|
|
@ -1090,7 +1142,7 @@ int copy_xstate_to_user(void __user *ubuf, struct xregs_state *xsave, unsigned i
|
|||
*/
|
||||
memset(&header, 0, sizeof(header));
|
||||
header.xfeatures = xsave->header.xfeatures;
|
||||
header.xfeatures &= ~XFEATURE_MASK_SUPERVISOR;
|
||||
header.xfeatures &= xfeatures_mask_user();
|
||||
|
||||
/*
|
||||
* Copy xregs_state->header:
|
||||
|
|
@ -1157,7 +1209,7 @@ int copy_kernel_to_xstate(struct xregs_state *xsave, const void *kbuf)
|
|||
|
||||
memcpy(&hdr, kbuf + offset, size);
|
||||
|
||||
if (validate_xstate_header(&hdr))
|
||||
if (validate_user_xstate_header(&hdr))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < XFEATURE_MAX; i++) {
|
||||
|
|
@ -1183,7 +1235,7 @@ int copy_kernel_to_xstate(struct xregs_state *xsave, const void *kbuf)
|
|||
* The state that came in from userspace was user-state only.
|
||||
* Mask all the user states out of 'xfeatures':
|
||||
*/
|
||||
xsave->header.xfeatures &= XFEATURE_MASK_SUPERVISOR;
|
||||
xsave->header.xfeatures &= XFEATURE_MASK_SUPERVISOR_ALL;
|
||||
|
||||
/*
|
||||
* Add back in the features that came in from userspace:
|
||||
|
|
@ -1211,7 +1263,7 @@ int copy_user_to_xstate(struct xregs_state *xsave, const void __user *ubuf)
|
|||
if (__copy_from_user(&hdr, ubuf + offset, size))
|
||||
return -EFAULT;
|
||||
|
||||
if (validate_xstate_header(&hdr))
|
||||
if (validate_user_xstate_header(&hdr))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < XFEATURE_MAX; i++) {
|
||||
|
|
@ -1239,7 +1291,7 @@ int copy_user_to_xstate(struct xregs_state *xsave, const void __user *ubuf)
|
|||
* The state that came in from userspace was user-state only.
|
||||
* Mask all the user states out of 'xfeatures':
|
||||
*/
|
||||
xsave->header.xfeatures &= XFEATURE_MASK_SUPERVISOR;
|
||||
xsave->header.xfeatures &= XFEATURE_MASK_SUPERVISOR_ALL;
|
||||
|
||||
/*
|
||||
* Add back in the features that came in from userspace:
|
||||
|
|
@ -1249,6 +1301,61 @@ int copy_user_to_xstate(struct xregs_state *xsave, const void __user *ubuf)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save only supervisor states to the kernel buffer. This blows away all
|
||||
* old states, and is intended to be used only in __fpu__restore_sig(), where
|
||||
* user states are restored from the user buffer.
|
||||
*/
|
||||
void copy_supervisor_to_kernel(struct xregs_state *xstate)
|
||||
{
|
||||
struct xstate_header *header;
|
||||
u64 max_bit, min_bit;
|
||||
u32 lmask, hmask;
|
||||
int err, i;
|
||||
|
||||
if (WARN_ON(!boot_cpu_has(X86_FEATURE_XSAVES)))
|
||||
return;
|
||||
|
||||
if (!xfeatures_mask_supervisor())
|
||||
return;
|
||||
|
||||
max_bit = __fls(xfeatures_mask_supervisor());
|
||||
min_bit = __ffs(xfeatures_mask_supervisor());
|
||||
|
||||
lmask = xfeatures_mask_supervisor();
|
||||
hmask = xfeatures_mask_supervisor() >> 32;
|
||||
XSTATE_OP(XSAVES, xstate, lmask, hmask, err);
|
||||
|
||||
/* We should never fault when copying to a kernel buffer: */
|
||||
if (WARN_ON_FPU(err))
|
||||
return;
|
||||
|
||||
/*
|
||||
* At this point, the buffer has only supervisor states and must be
|
||||
* converted back to normal kernel format.
|
||||
*/
|
||||
header = &xstate->header;
|
||||
header->xcomp_bv |= xfeatures_mask_all;
|
||||
|
||||
/*
|
||||
* This only moves states up in the buffer. Start with
|
||||
* the last state and move backwards so that states are
|
||||
* not overwritten until after they are moved. Note:
|
||||
* memmove() allows overlapping src/dst buffers.
|
||||
*/
|
||||
for (i = max_bit; i >= min_bit; i--) {
|
||||
u8 *xbuf = (u8 *)xstate;
|
||||
|
||||
if (!((header->xfeatures >> i) & 1))
|
||||
continue;
|
||||
|
||||
/* Move xfeature 'i' into its normal location */
|
||||
memmove(xbuf + xstate_comp_offsets[i],
|
||||
xbuf + xstate_supervisor_only_offsets[i],
|
||||
xstate_sizes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_PID_ARCH_STATUS
|
||||
/*
|
||||
* Report the amount of time elapsed in millisecond since last AVX512
|
||||
|
|
|
|||
|
|
@ -25,10 +25,6 @@
|
|||
#include <linux/atomic.h>
|
||||
#include <linux/sched/clock.h>
|
||||
|
||||
#if defined(CONFIG_EDAC)
|
||||
#include <linux/edac.h>
|
||||
#endif
|
||||
|
||||
#include <asm/cpu_entry_area.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/mach_traps.h>
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ void flush_thread(void)
|
|||
flush_ptrace_hw_breakpoint(tsk);
|
||||
memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));
|
||||
|
||||
fpu__clear(&tsk->thread.fpu);
|
||||
fpu__clear_all(&tsk->thread.fpu);
|
||||
}
|
||||
|
||||
void disable_TSC(void)
|
||||
|
|
|
|||
|
|
@ -237,6 +237,9 @@ static u64 __init get_ramdisk_image(void)
|
|||
|
||||
ramdisk_image |= (u64)boot_params.ext_ramdisk_image << 32;
|
||||
|
||||
if (ramdisk_image == 0)
|
||||
ramdisk_image = phys_initrd_start;
|
||||
|
||||
return ramdisk_image;
|
||||
}
|
||||
static u64 __init get_ramdisk_size(void)
|
||||
|
|
@ -245,6 +248,9 @@ static u64 __init get_ramdisk_size(void)
|
|||
|
||||
ramdisk_size |= (u64)boot_params.ext_ramdisk_size << 32;
|
||||
|
||||
if (ramdisk_size == 0)
|
||||
ramdisk_size = phys_initrd_size;
|
||||
|
||||
return ramdisk_size;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -732,7 +732,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
|||
/*
|
||||
* Ensure the signal handler starts with the new fpu state.
|
||||
*/
|
||||
fpu__clear(fpu);
|
||||
fpu__clear_user_states(fpu);
|
||||
}
|
||||
signal_setup_done(failed, ksig, stepping);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1384,12 +1384,12 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
|
|||
speculative_store_bypass_ht_init();
|
||||
}
|
||||
|
||||
void arch_enable_nonboot_cpus_begin(void)
|
||||
void arch_thaw_secondary_cpus_begin(void)
|
||||
{
|
||||
set_mtrr_aps_delayed_init();
|
||||
}
|
||||
|
||||
void arch_enable_nonboot_cpus_end(void)
|
||||
void arch_thaw_secondary_cpus_end(void)
|
||||
{
|
||||
mtrr_aps_init();
|
||||
}
|
||||
|
|
@ -1857,24 +1857,25 @@ static bool slv_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq)
|
|||
#include <asm/cpu_device_id.h>
|
||||
#include <asm/intel-family.h>
|
||||
|
||||
#define ICPU(model) \
|
||||
{X86_VENDOR_INTEL, 6, model, X86_FEATURE_APERFMPERF, 0}
|
||||
#define X86_MATCH(model) \
|
||||
X86_MATCH_VENDOR_FAM_MODEL_FEATURE(INTEL, 6, \
|
||||
INTEL_FAM6_##model, X86_FEATURE_APERFMPERF, NULL)
|
||||
|
||||
static const struct x86_cpu_id has_knl_turbo_ratio_limits[] = {
|
||||
ICPU(INTEL_FAM6_XEON_PHI_KNL),
|
||||
ICPU(INTEL_FAM6_XEON_PHI_KNM),
|
||||
X86_MATCH(XEON_PHI_KNL),
|
||||
X86_MATCH(XEON_PHI_KNM),
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct x86_cpu_id has_skx_turbo_ratio_limits[] = {
|
||||
ICPU(INTEL_FAM6_SKYLAKE_X),
|
||||
X86_MATCH(SKYLAKE_X),
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct x86_cpu_id has_glm_turbo_ratio_limits[] = {
|
||||
ICPU(INTEL_FAM6_ATOM_GOLDMONT),
|
||||
ICPU(INTEL_FAM6_ATOM_GOLDMONT_D),
|
||||
ICPU(INTEL_FAM6_ATOM_GOLDMONT_PLUS),
|
||||
X86_MATCH(ATOM_GOLDMONT),
|
||||
X86_MATCH(ATOM_GOLDMONT_D),
|
||||
X86_MATCH(ATOM_GOLDMONT_PLUS),
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -35,8 +35,7 @@
|
|||
#include "../realmode/rm/wakeup.h"
|
||||
|
||||
/* Global pointer to shared data; NULL means no measured launch. */
|
||||
struct tboot *tboot __read_mostly;
|
||||
EXPORT_SYMBOL(tboot);
|
||||
static struct tboot *tboot __read_mostly;
|
||||
|
||||
/* timeout for APs (in secs) to enter wait-for-SIPI state during shutdown */
|
||||
#define AP_WAIT_TIMEOUT 1
|
||||
|
|
@ -46,6 +45,11 @@ EXPORT_SYMBOL(tboot);
|
|||
|
||||
static u8 tboot_uuid[16] __initdata = TBOOT_UUID;
|
||||
|
||||
bool tboot_enabled(void)
|
||||
{
|
||||
return tboot != NULL;
|
||||
}
|
||||
|
||||
void __init tboot_probe(void)
|
||||
{
|
||||
/* Look for valid page-aligned address for shared page. */
|
||||
|
|
|
|||
|
|
@ -121,8 +121,6 @@ __ref void *alloc_low_pages(unsigned int num)
|
|||
} else {
|
||||
pfn = pgt_buf_end;
|
||||
pgt_buf_end += num;
|
||||
printk(KERN_DEBUG "BRK [%#010lx, %#010lx] PGTABLE\n",
|
||||
pfn << PAGE_SHIFT, (pgt_buf_end << PAGE_SHIFT) - 1);
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,9 @@
|
|||
#include <linux/sched/signal.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/elf-randomize.h>
|
||||
#include <asm/elf.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "physaddr.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -27,40 +27,6 @@
|
|||
|
||||
#include "numa_internal.h"
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
/*
|
||||
* 4) physnode_map - the mapping between a pfn and owning node
|
||||
* physnode_map keeps track of the physical memory layout of a generic
|
||||
* numa node on a 64Mb break (each element of the array will
|
||||
* represent 64Mb of memory and will be marked by the node id. so,
|
||||
* if the first gig is on node 0, and the second gig is on node 1
|
||||
* physnode_map will contain:
|
||||
*
|
||||
* physnode_map[0-15] = 0;
|
||||
* physnode_map[16-31] = 1;
|
||||
* physnode_map[32- ] = -1;
|
||||
*/
|
||||
s8 physnode_map[MAX_SECTIONS] __read_mostly = { [0 ... (MAX_SECTIONS - 1)] = -1};
|
||||
EXPORT_SYMBOL(physnode_map);
|
||||
|
||||
void memory_present(int nid, unsigned long start, unsigned long end)
|
||||
{
|
||||
unsigned long pfn;
|
||||
|
||||
printk(KERN_INFO "Node: %d, start_pfn: %lx, end_pfn: %lx\n",
|
||||
nid, start, end);
|
||||
printk(KERN_DEBUG " Setting physnode_map array to node %d for pfns:\n", nid);
|
||||
printk(KERN_DEBUG " ");
|
||||
start = round_down(start, PAGES_PER_SECTION);
|
||||
end = round_up(end, PAGES_PER_SECTION);
|
||||
for (pfn = start; pfn < end; pfn += PAGES_PER_SECTION) {
|
||||
physnode_map[pfn / PAGES_PER_SECTION] = nid;
|
||||
printk(KERN_CONT "%lx ", pfn);
|
||||
}
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
extern unsigned long highend_pfn, highstart_pfn;
|
||||
|
||||
void __init initmem_init(void)
|
||||
|
|
|
|||
|
|
@ -62,12 +62,12 @@ static unsigned long efi_runtime, efi_nr_tables;
|
|||
unsigned long efi_fw_vendor, efi_config_table;
|
||||
|
||||
static const efi_config_table_type_t arch_tables[] __initconst = {
|
||||
{EFI_PROPERTIES_TABLE_GUID, "PROP", &prop_phys},
|
||||
{UGA_IO_PROTOCOL_GUID, "UGA", &uga_phys},
|
||||
{EFI_PROPERTIES_TABLE_GUID, &prop_phys, "PROP" },
|
||||
{UGA_IO_PROTOCOL_GUID, &uga_phys, "UGA" },
|
||||
#ifdef CONFIG_X86_UV
|
||||
{UV_SYSTEM_TABLE_GUID, "UVsystab", &uv_systab_phys},
|
||||
{UV_SYSTEM_TABLE_GUID, &uv_systab_phys, "UVsystab" },
|
||||
#endif
|
||||
{NULL_GUID, NULL, NULL},
|
||||
{},
|
||||
};
|
||||
|
||||
static const unsigned long * const efi_tables[] = {
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ static s64 __uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
|
|||
return ret;
|
||||
}
|
||||
|
||||
s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
|
||||
static s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4,
|
||||
u64 a5)
|
||||
{
|
||||
s64 ret;
|
||||
|
||||
|
|
@ -57,10 +58,9 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uv_bios_call);
|
||||
|
||||
s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
|
||||
u64 a4, u64 a5)
|
||||
static s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
|
||||
u64 a4, u64 a5)
|
||||
{
|
||||
unsigned long bios_flags;
|
||||
s64 ret;
|
||||
|
|
@ -77,18 +77,13 @@ s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
long sn_partition_id;
|
||||
EXPORT_SYMBOL_GPL(sn_partition_id);
|
||||
long sn_coherency_id;
|
||||
EXPORT_SYMBOL_GPL(sn_coherency_id);
|
||||
long sn_region_size;
|
||||
EXPORT_SYMBOL_GPL(sn_region_size);
|
||||
long system_serial_number;
|
||||
EXPORT_SYMBOL_GPL(system_serial_number);
|
||||
int uv_type;
|
||||
EXPORT_SYMBOL_GPL(uv_type);
|
||||
|
||||
|
||||
s64 uv_bios_get_sn_info(int fc, int *uvtype, long *partid, long *coher,
|
||||
long *region, long *ssn)
|
||||
|
|
@ -115,7 +110,6 @@ s64 uv_bios_get_sn_info(int fc, int *uvtype, long *partid, long *coher,
|
|||
*ssn = v1;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uv_bios_get_sn_info);
|
||||
|
||||
int
|
||||
uv_bios_mq_watchlist_alloc(unsigned long addr, unsigned int mq_size,
|
||||
|
|
@ -166,7 +160,6 @@ s64 uv_bios_freq_base(u64 clock_type, u64 *ticks_per_second)
|
|||
return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type,
|
||||
(u64)ticks_per_second, 0, 0, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uv_bios_freq_base);
|
||||
|
||||
/*
|
||||
* uv_bios_set_legacy_vga_target - Set Legacy VGA I/O Target
|
||||
|
|
@ -185,7 +178,6 @@ int uv_bios_set_legacy_vga_target(bool decode, int domain, int bus)
|
|||
return uv_bios_call(UV_BIOS_SET_LEGACY_VGA_TARGET,
|
||||
(u64)decode, (u64)domain, (u64)bus, 0, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uv_bios_set_legacy_vga_target);
|
||||
|
||||
int uv_bios_init(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ static ssize_t partition_id_show(struct kobject *kobj,
|
|||
static ssize_t coherence_id_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%ld\n", uv_partition_coherence_id());
|
||||
return snprintf(buf, PAGE_SIZE, "%ld\n", sn_coherency_id);
|
||||
}
|
||||
|
||||
static struct kobj_attribute partition_id_attr =
|
||||
|
|
|
|||
|
|
@ -307,7 +307,7 @@ int hibernate_resume_nonboot_cpu_disable(void)
|
|||
if (ret)
|
||||
return ret;
|
||||
smp_ops.play_dead = resume_play_dead;
|
||||
ret = disable_nonboot_cpus();
|
||||
ret = freeze_secondary_cpus(0);
|
||||
smp_ops.play_dead = play_dead;
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ static efi_system_table_t efi_systab_xen __initdata = {
|
|||
.fw_vendor = EFI_INVALID_TABLE_ADDR, /* Initialized later. */
|
||||
.fw_revision = 0, /* Initialized later. */
|
||||
.con_in_handle = EFI_INVALID_TABLE_ADDR, /* Not used under Xen. */
|
||||
.con_in = EFI_INVALID_TABLE_ADDR, /* Not used under Xen. */
|
||||
.con_in = NULL, /* Not used under Xen. */
|
||||
.con_out_handle = EFI_INVALID_TABLE_ADDR, /* Not used under Xen. */
|
||||
.con_out = NULL, /* Not used under Xen. */
|
||||
.stderr_handle = EFI_INVALID_TABLE_ADDR, /* Not used under Xen. */
|
||||
|
|
|
|||
|
|
@ -106,12 +106,12 @@ config EFI_PARAMS_FROM_FDT
|
|||
config EFI_RUNTIME_WRAPPERS
|
||||
bool
|
||||
|
||||
config EFI_ARMSTUB
|
||||
config EFI_GENERIC_STUB
|
||||
bool
|
||||
|
||||
config EFI_ARMSTUB_DTB_LOADER
|
||||
bool "Enable the DTB loader"
|
||||
depends on EFI_ARMSTUB
|
||||
depends on EFI_GENERIC_STUB
|
||||
default y
|
||||
help
|
||||
Select this config option to add support for the dtb= command
|
||||
|
|
@ -124,6 +124,17 @@ config EFI_ARMSTUB_DTB_LOADER
|
|||
functionality for bootloaders that do not have such support
|
||||
this option is necessary.
|
||||
|
||||
config EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER
|
||||
bool "Enable the command line initrd loader" if !X86
|
||||
depends on EFI_STUB && (EFI_GENERIC_STUB || X86)
|
||||
default y
|
||||
help
|
||||
Select this config option to add support for the initrd= command
|
||||
line parameter, allowing an initrd that resides on the same volume
|
||||
as the kernel image to be loaded into memory.
|
||||
|
||||
This method is deprecated.
|
||||
|
||||
config EFI_BOOTLOADER_CONTROL
|
||||
tristate "EFI Bootloader Control"
|
||||
depends on EFI_VARS
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@ static phys_addr_t __init efi_to_phys(unsigned long addr)
|
|||
static __initdata unsigned long screen_info_table = EFI_INVALID_TABLE_ADDR;
|
||||
|
||||
static const efi_config_table_type_t arch_tables[] __initconst = {
|
||||
{LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, NULL, &screen_info_table},
|
||||
{NULL_GUID, NULL, NULL}
|
||||
{LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table},
|
||||
{}
|
||||
};
|
||||
|
||||
static void __init init_screen_info(void)
|
||||
|
|
|
|||
|
|
@ -499,21 +499,21 @@ void __init efi_mem_reserve(phys_addr_t addr, u64 size)
|
|||
}
|
||||
|
||||
static const efi_config_table_type_t common_tables[] __initconst = {
|
||||
{ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
|
||||
{ACPI_TABLE_GUID, "ACPI", &efi.acpi},
|
||||
{SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
|
||||
{SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
|
||||
{EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
|
||||
{EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi_mem_attr_table},
|
||||
{LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi_rng_seed},
|
||||
{LINUX_EFI_TPM_EVENT_LOG_GUID, "TPMEventLog", &efi.tpm_log},
|
||||
{LINUX_EFI_TPM_FINAL_LOG_GUID, "TPMFinalLog", &efi.tpm_final_log},
|
||||
{LINUX_EFI_MEMRESERVE_TABLE_GUID, "MEMRESERVE", &mem_reserve},
|
||||
{EFI_RT_PROPERTIES_TABLE_GUID, "RTPROP", &rt_prop},
|
||||
{ACPI_20_TABLE_GUID, &efi.acpi20, "ACPI 2.0" },
|
||||
{ACPI_TABLE_GUID, &efi.acpi, "ACPI" },
|
||||
{SMBIOS_TABLE_GUID, &efi.smbios, "SMBIOS" },
|
||||
{SMBIOS3_TABLE_GUID, &efi.smbios3, "SMBIOS 3.0" },
|
||||
{EFI_SYSTEM_RESOURCE_TABLE_GUID, &efi.esrt, "ESRT" },
|
||||
{EFI_MEMORY_ATTRIBUTES_TABLE_GUID, &efi_mem_attr_table, "MEMATTR" },
|
||||
{LINUX_EFI_RANDOM_SEED_TABLE_GUID, &efi_rng_seed, "RNG" },
|
||||
{LINUX_EFI_TPM_EVENT_LOG_GUID, &efi.tpm_log, "TPMEventLog" },
|
||||
{LINUX_EFI_TPM_FINAL_LOG_GUID, &efi.tpm_final_log, "TPMFinalLog" },
|
||||
{LINUX_EFI_MEMRESERVE_TABLE_GUID, &mem_reserve, "MEMRESERVE" },
|
||||
{EFI_RT_PROPERTIES_TABLE_GUID, &rt_prop, "RTPROP" },
|
||||
#ifdef CONFIG_EFI_RCI2_TABLE
|
||||
{DELLEMC_EFI_RCI2_TABLE_GUID, NULL, &rci2_table_phys},
|
||||
{DELLEMC_EFI_RCI2_TABLE_GUID, &rci2_table_phys },
|
||||
#endif
|
||||
{NULL_GUID, NULL, NULL},
|
||||
{},
|
||||
};
|
||||
|
||||
static __init int match_config_table(const efi_guid_t *guid,
|
||||
|
|
@ -522,15 +522,13 @@ static __init int match_config_table(const efi_guid_t *guid,
|
|||
{
|
||||
int i;
|
||||
|
||||
if (table_types) {
|
||||
for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
|
||||
if (!efi_guidcmp(*guid, table_types[i].guid)) {
|
||||
*(table_types[i].ptr) = table;
|
||||
if (table_types[i].name)
|
||||
pr_cont(" %s=0x%lx ",
|
||||
table_types[i].name, table);
|
||||
return 1;
|
||||
}
|
||||
for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
|
||||
if (!efi_guidcmp(*guid, table_types[i].guid)) {
|
||||
*(table_types[i].ptr) = table;
|
||||
if (table_types[i].name[0])
|
||||
pr_cont("%s=0x%lx ",
|
||||
table_types[i].name, table);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -567,7 +565,7 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
|
|||
table = tbl32[i].table;
|
||||
}
|
||||
|
||||
if (!match_config_table(guid, table, common_tables))
|
||||
if (!match_config_table(guid, table, common_tables) && arch_tables)
|
||||
match_config_table(guid, table, arch_tables);
|
||||
}
|
||||
pr_cont("\n");
|
||||
|
|
|
|||
|
|
@ -522,8 +522,10 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var)
|
|||
ret = kobject_init_and_add(&new_var->kobj, &efivar_ktype,
|
||||
NULL, "%s", short_name);
|
||||
kfree(short_name);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kobject_put(&new_var->kobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
kobject_uevent(&new_var->kobj, KOBJ_ADD);
|
||||
if (efivar_entry_add(new_var, &efivar_sysfs_list)) {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#
|
||||
cflags-$(CONFIG_X86_32) := -march=i386
|
||||
cflags-$(CONFIG_X86_64) := -mcmodel=small
|
||||
cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ -O2 \
|
||||
cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \
|
||||
-fPIC -fno-strict-aliasing -mno-red-zone \
|
||||
-mno-mmx -mno-sse -fshort-wchar \
|
||||
-Wno-pointer-sign \
|
||||
|
|
@ -23,13 +23,14 @@ cflags-$(CONFIG_ARM) := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \
|
|||
-fno-builtin -fpic \
|
||||
$(call cc-option,-mno-single-pic-base)
|
||||
|
||||
cflags-$(CONFIG_EFI_ARMSTUB) += -I$(srctree)/scripts/dtc/libfdt
|
||||
cflags-$(CONFIG_EFI_GENERIC_STUB) += -I$(srctree)/scripts/dtc/libfdt
|
||||
|
||||
KBUILD_CFLAGS := $(cflags-y) -DDISABLE_BRANCH_PROFILING \
|
||||
KBUILD_CFLAGS := $(cflags-y) -Os -DDISABLE_BRANCH_PROFILING \
|
||||
-include $(srctree)/drivers/firmware/efi/libstub/hidden.h \
|
||||
-D__NO_FORTIFY \
|
||||
$(call cc-option,-ffreestanding) \
|
||||
$(call cc-option,-fno-stack-protector) \
|
||||
$(call cc-option,-fno-addrsig) \
|
||||
-D__DISABLE_EXPORTS
|
||||
|
||||
# disable LTO
|
||||
|
|
@ -45,16 +46,17 @@ KCOV_INSTRUMENT := n
|
|||
|
||||
lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o \
|
||||
file.o mem.o random.o randomalloc.o pci.o \
|
||||
skip_spaces.o lib-cmdline.o lib-ctype.o
|
||||
skip_spaces.o lib-cmdline.o lib-ctype.o \
|
||||
alignedmem.o relocate.o vsprintf.o
|
||||
|
||||
# include the stub's generic dependencies from lib/ when building for ARM/arm64
|
||||
arm-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c
|
||||
efi-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c
|
||||
|
||||
$(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
|
||||
$(call if_changed_rule,cc_o_c)
|
||||
|
||||
lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o string.o \
|
||||
$(patsubst %.c,lib-%.o,$(arm-deps-y))
|
||||
lib-$(CONFIG_EFI_GENERIC_STUB) += efi-stub.o fdt.o string.o \
|
||||
$(patsubst %.c,lib-%.o,$(efi-deps-y))
|
||||
|
||||
lib-$(CONFIG_ARM) += arm32-stub.o
|
||||
lib-$(CONFIG_ARM64) += arm64-stub.o
|
||||
|
|
@ -62,6 +64,25 @@ lib-$(CONFIG_X86) += x86-stub.o
|
|||
CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
|
||||
CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
|
||||
|
||||
#
|
||||
# For x86, bootloaders like systemd-boot or grub-efi do not zero-initialize the
|
||||
# .bss section, so the .bss section of the EFI stub needs to be included in the
|
||||
# .data section of the compressed kernel to ensure initialization. Rename the
|
||||
# .bss section here so it's easy to pick out in the linker script.
|
||||
#
|
||||
STUBCOPY_FLAGS-$(CONFIG_X86) += --rename-section .bss=.bss.efistub,load,alloc
|
||||
STUBCOPY_RELOC-$(CONFIG_X86_32) := R_386_32
|
||||
STUBCOPY_RELOC-$(CONFIG_X86_64) := R_X86_64_64
|
||||
|
||||
#
|
||||
# ARM discards the .data section because it disallows r/w data in the
|
||||
# decompressor. So move our .data to .data.efistub and .bss to .bss.efistub,
|
||||
# which are preserved explicitly by the decompressor linker script.
|
||||
#
|
||||
STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub \
|
||||
--rename-section .bss=.bss.efistub,load,alloc
|
||||
STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS
|
||||
|
||||
#
|
||||
# arm64 puts the stub in the kernel proper, which will unnecessarily retain all
|
||||
# code indefinitely unless it is annotated as __init/__initdata/__initconst etc.
|
||||
|
|
@ -76,8 +97,8 @@ CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
|
|||
# a verification pass to see if any absolute relocations exist in any of the
|
||||
# object files.
|
||||
#
|
||||
extra-$(CONFIG_EFI_ARMSTUB) := $(lib-y)
|
||||
lib-$(CONFIG_EFI_ARMSTUB) := $(patsubst %.o,%.stub.o,$(lib-y))
|
||||
extra-y := $(lib-y)
|
||||
lib-y := $(patsubst %.o,%.stub.o,$(lib-y))
|
||||
|
||||
STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \
|
||||
--prefix-symbols=__efistub_
|
||||
|
|
@ -100,11 +121,3 @@ quiet_cmd_stubcopy = STUBCPY $@
|
|||
/bin/false; \
|
||||
fi; \
|
||||
$(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@
|
||||
|
||||
#
|
||||
# ARM discards the .data section because it disallows r/w data in the
|
||||
# decompressor. So move our .data to .data.efistub, which is preserved
|
||||
# explicitly by the decompressor linker script.
|
||||
#
|
||||
STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub
|
||||
STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS
|
||||
|
|
|
|||
57
drivers/firmware/efi/libstub/alignedmem.c
Normal file
57
drivers/firmware/efi/libstub/alignedmem.c
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/efi.h>
|
||||
#include <asm/efi.h>
|
||||
|
||||
#include "efistub.h"
|
||||
|
||||
/**
|
||||
* efi_allocate_pages_aligned() - Allocate memory pages
|
||||
* @size: minimum number of bytes to allocate
|
||||
* @addr: On return the address of the first allocated page. The first
|
||||
* allocated page has alignment EFI_ALLOC_ALIGN which is an
|
||||
* architecture dependent multiple of the page size.
|
||||
* @max: the address that the last allocated memory page shall not
|
||||
* exceed
|
||||
* @align: minimum alignment of the base of the allocation
|
||||
*
|
||||
* Allocate pages as EFI_LOADER_DATA. The allocated pages are aligned according
|
||||
* to @align, which should be >= EFI_ALLOC_ALIGN. The last allocated page will
|
||||
* not exceed the address given by @max.
|
||||
*
|
||||
* Return: status code
|
||||
*/
|
||||
efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
|
||||
unsigned long max, unsigned long align)
|
||||
{
|
||||
efi_physical_addr_t alloc_addr;
|
||||
efi_status_t status;
|
||||
int slack;
|
||||
|
||||
if (align < EFI_ALLOC_ALIGN)
|
||||
align = EFI_ALLOC_ALIGN;
|
||||
|
||||
alloc_addr = ALIGN_DOWN(max + 1, align) - 1;
|
||||
size = round_up(size, EFI_ALLOC_ALIGN);
|
||||
slack = align / EFI_PAGE_SIZE - 1;
|
||||
|
||||
status = efi_bs_call(allocate_pages, EFI_ALLOCATE_MAX_ADDRESS,
|
||||
EFI_LOADER_DATA, size / EFI_PAGE_SIZE + slack,
|
||||
&alloc_addr);
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
|
||||
*addr = ALIGN((unsigned long)alloc_addr, align);
|
||||
|
||||
if (slack > 0) {
|
||||
int l = (alloc_addr % align) / EFI_PAGE_SIZE;
|
||||
|
||||
if (l) {
|
||||
efi_bs_call(free_pages, alloc_addr, slack - l + 1);
|
||||
slack = l - 1;
|
||||
}
|
||||
if (slack)
|
||||
efi_bs_call(free_pages, *addr + size, slack);
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ efi_status_t check_platform_features(void)
|
|||
/* LPAE kernels need compatible hardware */
|
||||
block = cpuid_feature_extract(CPUID_EXT_MMFR0, 0);
|
||||
if (block < 5) {
|
||||
pr_efi_err("This LPAE kernel is not supported by your CPU\n");
|
||||
efi_err("This LPAE kernel is not supported by your CPU\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
|
|
@ -120,7 +120,7 @@ static efi_status_t reserve_kernel_base(unsigned long dram_base,
|
|||
*/
|
||||
status = efi_get_memory_map(&map);
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("reserve_kernel_base(): Unable to retrieve memory map.\n");
|
||||
efi_err("reserve_kernel_base(): Unable to retrieve memory map.\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -162,7 +162,7 @@ static efi_status_t reserve_kernel_base(unsigned long dram_base,
|
|||
(end - start) / EFI_PAGE_SIZE,
|
||||
&start);
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("reserve_kernel_base(): alloc failed.\n");
|
||||
efi_err("reserve_kernel_base(): alloc failed.\n");
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
|
@ -219,7 +219,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
|||
|
||||
status = reserve_kernel_base(kernel_base, reserve_addr, reserve_size);
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("Unable to allocate memory for uncompressed kernel.\n");
|
||||
efi_err("Unable to allocate memory for uncompressed kernel.\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
@ -232,7 +232,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
|||
status = efi_relocate_kernel(image_addr, *image_size, *image_size,
|
||||
kernel_base + MAX_UNCOMP_KERNEL_SIZE, 0, 0);
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("Failed to relocate kernel.\n");
|
||||
efi_err("Failed to relocate kernel.\n");
|
||||
efi_free(*reserve_size, *reserve_addr);
|
||||
*reserve_size = 0;
|
||||
return status;
|
||||
|
|
@ -244,7 +244,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
|||
* address at which the zImage is loaded.
|
||||
*/
|
||||
if (*image_addr + *image_size > dram_base + ZIMAGE_OFFSET_LIMIT) {
|
||||
pr_efi_err("Failed to relocate kernel, no low memory available.\n");
|
||||
efi_err("Failed to relocate kernel, no low memory available.\n");
|
||||
efi_free(*reserve_size, *reserve_addr);
|
||||
*reserve_size = 0;
|
||||
efi_free(*image_size, *image_addr);
|
||||
|
|
|
|||
|
|
@ -26,14 +26,23 @@ efi_status_t check_platform_features(void)
|
|||
tg = (read_cpuid(ID_AA64MMFR0_EL1) >> ID_AA64MMFR0_TGRAN_SHIFT) & 0xf;
|
||||
if (tg != ID_AA64MMFR0_TGRAN_SUPPORTED) {
|
||||
if (IS_ENABLED(CONFIG_ARM64_64K_PAGES))
|
||||
pr_efi_err("This 64 KB granular kernel is not supported by your CPU\n");
|
||||
efi_err("This 64 KB granular kernel is not supported by your CPU\n");
|
||||
else
|
||||
pr_efi_err("This 16 KB granular kernel is not supported by your CPU\n");
|
||||
efi_err("This 16 KB granular kernel is not supported by your CPU\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Relocatable kernels can fix up the misalignment with respect to
|
||||
* MIN_KIMG_ALIGN, so they only require a minimum alignment of EFI_KIMG_ALIGN
|
||||
* (which accounts for the alignment of statically allocated objects such as
|
||||
* the swapper stack.)
|
||||
*/
|
||||
static const u64 min_kimg_align = IS_ENABLED(CONFIG_RELOCATABLE) ? EFI_KIMG_ALIGN
|
||||
: MIN_KIMG_ALIGN;
|
||||
|
||||
efi_status_t handle_kernel_image(unsigned long *image_addr,
|
||||
unsigned long *image_size,
|
||||
unsigned long *reserve_addr,
|
||||
|
|
@ -43,106 +52,63 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
|||
{
|
||||
efi_status_t status;
|
||||
unsigned long kernel_size, kernel_memsize = 0;
|
||||
unsigned long preferred_offset;
|
||||
u64 phys_seed = 0;
|
||||
u32 phys_seed = 0;
|
||||
|
||||
if (IS_ENABLED(CONFIG_RANDOMIZE_BASE)) {
|
||||
if (!nokaslr()) {
|
||||
if (!efi_nokaslr) {
|
||||
status = efi_get_random_bytes(sizeof(phys_seed),
|
||||
(u8 *)&phys_seed);
|
||||
if (status == EFI_NOT_FOUND) {
|
||||
pr_efi("EFI_RNG_PROTOCOL unavailable, no randomness supplied\n");
|
||||
efi_info("EFI_RNG_PROTOCOL unavailable, no randomness supplied\n");
|
||||
} else if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("efi_get_random_bytes() failed\n");
|
||||
efi_err("efi_get_random_bytes() failed\n");
|
||||
return status;
|
||||
}
|
||||
} else {
|
||||
pr_efi("KASLR disabled on kernel command line\n");
|
||||
efi_info("KASLR disabled on kernel command line\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The preferred offset of the kernel Image is TEXT_OFFSET bytes beyond
|
||||
* a 2 MB aligned base, which itself may be lower than dram_base, as
|
||||
* long as the resulting offset equals or exceeds it.
|
||||
*/
|
||||
preferred_offset = round_down(dram_base, MIN_KIMG_ALIGN) + TEXT_OFFSET;
|
||||
if (preferred_offset < dram_base)
|
||||
preferred_offset += MIN_KIMG_ALIGN;
|
||||
if (image->image_base != _text)
|
||||
efi_err("FIRMWARE BUG: efi_loaded_image_t::image_base has bogus value\n");
|
||||
|
||||
kernel_size = _edata - _text;
|
||||
kernel_memsize = kernel_size + (_end - _edata);
|
||||
*reserve_size = kernel_memsize + TEXT_OFFSET % min_kimg_align;
|
||||
|
||||
if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && phys_seed != 0) {
|
||||
/*
|
||||
* Produce a displacement in the interval [0, MIN_KIMG_ALIGN)
|
||||
* that doesn't violate this kernel's de-facto alignment
|
||||
* constraints.
|
||||
*/
|
||||
u32 mask = (MIN_KIMG_ALIGN - 1) & ~(EFI_KIMG_ALIGN - 1);
|
||||
u32 offset = (phys_seed >> 32) & mask;
|
||||
|
||||
/*
|
||||
* With CONFIG_RANDOMIZE_TEXT_OFFSET=y, TEXT_OFFSET may not
|
||||
* be a multiple of EFI_KIMG_ALIGN, and we must ensure that
|
||||
* we preserve the misalignment of 'offset' relative to
|
||||
* EFI_KIMG_ALIGN so that statically allocated objects whose
|
||||
* alignment exceeds PAGE_SIZE appear correctly aligned in
|
||||
* memory.
|
||||
*/
|
||||
offset |= TEXT_OFFSET % EFI_KIMG_ALIGN;
|
||||
|
||||
/*
|
||||
* If KASLR is enabled, and we have some randomness available,
|
||||
* locate the kernel at a randomized offset in physical memory.
|
||||
*/
|
||||
*reserve_size = kernel_memsize + offset;
|
||||
status = efi_random_alloc(*reserve_size,
|
||||
MIN_KIMG_ALIGN, reserve_addr,
|
||||
(u32)phys_seed);
|
||||
|
||||
*image_addr = *reserve_addr + offset;
|
||||
status = efi_random_alloc(*reserve_size, min_kimg_align,
|
||||
reserve_addr, phys_seed);
|
||||
} else {
|
||||
/*
|
||||
* Else, try a straight allocation at the preferred offset.
|
||||
* This will work around the issue where, if dram_base == 0x0,
|
||||
* efi_low_alloc() refuses to allocate at 0x0 (to prevent the
|
||||
* address of the allocation to be mistaken for a FAIL return
|
||||
* value or a NULL pointer). It will also ensure that, on
|
||||
* platforms where the [dram_base, dram_base + TEXT_OFFSET)
|
||||
* interval is partially occupied by the firmware (like on APM
|
||||
* Mustang), we can still place the kernel at the address
|
||||
* 'dram_base + TEXT_OFFSET'.
|
||||
*/
|
||||
*image_addr = (unsigned long)_text;
|
||||
if (*image_addr == preferred_offset)
|
||||
return EFI_SUCCESS;
|
||||
|
||||
*image_addr = *reserve_addr = preferred_offset;
|
||||
*reserve_size = round_up(kernel_memsize, EFI_ALLOC_ALIGN);
|
||||
|
||||
status = efi_bs_call(allocate_pages, EFI_ALLOCATE_ADDRESS,
|
||||
EFI_LOADER_DATA,
|
||||
*reserve_size / EFI_PAGE_SIZE,
|
||||
(efi_physical_addr_t *)reserve_addr);
|
||||
status = EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
*reserve_size = kernel_memsize + TEXT_OFFSET;
|
||||
status = efi_low_alloc(*reserve_size,
|
||||
MIN_KIMG_ALIGN, reserve_addr);
|
||||
if (IS_ALIGNED((u64)_text - TEXT_OFFSET, min_kimg_align)) {
|
||||
/*
|
||||
* Just execute from wherever we were loaded by the
|
||||
* UEFI PE/COFF loader if the alignment is suitable.
|
||||
*/
|
||||
*image_addr = (u64)_text;
|
||||
*reserve_size = 0;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
status = efi_allocate_pages_aligned(*reserve_size, reserve_addr,
|
||||
ULONG_MAX, min_kimg_align);
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("Failed to relocate kernel\n");
|
||||
efi_err("Failed to relocate kernel\n");
|
||||
*reserve_size = 0;
|
||||
return status;
|
||||
}
|
||||
*image_addr = *reserve_addr + TEXT_OFFSET;
|
||||
}
|
||||
|
||||
if (image->image_base != _text)
|
||||
pr_efi_err("FIRMWARE BUG: efi_loaded_image_t::image_base has bogus value\n");
|
||||
|
||||
*image_addr = *reserve_addr + TEXT_OFFSET % min_kimg_align;
|
||||
memcpy((void *)*image_addr, _text, kernel_size);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
|
|
|||
|
|
@ -7,60 +7,151 @@
|
|||
* Copyright 2011 Intel Corporation; author Matt Fleming
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/printk.h> /* For CONSOLE_LOGLEVEL_* */
|
||||
#include <asm/efi.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
#include "efistub.h"
|
||||
|
||||
static bool __efistub_global efi_nochunk;
|
||||
static bool __efistub_global efi_nokaslr;
|
||||
static bool __efistub_global efi_noinitrd;
|
||||
static bool __efistub_global efi_quiet;
|
||||
static bool __efistub_global efi_novamap;
|
||||
static bool __efistub_global efi_nosoftreserve;
|
||||
static bool __efistub_global efi_disable_pci_dma =
|
||||
IS_ENABLED(CONFIG_EFI_DISABLE_PCI_DMA);
|
||||
bool efi_nochunk;
|
||||
bool efi_nokaslr;
|
||||
bool efi_noinitrd;
|
||||
int efi_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
|
||||
bool efi_novamap;
|
||||
|
||||
static bool efi_nosoftreserve;
|
||||
static bool efi_disable_pci_dma = IS_ENABLED(CONFIG_EFI_DISABLE_PCI_DMA);
|
||||
|
||||
bool __pure nochunk(void)
|
||||
{
|
||||
return efi_nochunk;
|
||||
}
|
||||
bool __pure nokaslr(void)
|
||||
{
|
||||
return efi_nokaslr;
|
||||
}
|
||||
bool __pure noinitrd(void)
|
||||
{
|
||||
return efi_noinitrd;
|
||||
}
|
||||
bool __pure is_quiet(void)
|
||||
{
|
||||
return efi_quiet;
|
||||
}
|
||||
bool __pure novamap(void)
|
||||
{
|
||||
return efi_novamap;
|
||||
}
|
||||
bool __pure __efi_soft_reserve_enabled(void)
|
||||
{
|
||||
return !efi_nosoftreserve;
|
||||
}
|
||||
|
||||
void efi_printk(char *str)
|
||||
void efi_char16_puts(efi_char16_t *str)
|
||||
{
|
||||
char *s8;
|
||||
efi_call_proto(efi_table_attr(efi_system_table, con_out),
|
||||
output_string, str);
|
||||
}
|
||||
|
||||
for (s8 = str; *s8; s8++) {
|
||||
efi_char16_t ch[2] = { 0 };
|
||||
static
|
||||
u32 utf8_to_utf32(const u8 **s8)
|
||||
{
|
||||
u32 c32;
|
||||
u8 c0, cx;
|
||||
size_t clen, i;
|
||||
|
||||
ch[0] = *s8;
|
||||
if (*s8 == '\n') {
|
||||
efi_char16_t nl[2] = { '\r', 0 };
|
||||
efi_char16_printk(nl);
|
||||
}
|
||||
|
||||
efi_char16_printk(ch);
|
||||
c0 = cx = *(*s8)++;
|
||||
/*
|
||||
* The position of the most-significant 0 bit gives us the length of
|
||||
* a multi-octet encoding.
|
||||
*/
|
||||
for (clen = 0; cx & 0x80; ++clen)
|
||||
cx <<= 1;
|
||||
/*
|
||||
* If the 0 bit is in position 8, this is a valid single-octet
|
||||
* encoding. If the 0 bit is in position 7 or positions 1-3, the
|
||||
* encoding is invalid.
|
||||
* In either case, we just return the first octet.
|
||||
*/
|
||||
if (clen < 2 || clen > 4)
|
||||
return c0;
|
||||
/* Get the bits from the first octet. */
|
||||
c32 = cx >> clen--;
|
||||
for (i = 0; i < clen; ++i) {
|
||||
/* Trailing octets must have 10 in most significant bits. */
|
||||
cx = (*s8)[i] ^ 0x80;
|
||||
if (cx & 0xc0)
|
||||
return c0;
|
||||
c32 = (c32 << 6) | cx;
|
||||
}
|
||||
/*
|
||||
* Check for validity:
|
||||
* - The character must be in the Unicode range.
|
||||
* - It must not be a surrogate.
|
||||
* - It must be encoded using the correct number of octets.
|
||||
*/
|
||||
if (c32 > 0x10ffff ||
|
||||
(c32 & 0xf800) == 0xd800 ||
|
||||
clen != (c32 >= 0x80) + (c32 >= 0x800) + (c32 >= 0x10000))
|
||||
return c0;
|
||||
*s8 += clen;
|
||||
return c32;
|
||||
}
|
||||
|
||||
void efi_puts(const char *str)
|
||||
{
|
||||
efi_char16_t buf[128];
|
||||
size_t pos = 0, lim = ARRAY_SIZE(buf);
|
||||
const u8 *s8 = (const u8 *)str;
|
||||
u32 c32;
|
||||
|
||||
while (*s8) {
|
||||
if (*s8 == '\n')
|
||||
buf[pos++] = L'\r';
|
||||
c32 = utf8_to_utf32(&s8);
|
||||
if (c32 < 0x10000) {
|
||||
/* Characters in plane 0 use a single word. */
|
||||
buf[pos++] = c32;
|
||||
} else {
|
||||
/*
|
||||
* Characters in other planes encode into a surrogate
|
||||
* pair.
|
||||
*/
|
||||
buf[pos++] = (0xd800 - (0x10000 >> 10)) + (c32 >> 10);
|
||||
buf[pos++] = 0xdc00 + (c32 & 0x3ff);
|
||||
}
|
||||
if (*s8 == '\0' || pos >= lim - 2) {
|
||||
buf[pos] = L'\0';
|
||||
efi_char16_puts(buf);
|
||||
pos = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int efi_printk(const char *fmt, ...)
|
||||
{
|
||||
char printf_buf[256];
|
||||
va_list args;
|
||||
int printed;
|
||||
int loglevel = printk_get_level(fmt);
|
||||
|
||||
switch (loglevel) {
|
||||
case '0' ... '9':
|
||||
loglevel -= '0';
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* Use loglevel -1 for cases where we just want to print to
|
||||
* the screen.
|
||||
*/
|
||||
loglevel = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (loglevel >= efi_loglevel)
|
||||
return 0;
|
||||
|
||||
if (loglevel >= 0)
|
||||
efi_puts("EFI stub: ");
|
||||
|
||||
fmt = printk_skip_level(fmt);
|
||||
|
||||
va_start(args, fmt);
|
||||
printed = vsnprintf(printf_buf, sizeof(printf_buf), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
efi_puts(printf_buf);
|
||||
if (printed >= sizeof(printf_buf)) {
|
||||
efi_puts("[Message truncated]\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return printed;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -91,7 +182,7 @@ efi_status_t efi_parse_options(char const *cmdline)
|
|||
if (!strcmp(param, "nokaslr")) {
|
||||
efi_nokaslr = true;
|
||||
} else if (!strcmp(param, "quiet")) {
|
||||
efi_quiet = true;
|
||||
efi_loglevel = CONSOLE_LOGLEVEL_QUIET;
|
||||
} else if (!strcmp(param, "noinitrd")) {
|
||||
efi_noinitrd = true;
|
||||
} else if (!strcmp(param, "efi") && val) {
|
||||
|
|
@ -105,104 +196,91 @@ efi_status_t efi_parse_options(char const *cmdline)
|
|||
efi_disable_pci_dma = true;
|
||||
if (parse_option_str(val, "no_disable_early_pci_dma"))
|
||||
efi_disable_pci_dma = false;
|
||||
if (parse_option_str(val, "debug"))
|
||||
efi_loglevel = CONSOLE_LOGLEVEL_DEBUG;
|
||||
} else if (!strcmp(param, "video") &&
|
||||
val && strstarts(val, "efifb:")) {
|
||||
efi_parse_option_graphics(val + strlen("efifb:"));
|
||||
}
|
||||
}
|
||||
efi_bs_call(free_pool, buf);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the number of UTF-8 bytes corresponding to an UTF-16 character.
|
||||
* This overestimates for surrogates, but that is okay.
|
||||
*/
|
||||
static int efi_utf8_bytes(u16 c)
|
||||
{
|
||||
return 1 + (c >= 0x80) + (c >= 0x800);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an UTF-16 string, not necessarily null terminated, to UTF-8.
|
||||
*/
|
||||
static u8 *efi_utf16_to_utf8(u8 *dst, const u16 *src, int n)
|
||||
{
|
||||
unsigned int c;
|
||||
|
||||
while (n--) {
|
||||
c = *src++;
|
||||
if (n && c >= 0xd800 && c <= 0xdbff &&
|
||||
*src >= 0xdc00 && *src <= 0xdfff) {
|
||||
c = 0x10000 + ((c & 0x3ff) << 10) + (*src & 0x3ff);
|
||||
src++;
|
||||
n--;
|
||||
}
|
||||
if (c >= 0xd800 && c <= 0xdfff)
|
||||
c = 0xfffd; /* Unmatched surrogate */
|
||||
if (c < 0x80) {
|
||||
*dst++ = c;
|
||||
continue;
|
||||
}
|
||||
if (c < 0x800) {
|
||||
*dst++ = 0xc0 + (c >> 6);
|
||||
goto t1;
|
||||
}
|
||||
if (c < 0x10000) {
|
||||
*dst++ = 0xe0 + (c >> 12);
|
||||
goto t2;
|
||||
}
|
||||
*dst++ = 0xf0 + (c >> 18);
|
||||
*dst++ = 0x80 + ((c >> 12) & 0x3f);
|
||||
t2:
|
||||
*dst++ = 0x80 + ((c >> 6) & 0x3f);
|
||||
t1:
|
||||
*dst++ = 0x80 + (c & 0x3f);
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert the unicode UEFI command line to ASCII to pass to kernel.
|
||||
* Size of memory allocated return in *cmd_line_len.
|
||||
* Returns NULL on error.
|
||||
*/
|
||||
char *efi_convert_cmdline(efi_loaded_image_t *image,
|
||||
int *cmd_line_len, unsigned long max_addr)
|
||||
char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len)
|
||||
{
|
||||
const u16 *s2;
|
||||
u8 *s1 = NULL;
|
||||
unsigned long cmdline_addr = 0;
|
||||
int load_options_chars = efi_table_attr(image, load_options_size) / 2;
|
||||
int options_chars = efi_table_attr(image, load_options_size) / 2;
|
||||
const u16 *options = efi_table_attr(image, load_options);
|
||||
int options_bytes = 0; /* UTF-8 bytes */
|
||||
int options_chars = 0; /* UTF-16 chars */
|
||||
int options_bytes = 0, safe_options_bytes = 0; /* UTF-8 bytes */
|
||||
bool in_quote = false;
|
||||
efi_status_t status;
|
||||
u16 zero = 0;
|
||||
|
||||
if (options) {
|
||||
s2 = options;
|
||||
while (*s2 && *s2 != '\n'
|
||||
&& options_chars < load_options_chars) {
|
||||
options_bytes += efi_utf8_bytes(*s2++);
|
||||
options_chars++;
|
||||
}
|
||||
}
|
||||
while (options_bytes < COMMAND_LINE_SIZE && options_chars--) {
|
||||
u16 c = *s2++;
|
||||
|
||||
if (!options_chars) {
|
||||
/* No command line options, so return empty string*/
|
||||
options = &zero;
|
||||
if (c < 0x80) {
|
||||
if (c == L'\0' || c == L'\n')
|
||||
break;
|
||||
if (c == L'"')
|
||||
in_quote = !in_quote;
|
||||
else if (!in_quote && isspace((char)c))
|
||||
safe_options_bytes = options_bytes;
|
||||
|
||||
options_bytes++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the number of UTF-8 bytes corresponding to a
|
||||
* UTF-16 character.
|
||||
* The first part handles everything in the BMP.
|
||||
*/
|
||||
options_bytes += 2 + (c >= 0x800);
|
||||
/*
|
||||
* Add one more byte for valid surrogate pairs. Invalid
|
||||
* surrogates will be replaced with 0xfffd and take up
|
||||
* only 3 bytes.
|
||||
*/
|
||||
if ((c & 0xfc00) == 0xd800) {
|
||||
/*
|
||||
* If the very last word is a high surrogate,
|
||||
* we must ignore it since we can't access the
|
||||
* low surrogate.
|
||||
*/
|
||||
if (!options_chars) {
|
||||
options_bytes -= 3;
|
||||
} else if ((*s2 & 0xfc00) == 0xdc00) {
|
||||
options_bytes++;
|
||||
options_chars--;
|
||||
s2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (options_bytes >= COMMAND_LINE_SIZE) {
|
||||
options_bytes = safe_options_bytes;
|
||||
efi_err("Command line is too long: truncated to %d bytes\n",
|
||||
options_bytes);
|
||||
}
|
||||
}
|
||||
|
||||
options_bytes++; /* NUL termination */
|
||||
|
||||
status = efi_allocate_pages(options_bytes, &cmdline_addr, max_addr);
|
||||
status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, options_bytes,
|
||||
(void **)&cmdline_addr);
|
||||
if (status != EFI_SUCCESS)
|
||||
return NULL;
|
||||
|
||||
s1 = (u8 *)cmdline_addr;
|
||||
s2 = (const u16 *)options;
|
||||
|
||||
s1 = efi_utf16_to_utf8(s1, s2, options_chars);
|
||||
*s1 = '\0';
|
||||
snprintf((char *)cmdline_addr, options_bytes, "%.*ls",
|
||||
options_bytes - 1, options);
|
||||
|
||||
*cmd_line_len = options_bytes;
|
||||
return (char *)cmdline_addr;
|
||||
|
|
@ -285,8 +363,8 @@ efi_status_t efi_exit_boot_services(void *handle,
|
|||
|
||||
void *get_efi_config_table(efi_guid_t guid)
|
||||
{
|
||||
unsigned long tables = efi_table_attr(efi_system_table(), tables);
|
||||
int nr_tables = efi_table_attr(efi_system_table(), nr_tables);
|
||||
unsigned long tables = efi_table_attr(efi_system_table, tables);
|
||||
int nr_tables = efi_table_attr(efi_system_table, nr_tables);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_tables; i++) {
|
||||
|
|
@ -301,12 +379,6 @@ void *get_efi_config_table(efi_guid_t guid)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void efi_char16_printk(efi_char16_t *str)
|
||||
{
|
||||
efi_call_proto(efi_table_attr(efi_system_table(), con_out),
|
||||
output_string, str);
|
||||
}
|
||||
|
||||
/*
|
||||
* The LINUX_EFI_INITRD_MEDIA_GUID vendor media device path below provides a way
|
||||
* for the firmware or bootloader to expose the initrd data directly to the stub
|
||||
|
|
@ -348,6 +420,7 @@ static const struct {
|
|||
* %EFI_OUT_OF_RESOURCES if memory allocation failed
|
||||
* %EFI_LOAD_ERROR in all other cases
|
||||
*/
|
||||
static
|
||||
efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
|
||||
unsigned long *load_size,
|
||||
unsigned long max)
|
||||
|
|
@ -360,9 +433,6 @@ efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
|
|||
efi_handle_t handle;
|
||||
efi_status_t status;
|
||||
|
||||
if (!load_addr || !load_size)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
dp = (efi_device_path_protocol_t *)&initrd_dev_path;
|
||||
status = efi_bs_call(locate_device_path, &lf2_proto_guid, &dp, &handle);
|
||||
if (status != EFI_SUCCESS)
|
||||
|
|
@ -392,3 +462,80 @@ efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
|
|||
*load_size = initrd_size;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
efi_status_t efi_load_initrd_cmdline(efi_loaded_image_t *image,
|
||||
unsigned long *load_addr,
|
||||
unsigned long *load_size,
|
||||
unsigned long soft_limit,
|
||||
unsigned long hard_limit)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER) ||
|
||||
(IS_ENABLED(CONFIG_X86) && (!efi_is_native() || image == NULL))) {
|
||||
*load_addr = *load_size = 0;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return handle_cmdline_files(image, L"initrd=", sizeof(L"initrd=") - 2,
|
||||
soft_limit, hard_limit,
|
||||
load_addr, load_size);
|
||||
}
|
||||
|
||||
efi_status_t efi_load_initrd(efi_loaded_image_t *image,
|
||||
unsigned long *load_addr,
|
||||
unsigned long *load_size,
|
||||
unsigned long soft_limit,
|
||||
unsigned long hard_limit)
|
||||
{
|
||||
efi_status_t status;
|
||||
|
||||
if (!load_addr || !load_size)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
||||
status = efi_load_initrd_dev_path(load_addr, load_size, hard_limit);
|
||||
if (status == EFI_SUCCESS) {
|
||||
efi_info("Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path\n");
|
||||
} else if (status == EFI_NOT_FOUND) {
|
||||
status = efi_load_initrd_cmdline(image, load_addr, load_size,
|
||||
soft_limit, hard_limit);
|
||||
if (status == EFI_SUCCESS && *load_size > 0)
|
||||
efi_info("Loaded initrd from command line option\n");
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key)
|
||||
{
|
||||
efi_event_t events[2], timer;
|
||||
unsigned long index;
|
||||
efi_simple_text_input_protocol_t *con_in;
|
||||
efi_status_t status;
|
||||
|
||||
con_in = efi_table_attr(efi_system_table, con_in);
|
||||
if (!con_in)
|
||||
return EFI_UNSUPPORTED;
|
||||
efi_set_event_at(events, 0, efi_table_attr(con_in, wait_for_key));
|
||||
|
||||
status = efi_bs_call(create_event, EFI_EVT_TIMER, 0, NULL, NULL, &timer);
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
|
||||
status = efi_bs_call(set_timer, timer, EfiTimerRelative,
|
||||
EFI_100NSEC_PER_USEC * usec);
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
efi_set_event_at(events, 1, timer);
|
||||
|
||||
status = efi_bs_call(wait_for_event, 2, events, &index);
|
||||
if (status == EFI_SUCCESS) {
|
||||
if (index == 0)
|
||||
status = efi_call_proto(con_in, read_keystroke, key);
|
||||
else
|
||||
status = EFI_TIMEOUT;
|
||||
}
|
||||
|
||||
efi_bs_call(close_event, timer);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,14 +36,9 @@
|
|||
#endif
|
||||
|
||||
static u64 virtmap_base = EFI_RT_VIRTUAL_BASE;
|
||||
static bool __efistub_global flat_va_mapping;
|
||||
static bool flat_va_mapping;
|
||||
|
||||
static efi_system_table_t *__efistub_global sys_table;
|
||||
|
||||
__pure efi_system_table_t *efi_system_table(void)
|
||||
{
|
||||
return sys_table;
|
||||
}
|
||||
const efi_system_table_t *efi_system_table;
|
||||
|
||||
static struct screen_info *setup_graphics(void)
|
||||
{
|
||||
|
|
@ -69,7 +64,7 @@ static struct screen_info *setup_graphics(void)
|
|||
return si;
|
||||
}
|
||||
|
||||
void install_memreserve_table(void)
|
||||
static void install_memreserve_table(void)
|
||||
{
|
||||
struct linux_efi_memreserve *rsv;
|
||||
efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID;
|
||||
|
|
@ -78,7 +73,7 @@ void install_memreserve_table(void)
|
|||
status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv),
|
||||
(void **)&rsv);
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("Failed to allocate memreserve entry!\n");
|
||||
efi_err("Failed to allocate memreserve entry!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -89,7 +84,7 @@ void install_memreserve_table(void)
|
|||
status = efi_bs_call(install_configuration_table,
|
||||
&memreserve_table_guid, rsv);
|
||||
if (status != EFI_SUCCESS)
|
||||
pr_efi_err("Failed to install memreserve config table!\n");
|
||||
efi_err("Failed to install memreserve config table!\n");
|
||||
}
|
||||
|
||||
static unsigned long get_dram_base(void)
|
||||
|
|
@ -149,7 +144,8 @@ asmlinkage void __noreturn efi_enter_kernel(unsigned long entrypoint,
|
|||
* for both archictectures, with the arch-specific code provided in the
|
||||
* handle_kernel_image() function.
|
||||
*/
|
||||
efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
||||
efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
||||
efi_system_table_t *sys_table_arg)
|
||||
{
|
||||
efi_loaded_image_t *image;
|
||||
efi_status_t status;
|
||||
|
|
@ -171,10 +167,10 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
efi_properties_table_t *prop_tbl;
|
||||
unsigned long max_addr;
|
||||
|
||||
sys_table = sys_table_arg;
|
||||
efi_system_table = sys_table_arg;
|
||||
|
||||
/* Check if we were booted by the EFI firmware */
|
||||
if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE) {
|
||||
if (efi_system_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE) {
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
goto fail;
|
||||
}
|
||||
|
|
@ -188,16 +184,16 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
* information about the running image, such as size and the command
|
||||
* line.
|
||||
*/
|
||||
status = sys_table->boottime->handle_protocol(handle,
|
||||
status = efi_system_table->boottime->handle_protocol(handle,
|
||||
&loaded_image_proto, (void *)&image);
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("Failed to get loaded image protocol\n");
|
||||
efi_err("Failed to get loaded image protocol\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
dram_base = get_dram_base();
|
||||
if (dram_base == EFI_ERROR) {
|
||||
pr_efi_err("Failed to find DRAM base\n");
|
||||
efi_err("Failed to find DRAM base\n");
|
||||
status = EFI_LOAD_ERROR;
|
||||
goto fail;
|
||||
}
|
||||
|
|
@ -207,22 +203,32 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
* protocol. We are going to copy the command line into the
|
||||
* device tree, so this can be allocated anywhere.
|
||||
*/
|
||||
cmdline_ptr = efi_convert_cmdline(image, &cmdline_size, ULONG_MAX);
|
||||
cmdline_ptr = efi_convert_cmdline(image, &cmdline_size);
|
||||
if (!cmdline_ptr) {
|
||||
pr_efi_err("getting command line via LOADED_IMAGE_PROTOCOL\n");
|
||||
efi_err("getting command line via LOADED_IMAGE_PROTOCOL\n");
|
||||
status = EFI_OUT_OF_RESOURCES;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) ||
|
||||
IS_ENABLED(CONFIG_CMDLINE_FORCE) ||
|
||||
cmdline_size == 0)
|
||||
efi_parse_options(CONFIG_CMDLINE);
|
||||
cmdline_size == 0) {
|
||||
status = efi_parse_options(CONFIG_CMDLINE);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("Failed to parse options\n");
|
||||
goto fail_free_cmdline;
|
||||
}
|
||||
}
|
||||
|
||||
if (!IS_ENABLED(CONFIG_CMDLINE_FORCE) && cmdline_size > 0)
|
||||
efi_parse_options(cmdline_ptr);
|
||||
if (!IS_ENABLED(CONFIG_CMDLINE_FORCE) && cmdline_size > 0) {
|
||||
status = efi_parse_options(cmdline_ptr);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("Failed to parse options\n");
|
||||
goto fail_free_cmdline;
|
||||
}
|
||||
}
|
||||
|
||||
pr_efi("Booting Linux Kernel...\n");
|
||||
efi_info("Booting Linux Kernel...\n");
|
||||
|
||||
si = setup_graphics();
|
||||
|
||||
|
|
@ -231,8 +237,8 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
&reserve_size,
|
||||
dram_base, image);
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("Failed to relocate kernel\n");
|
||||
goto fail_free_cmdline;
|
||||
efi_err("Failed to relocate kernel\n");
|
||||
goto fail_free_screeninfo;
|
||||
}
|
||||
|
||||
efi_retrieve_tpm2_eventlog();
|
||||
|
|
@ -250,42 +256,34 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
if (!IS_ENABLED(CONFIG_EFI_ARMSTUB_DTB_LOADER) ||
|
||||
secure_boot != efi_secureboot_mode_disabled) {
|
||||
if (strstr(cmdline_ptr, "dtb="))
|
||||
pr_efi("Ignoring DTB from command line.\n");
|
||||
efi_err("Ignoring DTB from command line.\n");
|
||||
} else {
|
||||
status = efi_load_dtb(image, &fdt_addr, &fdt_size);
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_efi_err("Failed to load device tree!\n");
|
||||
efi_err("Failed to load device tree!\n");
|
||||
goto fail_free_image;
|
||||
}
|
||||
}
|
||||
|
||||
if (fdt_addr) {
|
||||
pr_efi("Using DTB from command line\n");
|
||||
efi_info("Using DTB from command line\n");
|
||||
} else {
|
||||
/* Look for a device tree configuration table entry. */
|
||||
fdt_addr = (uintptr_t)get_fdt(&fdt_size);
|
||||
if (fdt_addr)
|
||||
pr_efi("Using DTB from configuration table\n");
|
||||
efi_info("Using DTB from configuration table\n");
|
||||
}
|
||||
|
||||
if (!fdt_addr)
|
||||
pr_efi("Generating empty DTB\n");
|
||||
efi_info("Generating empty DTB\n");
|
||||
|
||||
if (!noinitrd()) {
|
||||
if (!efi_noinitrd) {
|
||||
max_addr = efi_get_max_initrd_addr(dram_base, image_addr);
|
||||
status = efi_load_initrd_dev_path(&initrd_addr, &initrd_size,
|
||||
max_addr);
|
||||
if (status == EFI_SUCCESS) {
|
||||
pr_efi("Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path\n");
|
||||
} else if (status == EFI_NOT_FOUND) {
|
||||
status = efi_load_initrd(image, &initrd_addr, &initrd_size,
|
||||
ULONG_MAX, max_addr);
|
||||
if (status == EFI_SUCCESS && initrd_size > 0)
|
||||
pr_efi("Loaded initrd from command line option\n");
|
||||
}
|
||||
status = efi_load_initrd(image, &initrd_addr, &initrd_size,
|
||||
ULONG_MAX, max_addr);
|
||||
if (status != EFI_SUCCESS)
|
||||
pr_efi_err("Failed to load initrd!\n");
|
||||
efi_err("Failed to load initrd!\n");
|
||||
}
|
||||
|
||||
efi_random_get_seed();
|
||||
|
|
@ -303,7 +301,7 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA);
|
||||
|
||||
/* hibernation expects the runtime regions to stay in the same place */
|
||||
if (!IS_ENABLED(CONFIG_HIBERNATION) && !nokaslr() && !flat_va_mapping) {
|
||||
if (!IS_ENABLED(CONFIG_HIBERNATION) && !efi_nokaslr && !flat_va_mapping) {
|
||||
/*
|
||||
* Randomize the base of the UEFI runtime services region.
|
||||
* Preserve the 2 MB alignment of the region by taking a
|
||||
|
|
@ -335,7 +333,7 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
/* not reached */
|
||||
|
||||
fail_free_initrd:
|
||||
pr_efi_err("Failed to update FDT and exit boot services\n");
|
||||
efi_err("Failed to update FDT and exit boot services\n");
|
||||
|
||||
efi_free(initrd_size, initrd_addr);
|
||||
efi_free(fdt_size, fdt_addr);
|
||||
|
|
@ -343,9 +341,10 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
|
|||
fail_free_image:
|
||||
efi_free(image_size, image_addr);
|
||||
efi_free(reserve_size, reserve_addr);
|
||||
fail_free_cmdline:
|
||||
fail_free_screeninfo:
|
||||
free_screen_info(si);
|
||||
efi_free(cmdline_size, (unsigned long)cmdline_ptr);
|
||||
fail_free_cmdline:
|
||||
efi_bs_call(free_pool, cmdline_ptr);
|
||||
fail:
|
||||
return status;
|
||||
}
|
||||
|
|
@ -376,7 +375,7 @@ void efi_get_virtmap(efi_memory_desc_t *memory_map, unsigned long map_size,
|
|||
size = in->num_pages * EFI_PAGE_SIZE;
|
||||
|
||||
in->virt_addr = in->phys_addr;
|
||||
if (novamap()) {
|
||||
if (efi_novamap) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -3,6 +3,13 @@
|
|||
#ifndef _DRIVERS_FIRMWARE_EFI_EFISTUB_H
|
||||
#define _DRIVERS_FIRMWARE_EFI_EFISTUB_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kern_levels.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/efi.h>
|
||||
|
||||
/* error code which can't be mistaken for valid address */
|
||||
#define EFI_ERROR (~0UL)
|
||||
|
||||
|
|
@ -25,25 +32,33 @@
|
|||
#define EFI_ALLOC_ALIGN EFI_PAGE_SIZE
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARM) || defined(CONFIG_X86)
|
||||
#define __efistub_global __section(.data)
|
||||
#else
|
||||
#define __efistub_global
|
||||
extern bool efi_nochunk;
|
||||
extern bool efi_nokaslr;
|
||||
extern bool efi_noinitrd;
|
||||
extern int efi_loglevel;
|
||||
extern bool efi_novamap;
|
||||
|
||||
extern const efi_system_table_t *efi_system_table;
|
||||
|
||||
efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
||||
efi_system_table_t *sys_table_arg);
|
||||
|
||||
#ifndef ARCH_HAS_EFISTUB_WRAPPERS
|
||||
|
||||
#define efi_is_native() (true)
|
||||
#define efi_bs_call(func, ...) efi_system_table->boottime->func(__VA_ARGS__)
|
||||
#define efi_rt_call(func, ...) efi_system_table->runtime->func(__VA_ARGS__)
|
||||
#define efi_table_attr(inst, attr) (inst->attr)
|
||||
#define efi_call_proto(inst, func, ...) inst->func(inst, ##__VA_ARGS__)
|
||||
|
||||
#endif
|
||||
|
||||
extern bool __pure nochunk(void);
|
||||
extern bool __pure nokaslr(void);
|
||||
extern bool __pure noinitrd(void);
|
||||
extern bool __pure is_quiet(void);
|
||||
extern bool __pure novamap(void);
|
||||
|
||||
extern __pure efi_system_table_t *efi_system_table(void);
|
||||
|
||||
#define pr_efi(msg) do { \
|
||||
if (!is_quiet()) efi_printk("EFI stub: "msg); \
|
||||
} while (0)
|
||||
|
||||
#define pr_efi_err(msg) efi_printk("EFI stub: ERROR: "msg)
|
||||
#define efi_info(fmt, ...) \
|
||||
efi_printk(KERN_INFO fmt, ##__VA_ARGS__)
|
||||
#define efi_err(fmt, ...) \
|
||||
efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__)
|
||||
#define efi_debug(fmt, ...) \
|
||||
efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__)
|
||||
|
||||
/* Helper macros for the usual case of using simple C variables: */
|
||||
#ifndef fdt_setprop_inplace_var
|
||||
|
|
@ -77,6 +92,13 @@ extern __pure efi_system_table_t *efi_system_table(void);
|
|||
((handle = efi_get_handle_at((array), i)) || true); \
|
||||
i++)
|
||||
|
||||
static inline
|
||||
void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)
|
||||
{
|
||||
*lo = lower_32_bits(data);
|
||||
*hi = upper_32_bits(data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocation types for calls to boottime->allocate_pages.
|
||||
*/
|
||||
|
|
@ -92,6 +114,16 @@ extern __pure efi_system_table_t *efi_system_table(void);
|
|||
#define EFI_LOCATE_BY_REGISTER_NOTIFY 1
|
||||
#define EFI_LOCATE_BY_PROTOCOL 2
|
||||
|
||||
/*
|
||||
* boottime->stall takes the time period in microseconds
|
||||
*/
|
||||
#define EFI_USEC_PER_SEC 1000000
|
||||
|
||||
/*
|
||||
* boottime->set_timer takes the time in 100ns units
|
||||
*/
|
||||
#define EFI_100NSEC_PER_USEC ((u64)10)
|
||||
|
||||
/*
|
||||
* An efi_boot_memmap is used by efi_get_memory_map() to return the
|
||||
* EFI memory map in a dynamically allocated buffer.
|
||||
|
|
@ -116,6 +148,39 @@ struct efi_boot_memmap {
|
|||
|
||||
typedef struct efi_generic_dev_path efi_device_path_protocol_t;
|
||||
|
||||
typedef void *efi_event_t;
|
||||
/* Note that notifications won't work in mixed mode */
|
||||
typedef void (__efiapi *efi_event_notify_t)(efi_event_t, void *);
|
||||
|
||||
#define EFI_EVT_TIMER 0x80000000U
|
||||
#define EFI_EVT_RUNTIME 0x40000000U
|
||||
#define EFI_EVT_NOTIFY_WAIT 0x00000100U
|
||||
#define EFI_EVT_NOTIFY_SIGNAL 0x00000200U
|
||||
|
||||
/*
|
||||
* boottime->wait_for_event takes an array of events as input.
|
||||
* Provide a helper to set it up correctly for mixed mode.
|
||||
*/
|
||||
static inline
|
||||
void efi_set_event_at(efi_event_t *events, size_t idx, efi_event_t event)
|
||||
{
|
||||
if (efi_is_native())
|
||||
events[idx] = event;
|
||||
else
|
||||
((u32 *)events)[idx] = (u32)(unsigned long)event;
|
||||
}
|
||||
|
||||
#define EFI_TPL_APPLICATION 4
|
||||
#define EFI_TPL_CALLBACK 8
|
||||
#define EFI_TPL_NOTIFY 16
|
||||
#define EFI_TPL_HIGH_LEVEL 31
|
||||
|
||||
typedef enum {
|
||||
EfiTimerCancel,
|
||||
EfiTimerPeriodic,
|
||||
EfiTimerRelative
|
||||
} EFI_TIMER_DELAY;
|
||||
|
||||
/*
|
||||
* EFI Boot Services table
|
||||
*/
|
||||
|
|
@ -134,11 +199,16 @@ union efi_boot_services {
|
|||
efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
|
||||
void **);
|
||||
efi_status_t (__efiapi *free_pool)(void *);
|
||||
void *create_event;
|
||||
void *set_timer;
|
||||
void *wait_for_event;
|
||||
efi_status_t (__efiapi *create_event)(u32, unsigned long,
|
||||
efi_event_notify_t, void *,
|
||||
efi_event_t *);
|
||||
efi_status_t (__efiapi *set_timer)(efi_event_t,
|
||||
EFI_TIMER_DELAY, u64);
|
||||
efi_status_t (__efiapi *wait_for_event)(unsigned long,
|
||||
efi_event_t *,
|
||||
unsigned long *);
|
||||
void *signal_event;
|
||||
void *close_event;
|
||||
efi_status_t (__efiapi *close_event)(efi_event_t);
|
||||
void *check_event;
|
||||
void *install_protocol_interface;
|
||||
void *reinstall_protocol_interface;
|
||||
|
|
@ -165,7 +235,7 @@ union efi_boot_services {
|
|||
efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
|
||||
unsigned long);
|
||||
void *get_next_monotonic_count;
|
||||
void *stall;
|
||||
efi_status_t (__efiapi *stall)(unsigned long);
|
||||
void *set_watchdog_timer;
|
||||
void *connect_controller;
|
||||
efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
|
||||
|
|
@ -250,6 +320,27 @@ union efi_uga_draw_protocol {
|
|||
} mixed_mode;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
u16 scan_code;
|
||||
efi_char16_t unicode_char;
|
||||
} efi_input_key_t;
|
||||
|
||||
union efi_simple_text_input_protocol {
|
||||
struct {
|
||||
void *reset;
|
||||
efi_status_t (__efiapi *read_keystroke)(efi_simple_text_input_protocol_t *,
|
||||
efi_input_key_t *);
|
||||
efi_event_t wait_for_key;
|
||||
};
|
||||
struct {
|
||||
u32 reset;
|
||||
u32 read_keystroke;
|
||||
u32 wait_for_key;
|
||||
} mixed_mode;
|
||||
};
|
||||
|
||||
efi_status_t efi_wait_for_key(unsigned long usec, efi_input_key_t *key);
|
||||
|
||||
union efi_simple_text_output_protocol {
|
||||
struct {
|
||||
void *reset;
|
||||
|
|
@ -311,8 +402,10 @@ typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
|
|||
|
||||
union efi_graphics_output_protocol {
|
||||
struct {
|
||||
void *query_mode;
|
||||
void *set_mode;
|
||||
efi_status_t (__efiapi *query_mode)(efi_graphics_output_protocol_t *,
|
||||
u32, unsigned long *,
|
||||
efi_graphics_output_mode_info_t **);
|
||||
efi_status_t (__efiapi *set_mode) (efi_graphics_output_protocol_t *, u32);
|
||||
void *blt;
|
||||
efi_graphics_output_protocol_mode_t *mode;
|
||||
};
|
||||
|
|
@ -600,8 +693,6 @@ efi_status_t efi_exit_boot_services(void *handle,
|
|||
void *priv,
|
||||
efi_exit_boot_map_processing priv_func);
|
||||
|
||||
void efi_char16_printk(efi_char16_t *);
|
||||
|
||||
efi_status_t allocate_new_fdt_and_exit_boot(void *handle,
|
||||
unsigned long *new_fdt_addr,
|
||||
unsigned long max_addr,
|
||||
|
|
@ -625,33 +716,24 @@ efi_status_t check_platform_features(void);
|
|||
|
||||
void *get_efi_config_table(efi_guid_t guid);
|
||||
|
||||
void efi_printk(char *str);
|
||||
/* NOTE: These functions do not print a trailing newline after the string */
|
||||
void efi_char16_puts(efi_char16_t *);
|
||||
void efi_puts(const char *str);
|
||||
|
||||
__printf(1, 2) int efi_printk(char const *fmt, ...);
|
||||
|
||||
void efi_free(unsigned long size, unsigned long addr);
|
||||
|
||||
char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len,
|
||||
unsigned long max_addr);
|
||||
char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
|
||||
|
||||
efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
|
||||
|
||||
efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
|
||||
unsigned long *addr, unsigned long min);
|
||||
|
||||
static inline
|
||||
efi_status_t efi_low_alloc(unsigned long size, unsigned long align,
|
||||
unsigned long *addr)
|
||||
{
|
||||
/*
|
||||
* Don't allocate at 0x0. It will confuse code that
|
||||
* checks pointers against NULL. Skip the first 8
|
||||
* bytes so we start at a nice even number.
|
||||
*/
|
||||
return efi_low_alloc_above(size, align, addr, 0x8);
|
||||
}
|
||||
|
||||
efi_status_t efi_allocate_pages(unsigned long size, unsigned long *addr,
|
||||
unsigned long max);
|
||||
|
||||
efi_status_t efi_allocate_pages_aligned(unsigned long size, unsigned long *addr,
|
||||
unsigned long max, unsigned long align);
|
||||
|
||||
efi_status_t efi_relocate_kernel(unsigned long *image_addr,
|
||||
unsigned long image_size,
|
||||
unsigned long alloc_size,
|
||||
|
|
@ -661,12 +743,27 @@ efi_status_t efi_relocate_kernel(unsigned long *image_addr,
|
|||
|
||||
efi_status_t efi_parse_options(char const *cmdline);
|
||||
|
||||
void efi_parse_option_graphics(char *option);
|
||||
|
||||
efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
|
||||
unsigned long size);
|
||||
|
||||
efi_status_t efi_load_dtb(efi_loaded_image_t *image,
|
||||
unsigned long *load_addr,
|
||||
unsigned long *load_size);
|
||||
efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
|
||||
const efi_char16_t *optstr,
|
||||
int optstr_size,
|
||||
unsigned long soft_limit,
|
||||
unsigned long hard_limit,
|
||||
unsigned long *load_addr,
|
||||
unsigned long *load_size);
|
||||
|
||||
|
||||
static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
|
||||
unsigned long *load_addr,
|
||||
unsigned long *load_size)
|
||||
{
|
||||
return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
|
||||
ULONG_MAX, ULONG_MAX, load_addr, load_size);
|
||||
}
|
||||
|
||||
efi_status_t efi_load_initrd(efi_loaded_image_t *image,
|
||||
unsigned long *load_addr,
|
||||
|
|
@ -674,8 +771,4 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
|
|||
unsigned long soft_limit,
|
||||
unsigned long hard_limit);
|
||||
|
||||
efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
|
||||
unsigned long *load_size,
|
||||
unsigned long max);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user