mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-18 09:42:37 -05:00
Remove superfluous newlines from inline assemblies. Compilers use the number of lines of inline assemblies as heuristic for the complexity and inline decisions. Therefore inline assemblies should only contain as many lines as required. A lot of inline assemblies contain a superfluous newline for the last line. Remove such newlines to improve compiler inlining decisions. Suggested-by: Juergen Christ <jchrist@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com> Reviewed-by: Juergen Christ <jchrist@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
49 lines
1.0 KiB
C
49 lines
1.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include <asm/rwonce.h>
|
|
#include <asm/page.h>
|
|
#include <asm/skey.h>
|
|
|
|
int skey_regions_initialized;
|
|
|
|
static inline unsigned long load_real_address(unsigned long address)
|
|
{
|
|
unsigned long real;
|
|
|
|
asm volatile(
|
|
" lra %[real],0(%[address])"
|
|
: [real] "=d" (real)
|
|
: [address] "a" (address)
|
|
: "cc");
|
|
return real;
|
|
}
|
|
|
|
/*
|
|
* Initialize storage keys of registered memory regions with the
|
|
* default key. This is useful for code which is executed with a
|
|
* non-default access key.
|
|
*/
|
|
void __skey_regions_initialize(void)
|
|
{
|
|
unsigned long address, real;
|
|
struct skey_region *r, *end;
|
|
|
|
r = __skey_region_start;
|
|
end = __skey_region_end;
|
|
while (r < end) {
|
|
address = r->start & PAGE_MASK;
|
|
do {
|
|
real = load_real_address(address);
|
|
page_set_storage_key(real, PAGE_DEFAULT_KEY, 1);
|
|
address += PAGE_SIZE;
|
|
} while (address < r->end);
|
|
r++;
|
|
}
|
|
/*
|
|
* Make sure storage keys are initialized before
|
|
* skey_regions_initialized is changed.
|
|
*/
|
|
barrier();
|
|
WRITE_ONCE(skey_regions_initialized, 1);
|
|
}
|