Home | History | Annotate | Line # | Download | only in booke
booke_stubs.c revision 1.4
      1 /*-
      2  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
      3  * All rights reserved.
      4  *
      5  * This code is derived from software contributed to The NetBSD Foundation
      6  * by Raytheon BBN Technologies Corp and Defense Advanced Research Projects
      7  * Agency and which was developed by Matt Thomas of 3am Software Foundry.
      8  *
      9  * This material is based upon work supported by the Defense Advanced Research
     10  * Projects Agency and Space and Naval Warfare Systems Center, Pacific, under
     11  * Contract No. N66001-09-C-2073.
     12  * Approved for Public Release, Distribution Unlimited
     13  *
     14  * Redistribution and use in source and binary forms, with or without
     15  * modification, are permitted provided that the following conditions
     16  * are met:
     17  * 1. Redistributions of source code must retain the above copyright
     18  *    notice, this list of conditions and the following disclaimer.
     19  * 2. Redistributions in binary form must reproduce the above copyright
     20  *    notice, this list of conditions and the following disclaimer in the
     21  *    documentation and/or other materials provided with the distribution.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     24  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     25  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     26  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     27  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     33  * POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 
     36 #define	__INTR_PRIVATE
     37 #define	__INTR_NOINLINE
     38 
     39 #include <sys/cdefs.h>
     40 
     41 __KERNEL_RCSID(0, "$NetBSD: booke_stubs.c,v 1.4 2011/02/18 21:08:18 matt Exp $");
     42 
     43 #include <sys/param.h>
     44 #include <sys/cpu.h>
     45 #include <sys/intr.h>
     46 
     47 #include <powerpc/instr.h>
     48 #include <powerpc/booke/cpuvar.h>
     49 
     50 #define	__stub	__section(".stub") __noprofile
     51 
     52 void tlb_set_asid(uint32_t) __stub;
     53 
     54 void
     55 tlb_set_asid(uint32_t asid)
     56 {
     57 	(*cpu_md_ops.md_tlb_ops->md_tlb_set_asid)(asid);
     58 }
     59 
     60 uint32_t tlb_get_asid(void) __stub;
     61 
     62 uint32_t
     63 tlb_get_asid(void)
     64 {
     65 	return (*cpu_md_ops.md_tlb_ops->md_tlb_get_asid)();
     66 }
     67 
     68 void tlb_invalidate_all(void) __stub;
     69 
     70 void
     71 tlb_invalidate_all(void)
     72 {
     73 	(*cpu_md_ops.md_tlb_ops->md_tlb_invalidate_all)();
     74 }
     75 
     76 void tlb_invalidate_globals(void) __stub;
     77 
     78 void
     79 tlb_invalidate_globals(void)
     80 {
     81 	(*cpu_md_ops.md_tlb_ops->md_tlb_invalidate_globals)();
     82 }
     83 
     84 void tlb_invalidate_asids(uint32_t, uint32_t) __stub;
     85 
     86 void
     87 tlb_invalidate_asids(uint32_t asid_lo, uint32_t asid_hi)
     88 {
     89 	(*cpu_md_ops.md_tlb_ops->md_tlb_invalidate_asids)(asid_lo, asid_hi);
     90 }
     91 
     92 void tlb_invalidate_addr(vaddr_t, uint32_t) __stub;
     93 
     94 void
     95 tlb_invalidate_addr(vaddr_t va, uint32_t asid)
     96 {
     97 	(*cpu_md_ops.md_tlb_ops->md_tlb_invalidate_addr)(va, asid);
     98 }
     99 
    100 bool tlb_update_addr(vaddr_t, uint32_t, uint32_t, bool) __stub;
    101 
    102 bool
    103 tlb_update_addr(vaddr_t va, uint32_t asid, uint32_t pte, bool insert_p)
    104 {
    105 	return (*cpu_md_ops.md_tlb_ops->md_tlb_update_addr)(va, asid, pte, insert_p);
    106 }
    107 
    108 void tlb_read_entry(size_t, struct tlbmask *) __stub;
    109 
    110 void
    111 tlb_read_entry(size_t pos, struct tlbmask *tlb)
    112 {
    113 	(*cpu_md_ops.md_tlb_ops->md_tlb_read_entry)(pos, tlb);
    114 }
    115 
    116 u_int tlb_record_asids(u_long *, uint32_t) __stub;
    117 
    118 u_int
    119 tlb_record_asids(u_long *bitmap, uint32_t start)
    120 {
    121 	return (*cpu_md_ops.md_tlb_ops->md_tlb_record_asids)(bitmap, start);
    122 }
    123 
    124 void *tlb_mapiodev(paddr_t, psize_t) __stub;
    125 
    126 void *
    127 tlb_mapiodev(paddr_t pa, psize_t len)
    128 {
    129 	return (*cpu_md_ops.md_tlb_ops->md_tlb_mapiodev)(pa, len);
    130 }
    131 
    132 void tlb_unmapiodev(vaddr_t, vsize_t) __stub;
    133 
    134 void
    135 tlb_unmapiodev(vaddr_t va, vsize_t len)
    136 {
    137 	(*cpu_md_ops.md_tlb_ops->md_tlb_unmapiodev)(va, len);
    138 }
    139 
    140 int tlb_ioreserve(vaddr_t, vsize_t, uint32_t) __stub;
    141 
    142 int
    143 tlb_ioreserve(vaddr_t va, vsize_t len, uint32_t pte)
    144 {
    145 	return (*cpu_md_ops.md_tlb_ops->md_tlb_ioreserve)(va, len, pte);
    146 }
    147 
    148 int tlb_iorelease(vaddr_t) __stub;
    149 
    150 int
    151 tlb_iorelease(vaddr_t va)
    152 {
    153 	return (*cpu_md_ops.md_tlb_ops->md_tlb_iorelease)(va);
    154 }
    155 
    156 void tlb_dump(void (*)(const char *, ...)) __stub;
    157 
    158 void
    159 tlb_dump(void (*pr)(const char *, ...))
    160 {
    161 	(*cpu_md_ops.md_tlb_ops->md_tlb_dump)(pr);
    162 }
    163 
    164 void tlb_walk(void *, bool (*)(void *, vaddr_t, uint32_t, uint32_t))
    165     __stub;
    166 
    167 void
    168 tlb_walk(void *ctx, bool (*func)(void *, vaddr_t, uint32_t, uint32_t))
    169 {
    170 	(*cpu_md_ops.md_tlb_ops->md_tlb_walk)(ctx, func);
    171 }
    172 
    173 void *intr_establish(int, int, int, int (*)(void *), void *) __stub;
    174 
    175 void *
    176 intr_establish(int irq, int ipl, int ist, int (*func)(void *), void *arg)
    177 {
    178 	return (*powerpc_intrsw->intrsw_establish)(irq, ipl, ist, func, arg);
    179 }
    180 
    181 void intr_disestablish(void *) __stub;
    182 
    183 void
    184 intr_disestablish(void *ih)
    185 {
    186 	(*powerpc_intrsw->intrsw_disestablish)(ih);
    187 }
    188 
    189 const char *intr_string(int, int) __stub;
    190 
    191 const char *
    192 intr_string(int irq, int ist)
    193 {
    194 	return (*powerpc_intrsw->intrsw_string)(irq, ist);
    195 }
    196 
    197 void spl0(void) __stub;
    198 
    199 void
    200 spl0(void)
    201 {
    202 	(*powerpc_intrsw->intrsw_spl0)();
    203 }
    204 
    205 int splraise(int) __stub;
    206 
    207 int
    208 splraise(int ipl)
    209 {
    210 	return (*powerpc_intrsw->intrsw_splraise)(ipl);
    211 }
    212 
    213 #if 0
    214 int splhigh(void) __stub;
    215 #endif
    216 
    217 /*
    218  * This is called by softint_cleanup and can't be a stub but it can call
    219  * a stub.
    220  */
    221 int
    222 splhigh(void)
    223 {
    224 	return splraise(IPL_HIGH);
    225 }
    226 
    227 void splx(int) __stub;
    228 
    229 void
    230 splx(int ipl)
    231 {
    232 	return (*powerpc_intrsw->intrsw_splx)(ipl);
    233 }
    234 
    235 void softint_init_md(struct lwp *, u_int, uintptr_t *) __stub;
    236 
    237 void
    238 softint_init_md(struct lwp *l, u_int level, uintptr_t *machdep_p)
    239 {
    240 	(*powerpc_intrsw->intrsw_softint_init_md)(l, level, machdep_p);
    241 }
    242 
    243 void softint_trigger(uintptr_t) __stub;
    244 
    245 void
    246 softint_trigger(uintptr_t machdep)
    247 {
    248 	(*powerpc_intrsw->intrsw_softint_trigger)(machdep);
    249 }
    250 
    251 void intr_cpu_init(struct cpu_info *) __stub;
    252 
    253 void
    254 intr_cpu_init(struct cpu_info *ci)
    255 {
    256 	(*powerpc_intrsw->intrsw_cpu_init)(ci);
    257 }
    258 
    259 void intr_init(void) __stub;
    260 
    261 void
    262 intr_init(void)
    263 {
    264 	(*powerpc_intrsw->intrsw_init)();
    265 }
    266 
    267 void
    268 booke_fixup_stubs(void)
    269 {
    270 	extern uint32_t _ftext[];
    271 	extern uint32_t _etext[];
    272 
    273 	powerpc_fixup_stubs(_ftext, _etext, NULL, NULL);
    274 }
    275