The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arch/score/mm/tlb-miss.S

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * arch/score/mm/tlbex.S
    3  *
    4  * Score Processor version.
    5  *
    6  * Copyright (C) 2009 Sunplus Core Technology Co., Ltd.
    7  *  Lennox Wu <lennox.wu@sunplusct.com>
    8  *  Chen Liqin <liqin.chen@sunplusct.com>
    9  *
   10  * This program is free software; you can redistribute it and/or modify
   11  * it under the terms of the GNU General Public License as published by
   12  * the Free Software Foundation; either version 2 of the License, or
   13  * (at your option) any later version.
   14  *
   15  * This program is distributed in the hope that it will be useful,
   16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18  * GNU General Public License for more details.
   19  *
   20  * You should have received a copy of the GNU General Public License
   21  * along with this program; if not, see the file COPYING, or write
   22  * to the Free Software Foundation, Inc.,
   23  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   24  */
   25 
   26 #include <asm/asmmacro.h>
   27 #include <asm/pgtable-bits.h>
   28 #include <asm/scoreregs.h>
   29 
   30 /*
   31 * After this macro runs, the pte faulted on is
   32 * in register PTE, a ptr into the table in which
   33 * the pte belongs is in PTR.
   34 */
   35         .macro  load_pte, pte, ptr
   36         la      \ptr, pgd_current
   37         lw      \ptr, [\ptr, 0]
   38         mfcr    \pte, cr6
   39         srli    \pte, \pte, 22
   40         slli    \pte, \pte, 2
   41         add     \ptr, \ptr, \pte
   42         lw      \ptr, [\ptr, 0]
   43         mfcr    \pte, cr6
   44         srli    \pte, \pte, 10
   45         andi    \pte, 0xffc
   46         add     \ptr, \ptr, \pte
   47         lw      \pte, [\ptr, 0]
   48         .endm
   49 
   50         .macro  pte_reload, ptr
   51         lw      \ptr, [\ptr, 0]
   52         mtcr    \ptr, cr12
   53         nop
   54         nop
   55         nop
   56         nop
   57         nop
   58         .endm
   59 
   60         .macro do_fault, write
   61         SAVE_ALL
   62         mfcr    r6, cr6
   63         mv      r4, r0
   64         ldi     r5, \write
   65         la      r8, do_page_fault
   66         brl     r8
   67         j       ret_from_exception
   68         .endm
   69 
   70         .macro  pte_writable, pte, ptr, label
   71         andi    \pte, 0x280
   72         cmpi.c  \pte, 0x280
   73         bne     \label
   74         lw      \pte, [\ptr, 0]         /*reload PTE*/
   75         .endm
   76 
   77 /*
   78  * Make PTE writable, update software status bits as well,
   79  * then store at PTR.
   80  */
   81         .macro  pte_makewrite, pte, ptr
   82         ori     \pte, 0x426
   83         sw      \pte, [\ptr, 0]
   84         .endm
   85 
   86         .text
   87 ENTRY(score7_FTLB_refill_Handler)
   88         la      r31, pgd_current        /* get pgd pointer */
   89         lw      r31, [r31, 0]           /* get the address of PGD */
   90         mfcr    r30, cr6
   91         srli    r30, r30, 22            /* PGDIR_SHIFT = 22*/
   92         slli    r30, r30, 2
   93         add     r31, r31, r30
   94         lw      r31, [r31, 0]           /* get the address of the start address of PTE table */
   95 
   96         mfcr    r30, cr9
   97         andi    r30, 0xfff              /* equivalent to get PET index and right shift 2 bits */
   98         add     r31, r31, r30
   99         lw      r30, [r31, 0]           /* load pte entry */
  100         mtcr    r30, cr12
  101         nop
  102         nop
  103         nop
  104         nop
  105         nop
  106         mtrtlb
  107         nop
  108         nop
  109         nop
  110         nop
  111         nop
  112         rte                             /* 6 cycles to make sure tlb entry works */
  113 
  114 ENTRY(score7_KSEG_refill_Handler)
  115         la      r31, pgd_current        /* get pgd pointer */
  116         lw      r31, [r31, 0]           /* get the address of PGD */
  117         mfcr    r30, cr6
  118         srli    r30, r30, 22            /* PGDIR_SHIFT = 22 */
  119         slli    r30, r30, 2
  120         add     r31, r31, r30
  121         lw      r31, [r31, 0]           /* get the address of the start address of PTE table */
  122 
  123         mfcr    r30, cr6                /* get Bad VPN */
  124         srli    r30, r30, 10
  125         andi    r30, 0xffc              /* PTE VPN mask (bit 11~2) */
  126 
  127         add     r31, r31, r30
  128         lw      r30, [r31, 0]           /* load pte entry */
  129         mtcr    r30, cr12
  130         nop
  131         nop
  132         nop
  133         nop
  134         nop
  135         mtrtlb
  136         nop
  137         nop
  138         nop
  139         nop
  140         nop
  141         rte                             /* 6 cycles to make sure tlb entry works */
  142 
  143 nopage_tlbl:
  144         do_fault        0               /* Read */
  145 
  146 ENTRY(handle_tlb_refill)
  147         load_pte        r30, r31
  148         pte_writable    r30, r31, handle_tlb_refill_nopage
  149         pte_makewrite   r30, r31        /* Access|Modify|Dirty|Valid */
  150         pte_reload      r31
  151         mtrtlb
  152         nop
  153         nop
  154         nop
  155         nop
  156         nop
  157         rte
  158 handle_tlb_refill_nopage:
  159         do_fault        0               /* Read */
  160 
  161 ENTRY(handle_tlb_invaild)
  162         load_pte        r30, r31
  163         stlb                            /* find faulting entry */
  164         pte_writable    r30, r31, handle_tlb_invaild_nopage
  165         pte_makewrite   r30, r31        /* Access|Modify|Dirty|Valid */
  166         pte_reload      r31
  167         mtptlb
  168         nop
  169         nop
  170         nop
  171         nop
  172         nop
  173         rte
  174 handle_tlb_invaild_nopage:
  175         do_fault        0               /* Read */
  176 
  177 ENTRY(handle_mod)
  178         load_pte        r30, r31
  179         stlb                            /* find faulting entry */
  180         andi    r30, _PAGE_WRITE        /* Writable? */
  181         cmpz.c  r30
  182         beq     nowrite_mod
  183         lw      r30, [r31, 0]           /* reload into r30 */
  184 
  185         /* Present and writable bits set, set accessed and dirty bits. */
  186         pte_makewrite   r30, r31
  187 
  188         /* Now reload the entry into the tlb. */
  189         pte_reload      r31
  190         mtptlb
  191         nop
  192         nop
  193         nop
  194         nop
  195         nop
  196         rte
  197 
  198 nowrite_mod:
  199         do_fault        1       /* Write */

Cache object: 9ef5a8449afbb6310c43b33abb447b5c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.