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/powerpc/ofw/ofwcall32.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  * Copyright (C) 2009-2011 Nathan Whitehorn
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   17  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   18  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   20  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   21  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   22  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   23  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   24  *
   25  * $FreeBSD: releng/11.1/sys/powerpc/ofw/ofwcall32.S 279750 2015-03-07 20:14:46Z nwhitehorn $
   26  */
   27 
   28 #include <sys/syscall.h>
   29 
   30 #include <machine/trap.h>
   31 #include <machine/param.h>
   32 #include <machine/spr.h>
   33 #include <machine/asm.h>
   34 
   35 #define OFWSTKSZ        4096            /* 4K Open Firmware stack */
   36 
   37 /*
   38  * Globals
   39  */
   40         .data
   41 GLOBAL(ofmsr)
   42         .long   0, 0, 0, 0, 0           /* msr/sprg0-3 used in Open Firmware */
   43 GLOBAL(rtasmsr)
   44         .long   0
   45 GLOBAL(openfirmware_entry)
   46         .long   0                       /* Open Firmware entry point */
   47 GLOBAL(rtas_entry)
   48         .long   0                       /* RTAS entry point */
   49 
   50         .align  4
   51 ofwstk:
   52         .space  OFWSTKSZ
   53 rtas_regsave:
   54         .space  4
   55 
   56 /*
   57  * Open Firmware Entry Point. May need to enter real mode.
   58  *
   59  * C prototype: int ofwcall(void *callbuffer);
   60  */
   61 
   62 ASENTRY(ofwcall)
   63         mflr    %r0
   64         stw     %r0,4(%r1)
   65 
   66         /* Record the old MSR */
   67         mfmsr   %r6
   68 
   69         /* GOT pointer in r7 */
   70         bl      _GLOBAL_OFFSET_TABLE_@local-4
   71         mflr    %r7
   72 
   73         /* read client interface handler */
   74         lwz     %r4,openfirmware_entry@got(%r7)
   75         lwz     %r4,0(%r4)
   76 
   77         /*
   78          * Set the MSR to the OF value. This has the side effect of disabling
   79          * exceptions, which prevents preemption later.
   80          */
   81 
   82         lwz     %r5,ofmsr@got(%r7)
   83         lwz     %r5,0(%r5)
   84         mtmsr   %r5
   85         isync
   86 
   87         /*
   88          * Set up OF stack. This needs to be potentially accessible in real mode
   89          * The pointer to the current kernel stack is placed at the very
   90          * top of the stack along with the old MSR so we can get them back
   91          * later.
   92          */
   93         mr      %r5,%r1
   94         lwz     %r1,ofwstk@got(%r7)
   95         addi    %r1,%r1,(OFWSTKSZ-32)
   96         stw     %r5,20(%r1)     /* Save real stack pointer */
   97         stw     %r2,24(%r1)     /* Save curthread */
   98         stw     %r6,28(%r1)     /* Save old MSR */
   99         li      %r5,0
  100         stw     %r5,4(%r1)
  101         stw     %r5,0(%r1)
  102 
  103         /* Finally, branch to OF */
  104         mtctr   %r4
  105         bctrl
  106 
  107         /* Reload stack pointer and MSR from the OFW stack */
  108         lwz     %r6,28(%r1)
  109         lwz     %r2,24(%r1)
  110         lwz     %r1,20(%r1)
  111 
  112         /* Now set the real MSR */
  113         mtmsr   %r6
  114         isync
  115 
  116         /* Return */
  117         lwz     %r0,4(%r1)
  118         mtlr    %r0
  119         blr
  120 
  121 /*
  122  * RTAS Entry Point. Similar to the OF one, but simpler (no separate stack)
  123  *
  124  * C prototype: int rtascall(void *callbuffer, void *rtas_privdat);
  125  */
  126 
  127 ASENTRY(rtascall)
  128         mflr    %r0
  129         stw     %r0,4(%r1)
  130 
  131         /* GOT pointer in r7 */
  132         bl      _GLOBAL_OFFSET_TABLE_@local-4
  133         mflr    %r7
  134 
  135         /* Record the old MSR to real-mode-accessible area */
  136         mfmsr   %r0
  137         lwz     %r5,rtas_regsave@got(%r7)
  138         stw     %r0,0(%r5)
  139 
  140         /* read client interface handler */
  141         lwz     %r5,rtas_entry@got(%r7)
  142         lwz     %r5,0(%r5)
  143 
  144         /* Set the MSR to the RTAS value */
  145         lwz     %r6,rtasmsr@got(%r7)
  146         lwz     %r6,0(%r6)
  147         mtmsr   %r6
  148         isync
  149 
  150         /* Branch to RTAS */
  151         mtctr   %r5
  152         bctrl
  153 
  154         /* GOT pointer in r7 */
  155         bl      _GLOBAL_OFFSET_TABLE_@local-4
  156         mflr    %r7
  157 
  158         /* Now set the MSR back */
  159         lwz     %r6,rtas_regsave@got(%r7)
  160         lwz     %r6,0(%r6)
  161         mtmsr   %r6
  162         isync
  163 
  164         /* And return */
  165         lwz     %r0,4(%r1)
  166         mtlr    %r0
  167         blr
  168 

Cache object: b45e70649d9bc8212a41d81d951a5a3e


[ 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.