From ac5ff8f4a72f7b4e66f73c3c6cb9fe7758cf6f12 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Tue, 3 Jun 1997 09:23:20 +0000 Subject: Sync with Linux 2.1.42. --- arch/sparc/kernel/setup.c | 3 +-- arch/sparc/lib/blockops.S | 17 +++++++-------- arch/sparc/mm/hypersparc.S | 52 +++++++++++++++++++++++++++++++++++++++------- arch/sparc/mm/srmmu.c | 13 +++--------- arch/sparc/prom/memory.c | 9 ++++---- 5 files changed, 61 insertions(+), 33 deletions(-) (limited to 'arch/sparc') diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c index aa204db06..a6b3f9e07 100644 --- a/arch/sparc/kernel/setup.c +++ b/arch/sparc/kernel/setup.c @@ -1,4 +1,4 @@ -/* $Id: setup.c,v 1.84 1997/05/08 17:45:16 davem Exp $ +/* $Id: setup.c,v 1.85 1997/05/27 06:45:54 davem Exp $ * linux/arch/sparc/kernel/setup.c * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -79,7 +79,6 @@ asmlinkage void sys_sync(void); /* it's really int */ void prom_sync_me(void) { unsigned long prom_tbr, flags; - int cpu = smp_processor_id(); #ifdef __SMP__ global_irq_holder = NO_PROC_ID; diff --git a/arch/sparc/lib/blockops.S b/arch/sparc/lib/blockops.S index c11ab1b20..a5a4bffad 100644 --- a/arch/sparc/lib/blockops.S +++ b/arch/sparc/lib/blockops.S @@ -1,4 +1,4 @@ -/* $Id: blockops.S,v 1.6 1997/05/03 02:01:54 davem Exp $ +/* $Id: blockops.S,v 1.7 1997/05/20 07:58:28 jj Exp $ * blockops.S: Common block zero optimized routines. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -45,8 +45,11 @@ .text .align 4 + .globl C_LABEL(bzero_1page), C_LABEL(__copy_1page) -generic_bzero_1page: +C_LABEL(bzero_1page): +/* NOTE: If you change the number of insns of this routine, please check + * arch/sparc/mm/hypersparc.S */ /* %o0 = buf */ or %g0, %g0, %g1 or %o0, %g0, %o1 @@ -63,7 +66,9 @@ generic_bzero_1page: retl nop -__generic_copy_1page: +C_LABEL(__copy_1page): +/* NOTE: If you change the number of insns of this routine, please check + * arch/sparc/mm/hypersparc.S */ /* %o0 = dst, %o1 = src */ or %g0, 0x10, %g1 1: @@ -82,9 +87,3 @@ __generic_copy_1page: retl nop - - .data - .align 4 - .globl C_LABEL(bzero_1page), C_LABEL(__copy_1page) -C_LABEL(bzero_1page): .word generic_bzero_1page -C_LABEL(__copy_1page): .word __generic_copy_1page diff --git a/arch/sparc/mm/hypersparc.S b/arch/sparc/mm/hypersparc.S index 62e2022e0..e6ba7b235 100644 --- a/arch/sparc/mm/hypersparc.S +++ b/arch/sparc/mm/hypersparc.S @@ -1,4 +1,4 @@ -/* $Id: hypersparc.S,v 1.7 1997/05/03 05:09:12 davem Exp $ +/* $Id: hypersparc.S,v 1.10 1997/05/27 19:29:58 jj Exp $ * hypersparc.S: High speed Hypersparc mmu/cache operations. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) @@ -9,6 +9,7 @@ #include #include #include +#include #define WINDOW_FLUSH(tmp1, tmp2) \ mov 0, tmp1; \ @@ -335,17 +336,19 @@ hypersparc_flush_tlb_page_out: retl sta %g5, [%g1] ASI_M_MMUREGS + __INIT + /* High speed page clear/copy. */ - .globl hypersparc_bzero_1page, hypersparc_copy_1page hypersparc_bzero_1page: +/* NOTE: This routine has to be shorter than 40insns --jj */ clr %g1 mov 32, %g2 - add %g2, %g2, %g3 - add %g2, %g3, %g4 - add %g2, %g4, %g5 - add %g2, %g5, %g7 - add %g2, %g7, %o2 - add %g2, %o2, %o3 + mov 64, %g3 + mov 96, %g4 + mov 128, %g5 + mov 160, %g7 + mov 192, %o2 + mov 224, %o3 mov 16, %o1 1: stda %g0, [%o0 + %g0] ASI_M_BFILL @@ -364,6 +367,7 @@ hypersparc_bzero_1page: nop hypersparc_copy_1page: +/* NOTE: This routine has to be shorter than 70insns --jj */ sub %o1, %o0, %o2 ! difference mov 16, %g1 1: @@ -388,3 +392,35 @@ hypersparc_copy_1page: retl nop + + .globl hypersparc_setup_blockops +hypersparc_setup_blockops: + sethi %hi(bzero_1page), %o0 + or %o0, %lo(bzero_1page), %o0 + sethi %hi(hypersparc_bzero_1page), %o1 + or %o1, %lo(hypersparc_bzero_1page), %o1 + sethi %hi(hypersparc_copy_1page), %o2 + or %o2, %lo(hypersparc_copy_1page), %o2 + ld [%o1], %o4 +1: + add %o1, 4, %o1 + st %o4, [%o0] + add %o0, 4, %o0 + cmp %o1, %o2 + bne 1b + ld [%o1], %o4 + sethi %hi(__copy_1page), %o0 + or %o0, %lo(__copy_1page), %o0 + sethi %hi(hypersparc_setup_blockops), %o2 + or %o2, %lo(hypersparc_setup_blockops), %o2 + ld [%o1], %o4 +1: + add %o1, 4, %o1 + st %o4, [%o0] + add %o0, 4, %o0 + cmp %o1, %o2 + bne 1b + ld [%o1], %o4 + sta %g0, [%g0] ASI_M_FLUSH_IWHOLE + retl + nop diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index b04064efb..7420b98cb 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -1,4 +1,4 @@ -/* $Id: srmmu.c,v 1.146 1997/05/18 21:11:09 davem Exp $ +/* $Id: srmmu.c,v 1.147 1997/05/20 07:58:42 jj Exp $ * srmmu.c: SRMMU specific routines for memory management. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -1239,8 +1239,7 @@ extern void hypersparc_flush_tlb_all(void); extern void hypersparc_flush_tlb_mm(struct mm_struct *mm); extern void hypersparc_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end); extern void hypersparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long page); -extern void hypersparc_bzero_1page(void *); -extern void hypersparc_copy_1page(void *, const void *); +extern void hypersparc_setup_blockops(void); static void srmmu_set_pte_nocache_hyper(pte_t *ptep, pte_t pteval) { @@ -2411,13 +2410,7 @@ __initfunc(static void init_hypersparc(void)) sparc_update_rootmmu_dir = hypersparc_update_rootmmu_dir; poke_srmmu = poke_hypersparc; - /* High performance page copy/clear. */ - { extern void (*__copy_1page)(void *, const void *); - extern void (*bzero_1page)(void *); - - __copy_1page = hypersparc_copy_1page; - bzero_1page = hypersparc_bzero_1page; - } + hypersparc_setup_blockops(); } static void poke_cypress(void) diff --git a/arch/sparc/prom/memory.c b/arch/sparc/prom/memory.c index e2a809017..b53bd17ea 100644 --- a/arch/sparc/prom/memory.c +++ b/arch/sparc/prom/memory.c @@ -1,4 +1,4 @@ -/* $Id: memory.c,v 1.10 1997/03/18 17:58:27 jj Exp $ +/* $Id: memory.c,v 1.12 1997/05/27 06:45:57 davem Exp $ * memory.c: Prom routine for acquiring various bits of information * about RAM on the machine, both virtual and physical. * @@ -116,7 +116,7 @@ __initfunc(void prom_meminit(void)) num_regs = (num_regs/sizeof(struct linux_prom_registers)); for(iter=0; iter