📄 context.s
字号:
// #===========================================================================// #// # context.S// #// # FUJITSU context switch code// #// #===========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####// #===========================================================================// ######DESCRIPTIONBEGIN####// #// # Author(s): nickg, gthomas// # Contributors: nickg, gthomas// # Date: 1998-09-15// # Purpose: FUJITSU context switch code// # Description: This file contains implementations of the thread context // # switch routines. It also contains the longjmp() and setjmp()// # routines.// #// #####DESCRIPTIONEND####// #// #===========================================================================#include <pkgconf/hal.h>#include "frv.inc" .text // ----------------------------------------------------------------------------// hal_thread_switch_context(new, old)// Switch thread contexts// new = address of context of next thread to execute// old = address of context save location of current thread// thread state is saved on the current stack .globl hal_thread_switch_contexthal_thread_switch_context: subi sp,_TS_size,sp // Space for saved frame sti gr2,@(sp,_TS_GPR2) // Save registers sti gr3,@(sp,_TS_GPR3) sti gr4,@(sp,_TS_GPR4) sti gr5,@(sp,_TS_GPR5) sti gr6,@(sp,_TS_GPR6) sti gr7,@(sp,_TS_GPR7) sti gr8,@(sp,_TS_GPR8) sti gr9,@(sp,_TS_GPR9) sti gr10,@(sp,_TS_GPR10) sti gr11,@(sp,_TS_GPR11) sti gr12,@(sp,_TS_GPR12) sti gr13,@(sp,_TS_GPR13) sti gr14,@(sp,_TS_GPR14) sti gr15,@(sp,_TS_GPR15) sti gr16,@(sp,_TS_GPR16) sti gr17,@(sp,_TS_GPR17) sti gr18,@(sp,_TS_GPR18) sti gr19,@(sp,_TS_GPR19) sti gr20,@(sp,_TS_GPR20) sti gr21,@(sp,_TS_GPR21) sti gr22,@(sp,_TS_GPR22) sti gr23,@(sp,_TS_GPR23) sti gr24,@(sp,_TS_GPR24) sti gr25,@(sp,_TS_GPR25) sti gr26,@(sp,_TS_GPR26) sti gr27,@(sp,_TS_GPR27) sti gr28,@(sp,_TS_GPR28) sti gr29,@(sp,_TS_GPR29) sti gr30,@(sp,_TS_GPR30) sti gr31,@(sp,_TS_GPR31)#if _NGPR != 32 sti gr32,@(sp,_TS_GPR32) sti gr33,@(sp,_TS_GPR33) sti gr34,@(sp,_TS_GPR34) sti gr35,@(sp,_TS_GPR35) sti gr36,@(sp,_TS_GPR36) sti gr37,@(sp,_TS_GPR37) sti gr38,@(sp,_TS_GPR38) sti gr39,@(sp,_TS_GPR39) sti gr40,@(sp,_TS_GPR40) sti gr41,@(sp,_TS_GPR41) sti gr42,@(sp,_TS_GPR42) sti gr43,@(sp,_TS_GPR43) sti gr44,@(sp,_TS_GPR44) sti gr45,@(sp,_TS_GPR45) sti gr46,@(sp,_TS_GPR46) sti gr47,@(sp,_TS_GPR47) sti gr48,@(sp,_TS_GPR48) sti gr49,@(sp,_TS_GPR49) sti gr50,@(sp,_TS_GPR50) sti gr51,@(sp,_TS_GPR51) sti gr52,@(sp,_TS_GPR52) sti gr53,@(sp,_TS_GPR53) sti gr54,@(sp,_TS_GPR54) sti gr55,@(sp,_TS_GPR55) sti gr56,@(sp,_TS_GPR56) sti gr57,@(sp,_TS_GPR57) sti gr58,@(sp,_TS_GPR58) sti gr59,@(sp,_TS_GPR59) sti gr60,@(sp,_TS_GPR60) sti gr61,@(sp,_TS_GPR61) sti gr62,@(sp,_TS_GPR62) sti gr63,@(sp,_TS_GPR63)#endif movsg psr,gr4 sti gr4,@(sp,_TS_PSR) movsg lr,gr4 sti gr4,@(sp,_TS_PC) movsg ccr,gr4 sti gr4,@(sp,_TS_CCR) movsg lcr,gr4 sti gr4,@(sp,_TS_LCR) movsg cccr,gr4 sti gr4,@(sp,_TS_CCCR) addi sp,_TS_size,gr4 sti gr4,@(sp,_TS_SP) sti sp,@(gr9,0) // Pointer to saved context # Now load the destination thread by dropping through # to hal_thread_load_context // ----------------------------------------------------------------------------// hal_thread_load_context(new)// Load thread context// new = address of context of next thread to execute// Note that this function is also the second half of// hal_thread_switch_context and is simply dropped into from it. .globl hal_thread_load_contexthal_thread_load_context: ldi @(gr8,0),sp // Saved context ldi @(sp,_TS_PSR),gr8 setlos #~_PSR_ET,gr9 // Turn off exceptions and gr8,gr9,gr8 setlos #_PSR_PS|_PSR_S,gr9 // Stay in supervisor mode or gr8,gr9,gr8 movgs gr8,psr ldi @(sp,_TS_PC),gr8 movgs gr8,pcsr ldi @(sp,_TS_CCR),gr8 movgs gr8,ccr ldi @(sp,_TS_LCR),gr8 movgs gr8,lcr ldi @(sp,_TS_CCCR),gr8 movgs gr8,cccr ldi @(sp,_TS_GPR2),gr2 // Restore registers ldi @(sp,_TS_GPR3),gr3 ldi @(sp,_TS_GPR4),gr4 ldi @(sp,_TS_GPR5),gr5 ldi @(sp,_TS_GPR6),gr6 ldi @(sp,_TS_GPR7),gr7 ldi @(sp,_TS_GPR8),gr8 ldi @(sp,_TS_GPR9),gr9 ldi @(sp,_TS_GPR10),gr10 ldi @(sp,_TS_GPR11),gr11 ldi @(sp,_TS_GPR12),gr12 ldi @(sp,_TS_GPR13),gr13 ldi @(sp,_TS_GPR14),gr14 ldi @(sp,_TS_GPR15),gr15 ldi @(sp,_TS_GPR16),gr16 ldi @(sp,_TS_GPR17),gr17 ldi @(sp,_TS_GPR18),gr18 ldi @(sp,_TS_GPR19),gr19 ldi @(sp,_TS_GPR20),gr20 ldi @(sp,_TS_GPR21),gr21 ldi @(sp,_TS_GPR22),gr22 ldi @(sp,_TS_GPR23),gr23 ldi @(sp,_TS_GPR24),gr24 ldi @(sp,_TS_GPR25),gr25 ldi @(sp,_TS_GPR26),gr26 ldi @(sp,_TS_GPR27),gr27 ldi @(sp,_TS_GPR28),gr28 ldi @(sp,_TS_GPR29),gr29 ldi @(sp,_TS_GPR30),gr30 ldi @(sp,_TS_GPR31),gr31#if _NGPR != 32 ldi @(sp,_TS_GPR32),gr32 ldi @(sp,_TS_GPR33),gr33 ldi @(sp,_TS_GPR34),gr34 ldi @(sp,_TS_GPR35),gr35 ldi @(sp,_TS_GPR36),gr36 ldi @(sp,_TS_GPR37),gr37 ldi @(sp,_TS_GPR38),gr38 ldi @(sp,_TS_GPR39),gr39 ldi @(sp,_TS_GPR40),gr40 ldi @(sp,_TS_GPR41),gr41 ldi @(sp,_TS_GPR42),gr42 ldi @(sp,_TS_GPR43),gr43 ldi @(sp,_TS_GPR44),gr44 ldi @(sp,_TS_GPR45),gr45 ldi @(sp,_TS_GPR46),gr46 ldi @(sp,_TS_GPR47),gr47 ldi @(sp,_TS_GPR48),gr48 ldi @(sp,_TS_GPR49),gr49 ldi @(sp,_TS_GPR50),gr50 ldi @(sp,_TS_GPR51),gr51 ldi @(sp,_TS_GPR52),gr52 ldi @(sp,_TS_GPR53),gr53 ldi @(sp,_TS_GPR54),gr54 ldi @(sp,_TS_GPR55),gr55 ldi @(sp,_TS_GPR56),gr56 ldi @(sp,_TS_GPR57),gr57 ldi @(sp,_TS_GPR58),gr58 ldi @(sp,_TS_GPR59),gr59 ldi @(sp,_TS_GPR60),gr60 ldi @(sp,_TS_GPR61),gr61 ldi @(sp,_TS_GPR62),gr62 ldi @(sp,_TS_GPR63),gr63#endif ldi @(sp,_TS_SP),sp rett #0// ----------------------------------------------------------------------------// HAL longjmp, setjmp implementations - based on newlib// Register jmpbuf offset// R16-R31 0x0-0x03c// R48-R63 0x40-0x7c// FR16-FR31 0x80-0xbc// FR48-FR63 0xc0-0xfc// LR 0x100// SP 0x104// FP 0x108//// R8 contains the pointer to jmpbuf .text .global hal_setjmp .type hal_setjmp,@functionhal_setjmp: stdi gr16, @(gr8,0) stdi gr18, @(gr8,8) stdi gr20, @(gr8,16) stdi gr22, @(gr8,24) stdi gr24, @(gr8,32) stdi gr26, @(gr8,40) stdi gr28, @(gr8,48) stdi gr30, @(gr8,56)#if _NGPR != 32 stdi gr48, @(gr8,64) stdi gr50, @(gr8,72) stdi gr52, @(gr8,80) stdi gr54, @(gr8,88) stdi gr56, @(gr8,96) stdi gr58, @(gr8,104) stdi gr60, @(gr8,112) stdi gr62, @(gr8,120)#endif#if _NFPR != 0 stdfi fr16, @(gr8,128) stdfi fr18, @(gr8,136) stdfi fr20, @(gr8,144) stdfi fr22, @(gr8,152) stdfi fr24, @(gr8,160) stdfi fr26, @(gr8,168) stdfi fr28, @(gr8,176) stdfi fr30, @(gr8,184)#if _NFPR != 32 stdfi fr48, @(gr8,192) stdfi fr50, @(gr8,200) stdfi fr52, @(gr8,208) stdfi fr54, @(gr8,216) stdfi fr56, @(gr8,224) stdfi fr58, @(gr8,232) stdfi fr60, @(gr8,240) stdfi fr62, @(gr8,248)#endif#endif movsg lr, gr4 sti gr4, @(gr8,256) sti sp, @(gr8,260) sti fp, @(gr8,264) mov gr0,gr8 ret.Lend1: .size hal_setjmp,.Lend1-hal_setjmp .global hal_longjmp .type hal_longjmp,@functionhallongjmp: lddi @(gr8,0), gr16 lddi @(gr8,8), gr18 lddi @(gr8,16), gr20 lddi @(gr8,24), gr22 lddi @(gr8,32), gr24 lddi @(gr8,40), gr26 lddi @(gr8,48), gr28 lddi @(gr8,56), gr30#if _NGPR != 32 lddi @(gr8,64), gr48 lddi @(gr8,72), gr50 lddi @(gr8,80), gr52 lddi @(gr8,88), gr54 lddi @(gr8,96), gr56 lddi @(gr8,104), gr58 lddi @(gr8,112), gr60 lddi @(gr8,120), gr62#endif#if _NFPR != 0 lddfi @(gr8,128), fr16 lddfi @(gr8,136), fr18 lddfi @(gr8,144), fr20 lddfi @(gr8,152), fr22 lddfi @(gr8,160), fr24 lddfi @(gr8,168), fr26 lddfi @(gr8,176), fr28 lddfi @(gr8,184), fr30#if _NFPR != 32 lddfi @(gr8,192), fr48 lddfi @(gr8,200), fr50 lddfi @(gr8,208), fr52 lddfi @(gr8,216), fr54 lddfi @(gr8,224), fr56 lddfi @(gr8,232), fr58 lddfi @(gr8,240), fr60 lddfi @(gr8,248), fr62#endif#endif ldi @(gr8,256), gr4 movgs gr4,lr ldi @(gr8,260), sp ldi @(gr8,264), fp # Value to return is in r9. If zero, return 1 cmp gr9, gr0, icc0 setlos #1, gr8 ckne icc0, cc4 cmov gr9, gr8, cc4, 1 ret.Lend2: .size hal_longjmp,.Lend2-hal_longjmp2 // ----------------------------------------------------------------------------// end of context.S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -