Merge branches 'for-next/acpi', 'for-next/boot', 'for-next/bpf', 'for-next/cpuinfo', 'for-next/fpsimd', 'for-next/misc', 'for-next/mm', 'for-next/pci', 'for-next/perf', 'for-next/ptrauth', 'for-next/sdei', 'for-next/selftests', 'for-next/stacktrace', 'for-next/svm', 'for-next/topology', 'for-next/tpyos' and 'for-next/vdso' into for-next/core
Remove unused functions and parameters from ACPI IORT code.
(Zenghui Yu via Lorenzo Pieralisi)
* for-next/acpi:
ACPI/IORT: Remove the unused inline functions
ACPI/IORT: Drop the unused @ops of iort_add_device_replay()
Remove redundant code and fix documentation of caching behaviour for the
HVC_SOFT_RESTART hypercall.
(Pingfan Liu)
* for-next/boot:
Documentation/kvm/arm: improve description of HVC_SOFT_RESTART
arm64/relocate_kernel: remove redundant code
Improve reporting of unexpected kernel traps due to BPF JIT failure.
(Will Deacon)
* for-next/bpf:
arm64: Improve diagnostics when trapping BRK with FAULT_BRK_IMM
Improve robustness of user-visible HWCAP strings and their corresponding
numerical constants.
(Anshuman Khandual)
* for-next/cpuinfo:
arm64/cpuinfo: Define HWCAP name arrays per their actual bit definitions
Cleanups to handling of SVE and FPSIMD register state in preparation
for potential future optimisation of handling across syscalls.
(Julien Grall)
* for-next/fpsimd:
arm64/sve: Implement a helper to load SVE registers from FPSIMD state
arm64/sve: Implement a helper to flush SVE registers
arm64/fpsimdmacros: Allow the macro "for" to be used in more cases
arm64/fpsimdmacros: Introduce a macro to update ZCR_EL1.LEN
arm64/signal: Update the comment in preserve_sve_context
arm64/fpsimd: Update documentation of do_sve_acc
Miscellaneous changes.
(Tian Tao and others)
* for-next/misc:
arm64/mm: return cpu_all_mask when node is NUMA_NO_NODE
arm64: mm: Fix missing-prototypes in pageattr.c
arm64/fpsimd: Fix missing-prototypes in fpsimd.c
arm64: hibernate: Remove unused including <linux/version.h>
arm64/mm: Refactor {pgd, pud, pmd, pte}_ERROR()
arm64: Remove the unused include statements
arm64: get rid of TEXT_OFFSET
arm64: traps: Add str of description to panic() in die()
Memory management updates and cleanups.
(Anshuman Khandual and others)
* for-next/mm:
arm64: dbm: Invalidate local TLB when setting TCR_EL1.HD
arm64: mm: Make flush_tlb_fix_spurious_fault() a no-op
arm64/mm: Unify CONT_PMD_SHIFT
arm64/mm: Unify CONT_PTE_SHIFT
arm64/mm: Remove CONT_RANGE_OFFSET
arm64/mm: Enable THP migration
arm64/mm: Change THP helpers to comply with generic MM semantics
arm64/mm/ptdump: Add address markers for BPF regions
Allow prefetchable PCI BARs to be exposed to userspace using normal
non-cacheable mappings.
(Clint Sbisa)
* for-next/pci:
arm64: Enable PCI write-combine resources under sysfs
Perf/PMU driver updates.
(Julien Thierry and others)
* for-next/perf:
perf: arm-cmn: Fix conversion specifiers for node type
perf: arm-cmn: Fix unsigned comparison to less than zero
arm_pmu: arm64: Use NMIs for PMU
arm_pmu: Introduce pmu_irq_ops
KVM: arm64: pmu: Make overflow handler NMI safe
arm64: perf: Defer irq_work to IPI_IRQ_WORK
arm64: perf: Remove PMU locking
arm64: perf: Avoid PMXEV* indirection
arm64: perf: Add missing ISB in armv8pmu_enable_counter()
perf: Add Arm CMN-600 PMU driver
perf: Add Arm CMN-600 DT binding
arm64: perf: Add support caps under sysfs
drivers/perf: thunderx2_pmu: Fix memory resource error handling
drivers/perf: xgene_pmu: Fix uninitialized resource struct
perf: arm_dsu: Support DSU ACPI devices
arm64: perf: Remove unnecessary event_idx check
drivers/perf: hisi: Add missing include of linux/module.h
arm64: perf: Add general hardware LLC events for PMUv3
Support for the Armv8.3 Pointer Authentication enhancements.
(By Amit Daniel Kachhap)
* for-next/ptrauth:
arm64: kprobe: clarify the comment of steppable hint instructions
arm64: kprobe: disable probe of fault prone ptrauth instruction
arm64: cpufeature: Modify address authentication cpufeature to exact
arm64: ptrauth: Introduce Armv8.3 pointer authentication enhancements
arm64: traps: Allow force_signal_inject to pass esr error code
arm64: kprobe: add checks for ARMv8.3-PAuth combined instructions
Tonnes of cleanup to the SDEI driver.
(Gavin Shan)
* for-next/sdei:
firmware: arm_sdei: Remove _sdei_event_unregister()
firmware: arm_sdei: Remove _sdei_event_register()
firmware: arm_sdei: Introduce sdei_do_local_call()
firmware: arm_sdei: Cleanup on cross call function
firmware: arm_sdei: Remove while loop in sdei_event_unregister()
firmware: arm_sdei: Remove while loop in sdei_event_register()
firmware: arm_sdei: Remove redundant error message in sdei_probe()
firmware: arm_sdei: Remove duplicate check in sdei_get_conduit()
firmware: arm_sdei: Unregister driver on error in sdei_init()
firmware: arm_sdei: Avoid nested statements in sdei_init()
firmware: arm_sdei: Retrieve event number from event instance
firmware: arm_sdei: Common block for failing path in sdei_event_create()
firmware: arm_sdei: Remove sdei_is_err()
Selftests for Pointer Authentication and FPSIMD/SVE context-switching.
(Mark Brown and Boyan Karatotev)
* for-next/selftests:
selftests: arm64: Add build and documentation for FP tests
selftests: arm64: Add wrapper scripts for stress tests
selftests: arm64: Add utility to set SVE vector lengths
selftests: arm64: Add stress tests for FPSMID and SVE context switching
selftests: arm64: Add test for the SVE ptrace interface
selftests: arm64: Test case for enumeration of SVE vector lengths
kselftests/arm64: add PAuth tests for single threaded consistency and differently initialized keys
kselftests/arm64: add PAuth test for whether exec() changes keys
kselftests/arm64: add nop checks for PAuth tests
kselftests/arm64: add a basic Pointer Authentication test
Implementation of ARCH_STACKWALK for unwinding.
(Mark Brown)
* for-next/stacktrace:
arm64: Move console stack display code to stacktrace.c
arm64: stacktrace: Convert to ARCH_STACKWALK
arm64: stacktrace: Make stack walk callback consistent with generic code
stacktrace: Remove reliable argument from arch_stack_walk() callback
Support for ASID pinning, which is required when sharing page-tables with
the SMMU.
(Jean-Philippe Brucker)
* for-next/svm:
arm64: cpufeature: Export symbol read_sanitised_ftr_reg()
arm64: mm: Pin down ASIDs for sharing mm with devices
Rely on firmware tables for establishing CPU topology.
(Valentin Schneider)
* for-next/topology:
arm64: topology: Stop using MPIDR for topology information
Spelling fixes.
(Xiaoming Ni and Yanfei Xu)
* for-next/tpyos:
arm64/numa: Fix a typo in comment of arm64_numa_init
arm64: fix some spelling mistakes in the comments by codespell
vDSO cleanups.
(Will Deacon)
* for-next/vdso:
arm64: vdso: Fix unusual formatting in *setup_additional_pages()
arm64: vdso32: Remove a bunch of #ifdef CONFIG_COMPAT_VDSO guards
This commit is contained in:
@@ -78,11 +78,26 @@ struct sdei_crosscall_args {
|
||||
int first_error;
|
||||
};
|
||||
|
||||
#define CROSSCALL_INIT(arg, event) (arg.event = event, \
|
||||
arg.first_error = 0, \
|
||||
atomic_set(&arg.errors, 0))
|
||||
#define CROSSCALL_INIT(arg, event) \
|
||||
do { \
|
||||
arg.event = event; \
|
||||
arg.first_error = 0; \
|
||||
atomic_set(&arg.errors, 0); \
|
||||
} while (0)
|
||||
|
||||
static inline int sdei_do_cross_call(void *fn, struct sdei_event * event)
|
||||
static inline int sdei_do_local_call(smp_call_func_t fn,
|
||||
struct sdei_event *event)
|
||||
{
|
||||
struct sdei_crosscall_args arg;
|
||||
|
||||
CROSSCALL_INIT(arg, event);
|
||||
fn(&arg);
|
||||
|
||||
return arg.first_error;
|
||||
}
|
||||
|
||||
static inline int sdei_do_cross_call(smp_call_func_t fn,
|
||||
struct sdei_event *event)
|
||||
{
|
||||
struct sdei_crosscall_args arg;
|
||||
|
||||
@@ -114,26 +129,7 @@ static int sdei_to_linux_errno(unsigned long sdei_err)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Not an error value ... */
|
||||
return sdei_err;
|
||||
}
|
||||
|
||||
/*
|
||||
* If x0 is any of these values, then the call failed, use sdei_to_linux_errno()
|
||||
* to translate.
|
||||
*/
|
||||
static int sdei_is_err(struct arm_smccc_res *res)
|
||||
{
|
||||
switch (res->a0) {
|
||||
case SDEI_NOT_SUPPORTED:
|
||||
case SDEI_INVALID_PARAMETERS:
|
||||
case SDEI_DENIED:
|
||||
case SDEI_PENDING:
|
||||
case SDEI_OUT_OF_RESOURCE:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int invoke_sdei_fn(unsigned long function_id, unsigned long arg0,
|
||||
@@ -141,14 +137,13 @@ static int invoke_sdei_fn(unsigned long function_id, unsigned long arg0,
|
||||
unsigned long arg3, unsigned long arg4,
|
||||
u64 *result)
|
||||
{
|
||||
int err = 0;
|
||||
int err;
|
||||
struct arm_smccc_res res;
|
||||
|
||||
if (sdei_firmware_call) {
|
||||
sdei_firmware_call(function_id, arg0, arg1, arg2, arg3, arg4,
|
||||
&res);
|
||||
if (sdei_is_err(&res))
|
||||
err = sdei_to_linux_errno(res.a0);
|
||||
err = sdei_to_linux_errno(res.a0);
|
||||
} else {
|
||||
/*
|
||||
* !sdei_firmware_call means we failed to probe or called
|
||||
@@ -210,36 +205,34 @@ static struct sdei_event *sdei_event_create(u32 event_num,
|
||||
lockdep_assert_held(&sdei_events_lock);
|
||||
|
||||
event = kzalloc(sizeof(*event), GFP_KERNEL);
|
||||
if (!event)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (!event) {
|
||||
err = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&event->list);
|
||||
event->event_num = event_num;
|
||||
|
||||
err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_PRIORITY,
|
||||
&result);
|
||||
if (err) {
|
||||
kfree(event);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
if (err)
|
||||
goto fail;
|
||||
event->priority = result;
|
||||
|
||||
err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_TYPE,
|
||||
&result);
|
||||
if (err) {
|
||||
kfree(event);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
if (err)
|
||||
goto fail;
|
||||
event->type = result;
|
||||
|
||||
if (event->type == SDEI_EVENT_TYPE_SHARED) {
|
||||
reg = kzalloc(sizeof(*reg), GFP_KERNEL);
|
||||
if (!reg) {
|
||||
kfree(event);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
err = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
reg->event_num = event_num;
|
||||
reg->event_num = event->event_num;
|
||||
reg->priority = event->priority;
|
||||
|
||||
reg->callback = cb;
|
||||
@@ -251,8 +244,8 @@ static struct sdei_event *sdei_event_create(u32 event_num,
|
||||
|
||||
regs = alloc_percpu(struct sdei_registered_event);
|
||||
if (!regs) {
|
||||
kfree(event);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
err = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
@@ -272,6 +265,10 @@ static struct sdei_event *sdei_event_create(u32 event_num,
|
||||
spin_unlock(&sdei_list_lock);
|
||||
|
||||
return event;
|
||||
|
||||
fail:
|
||||
kfree(event);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static void sdei_event_destroy_llocked(struct sdei_event *event)
|
||||
@@ -490,16 +487,6 @@ static void _local_event_unregister(void *data)
|
||||
sdei_cross_call_return(arg, err);
|
||||
}
|
||||
|
||||
static int _sdei_event_unregister(struct sdei_event *event)
|
||||
{
|
||||
lockdep_assert_held(&sdei_events_lock);
|
||||
|
||||
if (event->type == SDEI_EVENT_TYPE_SHARED)
|
||||
return sdei_api_event_unregister(event->event_num);
|
||||
|
||||
return sdei_do_cross_call(_local_event_unregister, event);
|
||||
}
|
||||
|
||||
int sdei_event_unregister(u32 event_num)
|
||||
{
|
||||
int err;
|
||||
@@ -509,24 +496,27 @@ int sdei_event_unregister(u32 event_num)
|
||||
|
||||
mutex_lock(&sdei_events_lock);
|
||||
event = sdei_event_find(event_num);
|
||||
do {
|
||||
if (!event) {
|
||||
pr_warn("Event %u not registered\n", event_num);
|
||||
err = -ENOENT;
|
||||
break;
|
||||
}
|
||||
if (!event) {
|
||||
pr_warn("Event %u not registered\n", event_num);
|
||||
err = -ENOENT;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
spin_lock(&sdei_list_lock);
|
||||
event->reregister = false;
|
||||
event->reenable = false;
|
||||
spin_unlock(&sdei_list_lock);
|
||||
spin_lock(&sdei_list_lock);
|
||||
event->reregister = false;
|
||||
event->reenable = false;
|
||||
spin_unlock(&sdei_list_lock);
|
||||
|
||||
err = _sdei_event_unregister(event);
|
||||
if (err)
|
||||
break;
|
||||
if (event->type == SDEI_EVENT_TYPE_SHARED)
|
||||
err = sdei_api_event_unregister(event->event_num);
|
||||
else
|
||||
err = sdei_do_cross_call(_local_event_unregister, event);
|
||||
|
||||
sdei_event_destroy(event);
|
||||
} while (0);
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
sdei_event_destroy(event);
|
||||
unlock:
|
||||
mutex_unlock(&sdei_events_lock);
|
||||
|
||||
return err;
|
||||
@@ -547,7 +537,7 @@ static int sdei_unregister_shared(void)
|
||||
if (event->type != SDEI_EVENT_TYPE_SHARED)
|
||||
continue;
|
||||
|
||||
err = _sdei_event_unregister(event);
|
||||
err = sdei_api_event_unregister(event->event_num);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
@@ -581,25 +571,6 @@ static void _local_event_register(void *data)
|
||||
sdei_cross_call_return(arg, err);
|
||||
}
|
||||
|
||||
static int _sdei_event_register(struct sdei_event *event)
|
||||
{
|
||||
int err;
|
||||
|
||||
lockdep_assert_held(&sdei_events_lock);
|
||||
|
||||
if (event->type == SDEI_EVENT_TYPE_SHARED)
|
||||
return sdei_api_event_register(event->event_num,
|
||||
sdei_entry_point,
|
||||
event->registered,
|
||||
SDEI_EVENT_REGISTER_RM_ANY, 0);
|
||||
|
||||
err = sdei_do_cross_call(_local_event_register, event);
|
||||
if (err)
|
||||
sdei_do_cross_call(_local_event_unregister, event);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
|
||||
{
|
||||
int err;
|
||||
@@ -608,63 +579,44 @@ int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
|
||||
WARN_ON(in_nmi());
|
||||
|
||||
mutex_lock(&sdei_events_lock);
|
||||
do {
|
||||
if (sdei_event_find(event_num)) {
|
||||
pr_warn("Event %u already registered\n", event_num);
|
||||
err = -EBUSY;
|
||||
break;
|
||||
}
|
||||
if (sdei_event_find(event_num)) {
|
||||
pr_warn("Event %u already registered\n", event_num);
|
||||
err = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
event = sdei_event_create(event_num, cb, arg);
|
||||
if (IS_ERR(event)) {
|
||||
err = PTR_ERR(event);
|
||||
pr_warn("Failed to create event %u: %d\n", event_num,
|
||||
err);
|
||||
break;
|
||||
}
|
||||
event = sdei_event_create(event_num, cb, arg);
|
||||
if (IS_ERR(event)) {
|
||||
err = PTR_ERR(event);
|
||||
pr_warn("Failed to create event %u: %d\n", event_num, err);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
cpus_read_lock();
|
||||
err = _sdei_event_register(event);
|
||||
if (err) {
|
||||
sdei_event_destroy(event);
|
||||
pr_warn("Failed to register event %u: %d\n", event_num,
|
||||
err);
|
||||
} else {
|
||||
spin_lock(&sdei_list_lock);
|
||||
event->reregister = true;
|
||||
spin_unlock(&sdei_list_lock);
|
||||
}
|
||||
cpus_read_unlock();
|
||||
} while (0);
|
||||
mutex_unlock(&sdei_events_lock);
|
||||
cpus_read_lock();
|
||||
if (event->type == SDEI_EVENT_TYPE_SHARED) {
|
||||
err = sdei_api_event_register(event->event_num,
|
||||
sdei_entry_point,
|
||||
event->registered,
|
||||
SDEI_EVENT_REGISTER_RM_ANY, 0);
|
||||
} else {
|
||||
err = sdei_do_cross_call(_local_event_register, event);
|
||||
if (err)
|
||||
sdei_do_cross_call(_local_event_unregister, event);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sdei_reregister_event_llocked(struct sdei_event *event)
|
||||
{
|
||||
int err;
|
||||
|
||||
lockdep_assert_held(&sdei_events_lock);
|
||||
lockdep_assert_held(&sdei_list_lock);
|
||||
|
||||
err = _sdei_event_register(event);
|
||||
if (err) {
|
||||
pr_err("Failed to re-register event %u\n", event->event_num);
|
||||
sdei_event_destroy_llocked(event);
|
||||
return err;
|
||||
sdei_event_destroy(event);
|
||||
pr_warn("Failed to register event %u: %d\n", event_num, err);
|
||||
goto cpu_unlock;
|
||||
}
|
||||
|
||||
if (event->reenable) {
|
||||
if (event->type == SDEI_EVENT_TYPE_SHARED)
|
||||
err = sdei_api_event_enable(event->event_num);
|
||||
else
|
||||
err = sdei_do_cross_call(_local_event_enable, event);
|
||||
}
|
||||
|
||||
if (err)
|
||||
pr_err("Failed to re-enable event %u\n", event->event_num);
|
||||
|
||||
spin_lock(&sdei_list_lock);
|
||||
event->reregister = true;
|
||||
spin_unlock(&sdei_list_lock);
|
||||
cpu_unlock:
|
||||
cpus_read_unlock();
|
||||
unlock:
|
||||
mutex_unlock(&sdei_events_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -680,9 +632,24 @@ static int sdei_reregister_shared(void)
|
||||
continue;
|
||||
|
||||
if (event->reregister) {
|
||||
err = sdei_reregister_event_llocked(event);
|
||||
if (err)
|
||||
err = sdei_api_event_register(event->event_num,
|
||||
sdei_entry_point, event->registered,
|
||||
SDEI_EVENT_REGISTER_RM_ANY, 0);
|
||||
if (err) {
|
||||
pr_err("Failed to re-register event %u\n",
|
||||
event->event_num);
|
||||
sdei_event_destroy_llocked(event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (event->reenable) {
|
||||
err = sdei_api_event_enable(event->event_num);
|
||||
if (err) {
|
||||
pr_err("Failed to re-enable event %u\n",
|
||||
event->event_num);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdei_list_lock);
|
||||
@@ -694,7 +661,7 @@ static int sdei_reregister_shared(void)
|
||||
static int sdei_cpuhp_down(unsigned int cpu)
|
||||
{
|
||||
struct sdei_event *event;
|
||||
struct sdei_crosscall_args arg;
|
||||
int err;
|
||||
|
||||
/* un-register private events */
|
||||
spin_lock(&sdei_list_lock);
|
||||
@@ -702,12 +669,11 @@ static int sdei_cpuhp_down(unsigned int cpu)
|
||||
if (event->type == SDEI_EVENT_TYPE_SHARED)
|
||||
continue;
|
||||
|
||||
CROSSCALL_INIT(arg, event);
|
||||
/* call the cross-call function locally... */
|
||||
_local_event_unregister(&arg);
|
||||
if (arg.first_error)
|
||||
err = sdei_do_local_call(_local_event_unregister, event);
|
||||
if (err) {
|
||||
pr_err("Failed to unregister event %u: %d\n",
|
||||
event->event_num, arg.first_error);
|
||||
event->event_num, err);
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdei_list_lock);
|
||||
|
||||
@@ -717,7 +683,7 @@ static int sdei_cpuhp_down(unsigned int cpu)
|
||||
static int sdei_cpuhp_up(unsigned int cpu)
|
||||
{
|
||||
struct sdei_event *event;
|
||||
struct sdei_crosscall_args arg;
|
||||
int err;
|
||||
|
||||
/* re-register/enable private events */
|
||||
spin_lock(&sdei_list_lock);
|
||||
@@ -726,20 +692,19 @@ static int sdei_cpuhp_up(unsigned int cpu)
|
||||
continue;
|
||||
|
||||
if (event->reregister) {
|
||||
CROSSCALL_INIT(arg, event);
|
||||
/* call the cross-call function locally... */
|
||||
_local_event_register(&arg);
|
||||
if (arg.first_error)
|
||||
err = sdei_do_local_call(_local_event_register, event);
|
||||
if (err) {
|
||||
pr_err("Failed to re-register event %u: %d\n",
|
||||
event->event_num, arg.first_error);
|
||||
event->event_num, err);
|
||||
}
|
||||
}
|
||||
|
||||
if (event->reenable) {
|
||||
CROSSCALL_INIT(arg, event);
|
||||
_local_event_enable(&arg);
|
||||
if (arg.first_error)
|
||||
err = sdei_do_local_call(_local_event_enable, event);
|
||||
if (err) {
|
||||
pr_err("Failed to re-enable event %u: %d\n",
|
||||
event->event_num, arg.first_error);
|
||||
event->event_num, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&sdei_list_lock);
|
||||
@@ -976,7 +941,7 @@ static int sdei_get_conduit(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
pr_warn("invalid \"method\" property: %s\n", method);
|
||||
} else if (IS_ENABLED(CONFIG_ACPI) && !acpi_disabled) {
|
||||
} else if (!acpi_disabled) {
|
||||
if (acpi_psci_use_hvc()) {
|
||||
sdei_firmware_call = &sdei_smccc_hvc;
|
||||
return SMCCC_CONDUIT_HVC;
|
||||
@@ -1000,8 +965,6 @@ static int sdei_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
err = sdei_api_get_version(&ver);
|
||||
if (err == -EOPNOTSUPP)
|
||||
pr_err("advertised but not implemented in platform firmware\n");
|
||||
if (err) {
|
||||
pr_err("Failed to get SDEI version: %d\n", err);
|
||||
sdei_mark_interface_broken();
|
||||
@@ -1099,16 +1062,20 @@ static bool __init sdei_present_acpi(void)
|
||||
|
||||
static int __init sdei_init(void)
|
||||
{
|
||||
int ret = platform_driver_register(&sdei_driver);
|
||||
struct platform_device *pdev;
|
||||
int ret;
|
||||
|
||||
if (!ret && sdei_present_acpi()) {
|
||||
struct platform_device *pdev;
|
||||
ret = platform_driver_register(&sdei_driver);
|
||||
if (ret || !sdei_present_acpi())
|
||||
return ret;
|
||||
|
||||
pdev = platform_device_register_simple(sdei_driver.driver.name,
|
||||
0, NULL, 0);
|
||||
if (IS_ERR(pdev))
|
||||
pr_info("Failed to register ACPI:SDEI platform device %ld\n",
|
||||
PTR_ERR(pdev));
|
||||
pdev = platform_device_register_simple(sdei_driver.driver.name,
|
||||
0, NULL, 0);
|
||||
if (IS_ERR(pdev)) {
|
||||
ret = PTR_ERR(pdev);
|
||||
platform_driver_unregister(&sdei_driver);
|
||||
pr_info("Failed to register ACPI:SDEI platform device %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -64,7 +64,6 @@ lib-$(CONFIG_ARM) += arm32-stub.o
|
||||
lib-$(CONFIG_ARM64) += arm64-stub.o
|
||||
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
|
||||
|
||||
@@ -77,7 +77,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
||||
|
||||
kernel_size = _edata - _text;
|
||||
kernel_memsize = kernel_size + (_end - _edata);
|
||||
*reserve_size = kernel_memsize + TEXT_OFFSET % min_kimg_align();
|
||||
*reserve_size = kernel_memsize;
|
||||
|
||||
if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && phys_seed != 0) {
|
||||
/*
|
||||
@@ -91,7 +91,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
||||
}
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
if (IS_ALIGNED((u64)_text - TEXT_OFFSET, min_kimg_align())) {
|
||||
if (IS_ALIGNED((u64)_text, min_kimg_align())) {
|
||||
/*
|
||||
* Just execute from wherever we were loaded by the
|
||||
* UEFI PE/COFF loader if the alignment is suitable.
|
||||
@@ -111,7 +111,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
|
||||
}
|
||||
}
|
||||
|
||||
*image_addr = *reserve_addr + TEXT_OFFSET % min_kimg_align();
|
||||
*image_addr = *reserve_addr;
|
||||
memcpy((void *)*image_addr, _text, kernel_size);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
Reference in New Issue
Block a user