source: soft/giet_vm/giet_kernel/ctx_handler.h @ 708

Last change on this file since 708 was 707, checked in by guerin, 9 years ago

fix kill/exec

  • introduce physical_memcpy for fat_read
  • don't defer task exec
  • load writable segments in exec syscall
  • Property svn:executable set to *
File size: 8.0 KB
RevLine 
[528]1/////////////////////////////////////////////////////////////////////////////////
[294]2// File     : ctx_handler.h
3// Date     : 01/04/2012
4// Authors  : alain greiner & joel porquet
5// Copyright (c) UPMC-LIP6
[528]6/////////////////////////////////////////////////////////////////////////////////
[294]7// The ctx_handler.h and ctx_handler.c files are part of the GIET-VM nano-kernel.
8// This code is used to support context switch when several tasks are executing
9// in time multiplexing on a single processor.
10// The tasks are statically allocated to a processor in the boot phase, and
[440]11// there is one private scheduler per processor. Each sheduler occupies 8K bytes,
[294]12// and contains up to 14 task contexts (task_id is from 0 to 13).
13// The task context [13] is reserved for the "idle" task that does nothing, and
14// is launched by the scheduler when there is no other runable task.
[528]15/////////////////////////////////////////////////////////////////////////////////
[629]16// A task context is an array of 64 uint32 words => 256 bytes.
[440]17// It contains copies of processor registers (when the task is preempted)
[629]18// and some general informations associated to a task, such as the private
19// peripheral channels allocated to the task, the vspace index, the various
20// task index (local / global / application), and the runnable status.
[528]21/////////////////////////////////////////////////////////////////////////////////
[556]22// ctx[0] <- ***   |ctx[8] <- $8     |ctx[16]<- $16    |ctx[24]<- $24
23// ctx[1] <- $1    |ctx[9] <- $9     |ctx[17]<- $17    |ctx[25]<- $25
24// ctx[2] <- $2    |ctx[10]<- $10    |ctx[18]<- $18    |ctx[26]<- LO
25// ctx[3] <- $3    |ctx[11]<- $11    |ctx[19]<- $19    |ctx[27]<- HI
26// ctx[4] <- $4    |ctx[12]<- $12    |ctx[20]<- $20    |ctx[28]<- $28
27// ctx[5] <- $5    |ctx[13]<- $13    |ctx[21]<- $21    |ctx[29]<- SP
28// ctx[6] <- $6    |ctx[14]<- $14    |ctx[22]<- $22    |ctx[30]<- $30
29// ctx[7] <- $7    |ctx[15]<- $15    |ctx[23]<- $23    |ctx[31]<- RA
[294]30//
[556]31// ctx[32]<- EPC   |ctx[40]<- TTY    |ctx[48]<- TRDID  |ctx[56]<- ***
32// ctx[33]<- CR    |ctx[41]<- CMA_FB |ctx[49]<- GTID   |ctx[57]<- ***
[629]33// ctx[34]<- SR    |ctx[42]<- CMA_RX |ctx[50]<- NORUN  |ctx[58]<- ***
[556]34// ctx[35]<- BVAR  |ctx[43]<- CMA_TX |ctx[51]<- COPROC |ctx[59]<- ***
[648]35// ctx[36]<- PTAB  |ctx[44]<- NIC_RX |ctx[52]<- ENTRY  |ctx[60]<- ***
[695]36// ctx[37]<- LTID  |ctx[45]<- NIC_TX |ctx[53]<- SIG    |ctx[61]<- ***
[556]37// ctx[38]<- VSID  |ctx[46]<- TIM    |ctx[54]<- ***    |ctx[62]<- ***
38// ctx[39]<- PTPR  |ctx[47]<- HBA    |ctx[55]<- ***    |ctx[63]<- ***
[528]39/////////////////////////////////////////////////////////////////////////////////
[294]40
[258]41#ifndef _CTX_HANDLER_H
42#define _CTX_HANDLER_H
43
44#include <giet_config.h>
45
46/////////////////////////////////////////////////////////////////////////////////
[440]47//    Definition of the task context slots indexes
48/////////////////////////////////////////////////////////////////////////////////
49
[629]50#define CTX_SP_ID        29    // Stack Pointer
51#define CTX_RA_ID        31    // Return Address
[440]52
[629]53#define CTX_EPC_ID       32    // Exception Program Counter (CP0)
54#define CTX_CR_ID        33    // Cause Register (CP0)
55#define CTX_SR_ID        34    // Status Register (CP0)
56#define CTX_BVAR_ID      35        // Bad Virtual Address Register (CP0)
57#define CTX_PTAB_ID      36    // Page Table Virtual address
58#define CTX_LTID_ID      37    // Local  Task Index (in scheduler)
59#define CTX_VSID_ID      38    // Vspace Index     
60#define CTX_PTPR_ID      39    // Page Table Pointer Register (PADDR>>13)
[440]61
[629]62#define CTX_TTY_ID       40    // private TTY channel index 
63#define CTX_CMA_FB_ID    41    // private CMA channel index for FBF write
64#define CTX_CMA_RX_ID    42    // private CMA channel index for NIC_TX
65#define CTX_CMA_TX_ID    43    // private CMA channel index for NIC_RX
66#define CTX_NIC_RX_ID    44    // private NIC channel index RX transfer
67#define CTX_NIC_TX_ID    45    // private NIC channel index TX transfer
68#define CTX_TIM_ID       46    // ptivate TIM channel index
69#define CTX_HBA_ID       47    // private HBA channel index
[440]70
[629]71#define CTX_TRDID_ID     48    // Thread Task Index in vspace
72#define CTX_GTID_ID      49    // Global Task Index in all system
73#define CTX_NORUN_ID     50    // bit-vector : task runable if all zero
74#define CTX_COPROC_ID    51    // cluster_xy : coprocessor coordinates
[648]75#define CTX_ENTRY_ID     52    // Virtual address of task entry point
[695]76#define CTX_SIG_ID       53    // bit-vector : pending signals for task
[440]77
78/////////////////////////////////////////////////////////////////////////////////
[629]79//    Definition of the NORUN bit-vector masks
80/////////////////////////////////////////////////////////////////////////////////
[440]81
[629]82#define NORUN_MASK_TASK       0x00000001   // Task not active 
83#define NORUN_MASK_IOC        0x00000002   // Task blocked on IOC transfer
84#define NORUN_MASK_COPROC     0x00000004   // Task blocked on COPROC transfer
85
[440]86/////////////////////////////////////////////////////////////////////////////////
[695]87//    Definition of the SIG bit-vector masks
88/////////////////////////////////////////////////////////////////////////////////
89
90#define SIG_MASK_KILL         0x00000001   // Task will be killed at next tick
91
92/////////////////////////////////////////////////////////////////////////////////
[258]93//    Definition of the scheduler structure
94/////////////////////////////////////////////////////////////////////////////////
95
96typedef struct static_scheduler_s
97{
[294]98    unsigned int context[14][64];      // at most 14 task (including idle_task)
[258]99    unsigned int tasks;                // actual number of tasks
100    unsigned int current;              // current task index
[294]101    unsigned int hwi_vector[32];       // hardware interrupt vector
102    unsigned int pti_vector[32];       // timer    interrupt vector
103    unsigned int wti_vector[32];       // software interrupt vector
[310]104    unsigned int reserved[30];         // padding to 4 Kbytes
[391]105    unsigned int idle_stack[1024];     // private stack for idle stack (4Kbytes)
[258]106} static_scheduler_t;
107
[440]108#define IDLE_TASK_INDEX        13
[258]109
[440]110
[258]111/////////////////////////////////////////////////////////////////////////////////
[528]112//               Extern Functions
[258]113/////////////////////////////////////////////////////////////////////////////////
114
[440]115/////////////////////////////////////////////////////////////////////////////////
116// This function performs a context switch between the running task
117// and  another task, using a round-robin sheduling policy between all
118// tasks allocated to a given processor (static allocation).
119// It selects the next runable task to resume execution.
120// If the only runable task is the current task, return without context switch.
121// If there is no runable task, the scheduler switch to the default "idle" task.
122// The return address contained in $31 is saved in the current task context
123// (in the ctx[31] slot), and the function actually returns to the address
124// contained in the ctx[31] slot of the next task context.
[258]125/////////////////////////////////////////////////////////////////////////////////
[440]126extern void _ctx_switch();
[258]127
[440]128/////////////////////////////////////////////////////////////////////////////////
129// The address of this function is used to initialise the return address
130// in the "idle" task context.
131/////////////////////////////////////////////////////////////////////////////////
132extern void _ctx_eret();
[258]133
[440]134/////////////////////////////////////////////////////////////////////////////////
135// This function is executed task when no other task can be executed.
136/////////////////////////////////////////////////////////////////////////////////
[258]137extern void _idle_task();
138
[528]139/////////////////////////////////////////////////////////////////////////////////
140// This function displays the context of a task identified by the processor
141// coordinates (x,y,p), and by the local task index ltid.
142// The string argument can be used for debug.
143/////////////////////////////////////////////////////////////////////////////////
144extern void _ctx_display( unsigned int x,
145                          unsigned int y,
146                          unsigned int p,
147                          unsigned int ltid,
148                          char*        string );
[258]149
150#endif
Note: See TracBrowser for help on using the repository browser.