GadgetSeed  0.9.6
interrupt.c
[詳解]
1 /** @file
2  @brief 仮想割り込みハンドラ
3 
4  @date 2009.10.23
5  @author Takashi SHUDO
6 */
7 
8 #include "sysconfig.h"
9 #include "interrupt.h"
10 #include "tkprintf.h"
11 #include "task/tcb.h"
12 #include "asm-emu.h"
13 
14 #include <stdio.h>
15 #include <unistd.h>
16 #include <string.h>
17 #include <signal.h>
18 #include <stdlib.h>
19 
20 //#define DEBUG
21 #ifdef DEBUG
22 #define INPRINTF printf
23 #else
24 #define INPRINTF(x, ...)
25 #endif
26 
27 extern struct st_tcb *run_task;
28 
29 #ifdef DEBUG
30 int trap_depth = 0;
31 #endif
32 
33 volatile int flg_interrput_proc = 0;
34 
35 void start_vtimer(void);
36 void stop_vtimer(void);
37 
38 int is_in_interrupt(void)
39 {
40  return flg_interrput_proc;
41 }
42 
43 /*
44  異なるスレッド間で setcontext() を実行させないためメインのスレッド以
45  外はタイマ割り込み(SIGARM)を受け付けてはならない。そのため、スレッド
46  を作成する前に block_timer_interrupt() を実行して SIGARM をマスクし
47  ておく必要がある。(作成されたスレッドはマスクの値を引き継ぐ)
48 */
49 int block_timer_interrupt(void)
50 {
51  sigset_t mask, old_mask;
52  int res;
53 
54  sigemptyset(&mask);
55  sigaddset(&mask, SIGNAL_TIMER);
56 
57  res = pthread_sigmask(SIG_BLOCK, &mask, &old_mask);
58 
59  if(res != 0) {
60  perror("trap sigprocmask(SIG_BLOCK)");
61  }
62 
63  res = sigismember(&old_mask, SIGNAL_TIMER);
64  if(res == 0) {
65  //printf("New mask\n"); // マスクが消えていた?
66  } else if(res == 1) {
67  //printf("Mask OK\n");
68  } else {
69  printf("Mask check error(%d)\n", res);
70  }
71 
72  return res;
73 }
74 
75 void unblock_timer_interrupt(void)
76 {
77  sigset_t mask;
78  int res;
79 
80  sigemptyset(&mask);
81  sigaddset(&mask, SIGNAL_TIMER);
82 
83  res = pthread_sigmask(SIG_UNBLOCK, &mask, NULL);
84 
85  if(res != 0) {
86  perror("trap sigprocmask(SIG_UNBLOCK)");
87  }
88 }
89 
90 static void trap(int no)
91 {
92  INPRINTF("trap %d SIGNAL IN \"%s\"(%d)\r\n", no, run_task->name);
93 
94  syscall_inthdr(0, 0);
95 
96  INPRINTF("trap SIGNAL syscall OUT \"%s\"\n", run_task->name);
97 }
98 
99 void syscall_trap(void)
100 {
101  block_timer_interrupt();
102 
103  trap(0);
104 
105  unblock_timer_interrupt();
106 }
107 
108 void init_interrupt_vector(void)
109 {
110  INPRINTF("%s\n", __FUNCTION__);
111 }
112 
113 int register_interrupt(unsigned short vectnum,
114  void (* func)(unsigned int intnum, void *sp))
115 {
116  return 0;
117 }
118 
119 int unregister_interrupt(unsigned short vectnum)
120 {
121  return 0;
122 }
タスクコンテキストブロック
カーネル用機能限定printf
char name[TASK_NAME_LEN+1]
タスク名
Definition: tcb.h:39
void * sp
スタックポインタ
Definition: tcb.h:40
割り込みハンドラ
タスクコンテキスト
Definition: tcb.h:32
エミュレータ用制御