XINU
evec.c
Go to the documentation of this file.
1 /* evec.c -- initintc, set_evec, irq_dispatch */
2 
3 #include <xinu.h>
4 #include <stdio.h>
5 
6 /*#define STKTRACE*/
7 /*#define REGDUMP*/
8 
9 extern void userret(void);
10 
11 uint32 intc_vector[128]; /* Interrupt vector */
12 char expmsg1[] = "Unhandled exception. Link Register: 0x%x";
13 char expmsg2[] = "**** EXCEPTION ****";
14 /*------------------------------------------------------------------------
15  * initintc - Initialize the Interrupt Controller
16  *------------------------------------------------------------------------
17  */
19 {
20  struct intc_csreg *csrptr = (struct intc_csreg *)0x48200000;
21 
22  /* Reset the interrupt controller */
23 
25 
26  /* Wait until reset is complete */
27 
28  while((csrptr->sysstatus & INTC_SYSSTATUS_RESETDONE) == 0);
29 
30  return OK;
31 }
32 
33 /*------------------------------------------------------------------------
34  * set_evec - set exception vector to point to an exception handler
35  *------------------------------------------------------------------------
36  */
37 int32 set_evec(uint32 xnum, uint32 handler)
38 {
39  struct intc_csreg *csrptr = (struct intc_csreg *)0x48200000;
40  uint32 bank; /* bank number in int controller */
41  uint32 mask; /* used to set bits in bank */
42 
43  /* There are only 127 interrupts allowed 0-126 */
44 
45  if(xnum > 127) {
46  return SYSERR;
47  }
48 
49  /* Install the handler */
50 
51  intc_vector[xnum] = handler;
52 
53  /* Get the bank number based on interrupt number */
54 
55  bank = (xnum/32);
56 
57  /* Get the bit inside the bank */
58 
59  mask = (0x00000001 << (xnum%32));
60 
61  /* Reset the bit to enable that interrupt number */
62 
63  csrptr->banks[bank].mir &= (~mask);
64 
65  return OK;
66 }
67 
68 /*-------------------------------------------------------------------------
69  * irq_dispatch - call the handler for specific interrupt
70  *-------------------------------------------------------------------------
71  */
73 {
74  struct intc_csreg *csrptr = (struct intc_csreg *)0x48200000;
75  uint32 xnum; /* Interrupt number of device */
76  interrupt (*handler)(); /* Pointer to handler function */
77 
78  /* Get the interrupt number from the Interrupt controller */
79 
80  xnum = csrptr->sir_irq & 0x7F;
81 
82  /* Defer scheduling until interrupt is acknowledged */
83 
85 
86  /* If a handler is set for the interrupt, call it */
87 
88  if(intc_vector[xnum]) {
89  handler = ( interrupt(*)() )intc_vector[xnum];
90  handler(xnum);
91  }
92 
93  /* Acknowledge the interrupt */
94 
95  csrptr->control |= (INTC_CONTROL_NEWIRQAGR);
96 
97  /* Resume scheduling */
98 
100 }
101 
102 #if 0
103 static long *fp;
104 /*------------------------------------------------------------------------
105  * trap -- print some debugging info when a trap occurred
106  * Note: Need some more work.
107  *------------------------------------------------------------------------
108 */
109 #define REGDUMP
110 
111 void trap(int inum)
112 {
113  long *sp;
114  intmask mask;
115 
116  mask = disable();
117  kprintf("TRAP\n");
118  //asm("movl %ebp,fp");
119  sp = fp + 15; /* eflags/CS/eip/ebp/regs/trap#/Xtrap/ebp */
120  kprintf("Xinu trap!\n");
121  if (inum < 16)
122  kprintf("exception %d (%s) currpid %d (%s)\n", inum,
123  inames[inum], currpid, proctab[currpid].prname);
124  else
125  kprintf("exception %d currpid %d (%s)\n", inum, currpid,
126  proctab[currpid].prname);
127 #ifdef REGDUMP
128  kprintf("eflags %X ", *sp--);
129  sp--; /* skip OLD CS */
130  kprintf("eip %X ", *sp);
131  sp--;
132  if (inum == 8 || (inum >= 10 && inum <= 14)) {
133  kprintf("error code %08x (%u)\n", *sp, *sp);
134  sp--;
135  }
136  sp--; /* skip FP for Xint call */
137  kprintf("register dump:\n");
138  kprintf("eax %08X (%u)\n", *sp, *sp);
139  sp--;
140  kprintf("ecx %08X (%u)\n", *sp, *sp);
141  sp--;
142  kprintf("edx %08X (%u)\n", *sp, *sp);
143  sp--;
144  kprintf("ebx %08X (%u)\n", *sp, *sp);
145  sp--;
146  kprintf("esp %08X (%u)\n", *sp, *sp);
147  sp--;
148  kprintf("ebp %08X (%u)\n", *sp, *sp);
149  fp = sp;
150  sp--;
151  kprintf("esi %08X (%u)\n", *sp, *sp);
152  sp--;
153  kprintf("edi %08X (%u)\n", *sp, *sp);
154  sp--;
155 #endif // REGDUMP
156 #ifdef STKTRACE
157  stacktrace(currpid);
158 #endif // STKTRACE
159 
160  panic("Trap processing complete...\n");
161 }
162 #endif
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
#define INTC_SYSCONFIG_SOFTRESET
Definition: interrupt.h:38
char expmsg1[]
Definition: evec.c:12
pid32 currpid
現在実行中のプロセス。
Definition: initialize.c:32
int32 initintc()
Definition: evec.c:18
void irq_dispatch()
Definition: evec.c:72
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
uint32 mir
Definition: interrupt.h:9
struct intc_bank banks[4]
Definition: interrupt.h:34
uint32 sysstatus
Definition: interrupt.h:22
#define INTC_CONTROL_NEWIRQAGR
Definition: interrupt.h:43
#define OK
処理が成功した場合
Definition: kernel.h:77
uint32 intc_vector[128]
Definition: evec.c:11
status resched_cntl(int32)
再スケジューリングを延期させるか、もしくは許可させるかを制御する。
Definition: resched.c:81
void trap(int32)
#define INTC_SYSSTATUS_RESETDONE
Definition: interrupt.h:39
#define DEFER_STOP
遅延リスケジューリングの停止
Definition: resched.h:10
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
#define DEFER_START
遅延リスケジューリングの開始
Definition: resched.h:8
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
void interrupt
割り込みハンドラ 返り値の型
Definition: kernel.h:55
void panic(char *)
Panic状態に陥った旨のメッセージを表示し、全てのプロセスを停止させる。
Definition: panic.c:12
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
void userret(void)
プロセスが最上位の関数に戻る時に呼ばれる。現在のプロセスを終了させる。
Definition: userret.c:11
uint32 sysconfig
Definition: interrupt.h:21
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
int32 set_evec(uint32 xnum, uint32 handler)
Definition: evec.c:37
char expmsg2[]
Definition: evec.c:13
uint32 control
Definition: interrupt.h:26
uint32 sir_irq
Definition: interrupt.h:24
intmask disable(void)
割り込み禁止(intr.Sに定義がある)