|
@@ -409,6 +409,9 @@ setup_lowcore(void)
|
|
lc->current_task = (unsigned long) init_thread_union.thread_info.task;
|
|
lc->current_task = (unsigned long) init_thread_union.thread_info.task;
|
|
lc->thread_info = (unsigned long) &init_thread_union;
|
|
lc->thread_info = (unsigned long) &init_thread_union;
|
|
lc->machine_flags = S390_lowcore.machine_flags;
|
|
lc->machine_flags = S390_lowcore.machine_flags;
|
|
|
|
+ lc->stfl_fac_list = S390_lowcore.stfl_fac_list;
|
|
|
|
+ memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list,
|
|
|
|
+ MAX_FACILITY_BIT/8);
|
|
#ifndef CONFIG_64BIT
|
|
#ifndef CONFIG_64BIT
|
|
if (MACHINE_HAS_IEEE) {
|
|
if (MACHINE_HAS_IEEE) {
|
|
lc->extended_save_area_addr = (__u32)
|
|
lc->extended_save_area_addr = (__u32)
|
|
@@ -675,12 +678,9 @@ setup_memory(void)
|
|
static void __init setup_hwcaps(void)
|
|
static void __init setup_hwcaps(void)
|
|
{
|
|
{
|
|
static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 };
|
|
static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 };
|
|
- unsigned long long facility_list_extended;
|
|
|
|
- unsigned int facility_list;
|
|
|
|
struct cpuid cpu_id;
|
|
struct cpuid cpu_id;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- facility_list = stfl();
|
|
|
|
/*
|
|
/*
|
|
* The store facility list bits numbers as found in the principles
|
|
* The store facility list bits numbers as found in the principles
|
|
* of operation are numbered with bit 1UL<<31 as number 0 to
|
|
* of operation are numbered with bit 1UL<<31 as number 0 to
|
|
@@ -700,11 +700,10 @@ static void __init setup_hwcaps(void)
|
|
* HWCAP_S390_ETF3EH bit 8 (22 && 30).
|
|
* HWCAP_S390_ETF3EH bit 8 (22 && 30).
|
|
*/
|
|
*/
|
|
for (i = 0; i < 6; i++)
|
|
for (i = 0; i < 6; i++)
|
|
- if (facility_list & (1UL << (31 - stfl_bits[i])))
|
|
|
|
|
|
+ if (test_facility(stfl_bits[i]))
|
|
elf_hwcap |= 1UL << i;
|
|
elf_hwcap |= 1UL << i;
|
|
|
|
|
|
- if ((facility_list & (1UL << (31 - 22)))
|
|
|
|
- && (facility_list & (1UL << (31 - 30))))
|
|
|
|
|
|
+ if (test_facility(22) && test_facility(30))
|
|
elf_hwcap |= HWCAP_S390_ETF3EH;
|
|
elf_hwcap |= HWCAP_S390_ETF3EH;
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -720,12 +719,8 @@ static void __init setup_hwcaps(void)
|
|
* translated to:
|
|
* translated to:
|
|
* HWCAP_S390_DFP bit 6 (42 && 44).
|
|
* HWCAP_S390_DFP bit 6 (42 && 44).
|
|
*/
|
|
*/
|
|
- if ((elf_hwcap & (1UL << 2)) &&
|
|
|
|
- __stfle(&facility_list_extended, 1) > 0) {
|
|
|
|
- if ((facility_list_extended & (1ULL << (63 - 42)))
|
|
|
|
- && (facility_list_extended & (1ULL << (63 - 44))))
|
|
|
|
- elf_hwcap |= HWCAP_S390_DFP;
|
|
|
|
- }
|
|
|
|
|
|
+ if ((elf_hwcap & (1UL << 2)) && test_facility(42) && test_facility(44))
|
|
|
|
+ elf_hwcap |= HWCAP_S390_DFP;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Huge page support HWCAP_S390_HPAGE is bit 7.
|
|
* Huge page support HWCAP_S390_HPAGE is bit 7.
|