tkernel_2/lib/libtk/src/sysdepend/tef_em1d/setspc.c | bare source | permlink (0.00 seconds) |
1: /* 2: *---------------------------------------------------------------------- 3: * T-Kernel 2.0 Software Package 4: * 5: * Copyright 2011 by Ken Sakamura. 6: * This software is distributed under the latest version of T-License 2.x. 7: *---------------------------------------------------------------------- 8: * 9: * Released by T-Engine Forum(http://www.t-engine.org/) at 2011/05/17. 10: * Modified by TRON Forum(http://www.tron.org/) at 2015/06/01. 11: * 12: *---------------------------------------------------------------------- 13: */ 14: 15: /* 16: * @(#)setspc.c (libtk/EM1-D512) 17: * 18: * Address space control 19: */ 20: 21: #include <basic.h> 22: #include <tk/tkernel.h> 23: #include <tk/sysdef.h> 24: #include "getsvcenv.h" 25: 26: /* 27: * Set task address space 28: */ 29: EXPORT ER SetTaskSpace( ID taskid ) 30: { 31: UW taskmode; 32: ER ercd; 33: 34: if ( taskid == TSK_SELF ) { 35: /* Set current CPL in PPL */ 36: taskmode = getsvcenv(); 37: SCInfo.taskmode ^= (taskmode ^ (taskmode << 16)) & TMF_PPL(3); 38: } else { 39: T_EIT r_eit; 40: T_CREGS r_cregs; 41: T_TSKSPC tskspc; 42: 43: /* Get logical space/taskmode for taskid tasks */ 44: ercd = tk_get_reg(taskid, NULL, &r_eit, &r_cregs); 45: if ( ercd < E_OK ) { 46: goto err_ret; 47: } 48: 49: /* Change to logical space for nominated tasks */ 50: tskspc.uatb = r_cregs.uatb; 51: tskspc.lsid = r_cregs.lsid; 52: ercd = tk_set_tsp(TSK_SELF, &tskspc); 53: if ( ercd < E_OK ) { 54: goto err_ret; 55: } 56: 57: /* Change to PPL for nominated tasks */ 58: taskmode = getsvcenv(); 59: SCInfo.taskmode ^= (taskmode ^ r_eit.taskmode) & TMF_PPL(3); 60: } 61: 62: return E_OK; 63: 64: err_ret: 65: return ercd; 66: }