Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright 2013 Red Hat Inc.
0003  *
0004  * Permission is hereby granted, free of charge, to any person obtaining a
0005  * copy of this software and associated documentation files (the "Software"),
0006  * to deal in the Software without restriction, including without limitation
0007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0008  * and/or sell copies of the Software, and to permit persons to whom the
0009  * Software is furnished to do so, subject to the following conditions:
0010  *
0011  * The above copyright notice and this permission notice shall be included in
0012  * all copies or substantial portions of the Software.
0013  *
0014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0015  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0017  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0018  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0019  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0020  * OTHER DEALINGS IN THE SOFTWARE.
0021  *
0022  * Authors: Ben Skeggs
0023  */
0024 
0025 #ifdef INCLUDE_PROC
0026 process(PROC_IDLE, #idle, #idle_recv)
0027 #endif
0028 
0029 /******************************************************************************
0030  * IDLE data segment
0031  *****************************************************************************/
0032 #ifdef INCLUDE_DATA
0033 #endif
0034 
0035 /******************************************************************************
0036  * IDLE code segment
0037  *****************************************************************************/
0038 #ifdef INCLUDE_CODE
0039 // description
0040 //
0041 // $r15 - current (idle)
0042 // $r14 - message
0043 // $r0  - zero
0044 idle_recv:
0045         ret
0046 
0047 // description
0048 //
0049 // $r15 - current (idle)
0050 // $r0  - zero
0051 idle:
0052         // set our "no interrupt has occurred during our execution" flag
0053         bset $flags $p0
0054 
0055         // count IDLE invocations for debugging purposes
0056         nv_iord($r1, NV_PPWR_DSCRATCH(1))
0057         add b32 $r1 1
0058         nv_iowr(NV_PPWR_DSCRATCH(1), $r1)
0059 
0060         // keep looping while there's pending messages for any process
0061         idle_loop:
0062         mov $r1 #proc_list_head
0063         bclr $flags $p2
0064         idle_proc:
0065                 // process the process' messages until there's none left
0066                 idle_proc_exec:
0067                         push $r1
0068                         mov b32 $r14 $r1
0069                         call(recv)
0070                         pop $r1
0071                         bra not $p1 #idle_proc_next
0072                         bset $flags $p2
0073                         bra #idle_proc_exec
0074                 // next process!
0075                 idle_proc_next:
0076                 add b32 $r1 #proc_size
0077                 cmp b32 $r1 $r15
0078                 bra ne #idle_proc
0079         bra $p2 #idle_loop
0080 
0081         // sleep if no interrupts have occurred
0082         sleep $p0
0083         bra #idle
0084 #endif