diff --git a/arch/sw_64/kernel/smp.c b/arch/sw_64/kernel/smp.c index eb041c38889bcb7d53a5df6a26dfa2ee65c54c9f..cb77f4c3559cdc518de904ba23c4d662d6e9a619 100644 --- a/arch/sw_64/kernel/smp.c +++ b/arch/sw_64/kernel/smp.c @@ -164,6 +164,8 @@ void smp_callin(void) unsigned long __maybe_unused nmi_stack; save_ktp(); + /* update csr:ptbr */ + update_ptbr_sys(virt_to_phys(init_mm.pgd)); upshift_freq(); cpuid = smp_processor_id(); WARN_ON_ONCE(!irqs_disabled()); @@ -185,8 +187,6 @@ void smp_callin(void) /* All kernel threads share the same mm context. */ mmgrab(&init_mm); current->active_mm = &init_mm; - /* update csr:ptbr */ - update_ptbr_sys(virt_to_phys(init_mm.pgd)); #ifdef CONFIG_SUBARCH_C4 update_ptbr_usr(__pa_symbol(empty_zero_page)); #endif diff --git a/arch/sw_64/lib/clear_page_simd.S b/arch/sw_64/lib/clear_page_simd.S index e02d703b0bc2a2938b83745669d178379968e103..d4abbb5578a94bcc63c47fa0796e32ea772402ec 100644 --- a/arch/sw_64/lib/clear_page_simd.S +++ b/arch/sw_64/lib/clear_page_simd.S @@ -4,21 +4,22 @@ */ #include #include +#include #ifndef CONFIG_SUBARCH_C3B -# define VSTD_CPU vstd_nc -#else # define VSTD_CPU vstd +#else +# define VSTD_CPU vstd_nc #endif .text - .align 4 + .align 5 .global clear_page .ent clear_page clear_page: .prologue 0 - ldi $1, 0x2000($16) + ldi $1, PAGE_SIZE($16) 1: VSTD_CPU $f31, 0($16) @@ -26,9 +27,16 @@ clear_page: VSTD_CPU $f31, 64($16) VSTD_CPU $f31, 96($16) addl $16, 128, $16 + .align 3 cmpeq $16, $1, $2 beq $2, 1b +#ifdef CONFIG_SUBARCH_C3B + memb +#endif + + .align 4 + nop ret .end clear_page diff --git a/arch/sw_64/lib/copy_page_simd.S b/arch/sw_64/lib/copy_page_simd.S index 36763127504a5749eb4575a6c3e835d2064881b2..a89cdae4f1d92d4a1c8bb904954158d36b25f9a2 100644 --- a/arch/sw_64/lib/copy_page_simd.S +++ b/arch/sw_64/lib/copy_page_simd.S @@ -6,21 +6,22 @@ */ #include #include +#include #ifndef CONFIG_SUBARCH_C3B -# define VSTD_CPU vstd_nc -#else # define VSTD_CPU vstd +#else +# define VSTD_CPU vstd_nc #endif .text - .align 4 + .align 5 .global copy_page .ent copy_page copy_page: .prologue 0 - ldi $1, 0x2000($16) + ldi $1, PAGE_SIZE($16) subl $sp, 64, $sp bic $sp, 0x1f, $3 @@ -46,16 +47,22 @@ copy_page: addl $16, 128, $16 addl $17, 128, $17 + .align 3 cmpeq $16, $1, $2 beq $2, 1b #ifdef CONFIG_SUBARCH_C4 csrw $4, CSR_WR_FREGS #endif +#ifdef CONFIG_SUBARCH_C3B + memb +#endif vldd $f10, 0($3) addl $sp, 64, $sp + .align 4 + nop ret .end copy_page diff --git a/arch/sw_64/mm/init.c b/arch/sw_64/mm/init.c index f9055604a4846d406e6bf70d397d99d9b6631b6f..d59ab7279080fb8e81b8a1e41a3a4c3c374fbf63 100644 --- a/arch/sw_64/mm/init.c +++ b/arch/sw_64/mm/init.c @@ -531,7 +531,7 @@ void __init paging_init(void) PAGE_KERNEL_NOEXEC, pgtable_alloc_fixmap); if (is_in_guest()) create_pgd_mapping(pgdir, sw64_guest_reset_start, __pa(sw64_guest_reset_start), sw64_guest_reset_size, - PAGE_KERNEL_NOEXEC, pgtable_alloc_fixmap); + PAGE_KERNEL_READONLY_EXEC, pgtable_alloc_fixmap); memblock_mark_nomap(__pa(sw64_reserve_start), __pa((unsigned long)_end - sw64_reserve_start)); diff --git a/arch/sw_64/mm/mmap.c b/arch/sw_64/mm/mmap.c index 4eedb6d666336c21655ae29bb931b4b52ec45e4e..095c55dab30897ab96c0d321134769d675f92a13 100644 --- a/arch/sw_64/mm/mmap.c +++ b/arch/sw_64/mm/mmap.c @@ -113,7 +113,7 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr, unsigned long arch_mmap_rnd(void) { - unsigned long rnd = get_random_long() & 0x7fffffful; + unsigned long rnd = get_random_long() & 0x7ffful; return rnd << PAGE_SHIFT; }