Skip to content

Commit c6f394f

Browse files
committedDec 21, 2017
[isr] add arg
1 parent a242ee3 commit c6f394f

File tree

8 files changed

+88
-63
lines changed

8 files changed

+88
-63
lines changed
 

‎arch_x86/kernel/fpu.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ void fpu_switch(struct s_task *prev, struct s_task *next)
6565
stts();
6666
}
6767

68-
int do_fpu_fault(struct s_regs *pregs)
68+
int do_fpu_fault(struct s_regs *pregs, void *__)
6969
{
70+
(void) __;
71+
7072
clts();
7173

7274
if(current != last_use) {
@@ -87,5 +89,5 @@ int do_fpu_fault(struct s_regs *pregs)
8789

8890
void fpu_fault_init()
8991
{
90-
isr_register(7, do_fpu_fault);
92+
isr_register(7, do_fpu_fault, NULL);
9193
}

‎arch_x86/kernel/mm.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,15 @@ static unsigned long la2pn(unsigned long la)
254254
return ADDR2NO(*ppte);
255255
}
256256

257-
int do_page_fault(struct s_regs *pregs)
257+
int do_page_fault(struct s_regs *pregs, void *__)
258258
{
259259
unsigned long cr2;
260260
struct s_task *ptask = current;
261261
unsigned long err_code;
262262
unsigned long phy_pg_no;
263263

264+
(void) __;
265+
264266
asm ("movl %%cr2, %%eax; movl %%eax, %0":"=m"(cr2)::"eax");
265267

266268
err_code = pregs->err_code;
@@ -537,7 +539,7 @@ void mm_init(unsigned int size)
537539

538540
memset(pte, 0, sizeof(unsigned long)*1024*1024);
539541

540-
isr_register(14, do_page_fault);
542+
isr_register(14, do_page_fault, NULL);
541543

542544
for_each_kern_pde(i)
543545
{

‎drv/input_kbd.c

+35-26
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <os/arch_config.h>
66
#include <os/type.h>
77
#include <lib/klib.h>
8+
#include <lib/string.h>
89
#include <os/isr.h>
910
#include <os/io.h>
1011
#include <drv/i8042.h>
@@ -18,10 +19,6 @@
1819
#define CODE_BRK 0xf0
1920
#define CODE_EX0 0xe0
2021
#define CODE_EX1 0xe1
21-
int is_brk;
22-
int is_ex;
23-
int follow;
24-
int gcode;
2522
extern struct input_dev_desc kbd_desc;
2623

2724
void kbd_thread()
@@ -46,48 +43,56 @@ void kbd_thread()
4643
}
4744
}
4845

49-
static int kbd_int()
46+
struct kb_int_state {
47+
int is_brk;
48+
int is_ex;
49+
int follow;
50+
int gcode;
51+
};
52+
53+
static int kbd_int(struct s_regs *pregs, void *data)
5054
{
5155
struct s_event event;
56+
struct kb_int_state *s = data;
5257
unsigned char code = inb(0x60);
5358

5459
switch(code)
5560
{
5661
case CODE_BRK:
57-
is_brk = 1;
58-
if(!is_ex)
59-
gcode = 0;
62+
s->is_brk = 1;
63+
if(!s->is_ex)
64+
s->gcode = 0;
6065
break;
6166
case CODE_EX0:
62-
is_ex = 1;
63-
follow = 1;
64-
gcode = 0xe0;
67+
s->is_ex = 1;
68+
s->follow = 1;
69+
s->gcode = 0xe0;
6570
break;
6671
case CODE_EX1:
67-
is_ex = 2;
68-
follow = 2;
69-
gcode = 0;
72+
s->is_ex = 2;
73+
s->follow = 2;
74+
s->gcode = 0;
7075
break;
7176
default:
72-
if(!is_ex)
73-
follow = 1;
74-
gcode <<= 8;
75-
gcode |= code;
76-
follow--;
77-
if(follow == 0)
77+
if(!s->is_ex)
78+
s->follow = 1;
79+
s->gcode <<= 8;
80+
s->gcode |= code;
81+
s->follow--;
82+
if(s->follow == 0)
7883
{
7984
event.ticks = timer_get_ticks();
8085
event.type = 1;
81-
event.code = gcode;
82-
event.value = is_brk;
86+
event.code = s->gcode;
87+
event.value = s->is_brk;
8388
input_dev_event(&kbd_desc, &event);
8489
/*printk("ex=%d, brk=%d, gcode=%x\n",
8590
is_ex,
8691
is_brk,
8792
gcode);*/
88-
is_ex = 0;
89-
is_brk = 0;
90-
gcode = 0;
93+
s->is_ex = 0;
94+
s->is_brk = 0;
95+
s->gcode = 0;
9196
}
9297
break;
9398
}
@@ -96,15 +101,19 @@ static int kbd_int()
96101

97102
static int kbd_init()
98103
{
104+
struct kb_int_state *s;
99105
printk("kbd: up\n");
100-
irq_register(IRQ_KB, kbd_int);
106+
s = kmalloc(sizeof(struct kb_int_state));
107+
memset(s, 0, sizeof(struct kb_int_state));
108+
irq_register(IRQ_KB, kbd_int, s);
101109
pic_enable_irq(IRQ_KB);
102110
return 0;
103111
}
104112

105113
static int kbd_exit()
106114
{
107115
printk("kbd: down\n");
116+
// TODO: free kb_int_state
108117
return 0;
109118
}
110119

‎drv/input_mouse.c

+31-22
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <os/arch_config.h>
66
#include <os/type.h>
77
#include <lib/klib.h>
8+
#include <lib/string.h>
89
#include <os/isr.h>
910
#include <os/io.h>
1011
#include <drv/i8042.h>
@@ -39,61 +40,69 @@ void mouse_thread()
3940
}
4041
}
4142

42-
static int mouse_int()
43+
struct mouse_int_state {
44+
int last_tick;
45+
int xdiff;
46+
int ydiff;
47+
int count;
48+
int xsgn;
49+
int ysgn;
50+
int lrb;
51+
};
52+
53+
static int mouse_int(struct s_regs *pregs, void *state)
4354
{
55+
struct mouse_int_state *s = state;
4456
unsigned char data = inb(0x60);
45-
static int last_tick;
46-
static int xdiff;
47-
static int ydiff;
48-
static int count;
49-
static int xsgn;
50-
static int ysgn;
51-
static int lrb;
5257
struct s_event event;
5358
int ticks = timer_get_ticks();
5459

5560
//trick:在真机上数据对不上号,用ticks计时,把过早数据丢弃
56-
if(!last_tick) last_tick = ticks;
57-
if(ticks - last_tick > 5)
58-
count = 0;
59-
switch (++count)
61+
if(ticks - s->last_tick > 5)
62+
s->count = 0;
63+
switch (++s->count)
6064
{
6165
case 1:
62-
lrb = data & 0x7;
63-
xsgn = (data & 0x10) ? (~0xff) : 0;
64-
ysgn = (data & 0x20) ? (~0xff) : 0;
66+
s->lrb = data & 0x7;
67+
s->xsgn = (data & 0x10) ? (~0xff) : 0;
68+
s->ysgn = (data & 0x20) ? (~0xff) : 0;
6569
break;
6670
case 2:
67-
xdiff = (xsgn | data);
71+
s->xdiff = (s->xsgn | data);
6872
break;
6973
case 3:
70-
ydiff = -(ysgn | data);
71-
count = 0;
74+
s->ydiff = -(s->ysgn | data);
75+
s->count = 0;
7276
/* printk("xdiff=%d, ydiff=%d\n", */
7377
/* xdiff, */
7478
/* ydiff); */
7579
event.ticks = ticks;
7680
event.type = 2;
77-
event.code = lrb;
78-
event.value = (xdiff<<16) | (ydiff&0xffff);
81+
event.code = s->lrb;
82+
event.value = (s->xdiff<<16) | (s->ydiff&0xffff);
7983
input_dev_event(&mouse_desc, &event);
8084
break;
8185
}
82-
last_tick = ticks;
86+
s->last_tick = ticks;
8387
return 0;
8488
}
8589

8690
static int mouse_init()
8791
{
92+
struct mouse_int_state *s;
8893
printk("mouse: up\n");
89-
irq_register(IRQ_MOUSE, mouse_int);
94+
s = kmalloc(sizeof(struct mouse_int_state));
95+
memset(s, 0, sizeof(struct mouse_int_state));
96+
s->last_tick = timer_get_ticks();
97+
irq_register(IRQ_MOUSE, mouse_int, s);
9098
pic_enable_irq(IRQ_MOUSE);
9199
return 0;
92100
}
93101

94102
static int mouse_exit()
95103
{
96104
printk("mouse: down\n");
105+
// TODO: free mouse_int_state
97106
return 0;
98107
}
99108

‎drv/serial.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ static int serial_init()
8787
serial_early_init();
8888
for(i = 0; i < N; i++)
8989
dev_simp_open(DEV_MAJOR_PIPE, 0, 0, &sdata[i].pin_data);
90-
irq_register(IRQ_SERIAL1, do_serial1_int);
91-
irq_register(IRQ_SERIAL2, do_serial1_int);
90+
irq_register(IRQ_SERIAL1, do_serial1_int, NULL);
91+
irq_register(IRQ_SERIAL2, do_serial1_int, NULL);
9292
pic_enable_irq(IRQ_SERIAL1);
9393
pic_enable_irq(IRQ_SERIAL2);
9494
printk("serial: up\n");

‎include/os/isr.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#ifndef _ISR_H_
22
#define _ISR_H_
33
#include <os/regs.h>
4-
typedef int (*isr_func)(struct s_regs *pregs);
5-
int isr_register(int no, isr_func fn);
6-
int irq_register(int irq_no, isr_func fn);
4+
typedef int (*isr_func)(struct s_regs *pregs, void *data);
5+
int isr_register(int no, isr_func fn, void *data);
6+
int irq_register(int irq_no, isr_func fn, void *data);
77

88
#endif /* _ISR_H_ */

‎kernel/isr.c

+8-5
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@
88
struct isr_desc
99
{
1010
isr_func fn;
11+
void *data;
1112
struct isr_desc *next;
1213
};
1314

1415
int isr_dummy();
1516

1617
static struct isr_desc dummy_desc = {
1718
.fn = isr_dummy,
19+
.data = NULL,
1820
.next = NULL
1921
};
2022

2123
static struct isr_desc *isr_table[64];
2224

23-
int isr_register(int no, isr_func fn)
25+
int isr_register(int no, isr_func fn, void *data)
2426
{
2527
struct isr_desc *desc;
2628
assert(no >= 0 && no < 64);
@@ -29,13 +31,14 @@ int isr_register(int no, isr_func fn)
2931

3032
desc->next = isr_table[no];
3133
desc->fn = fn;
34+
desc->data = data;
3235
isr_table[no] = desc;
3336
return 0;
3437
}
3538

36-
int irq_register(int irq_no, isr_func fn)
39+
int irq_register(int irq_no, isr_func fn, void *data)
3740
{
38-
return isr_register(IRQ_0 + irq_no, fn);
41+
return isr_register(IRQ_0 + irq_no, fn, data);
3942
}
4043

4144
void isr_init()
@@ -46,7 +49,7 @@ void isr_init()
4649
isr_table[i] = &dummy_desc;
4750
}
4851

49-
int isr_dummy(void)
52+
int isr_dummy()
5053
{
5154
panic("unhandled int/exception.");
5255
/* printk("vec_no: %d\n" */
@@ -72,5 +75,5 @@ asmlinkage void do_isr(int vec_no, struct s_regs *pregs)
7275
break;
7376
desc = desc->next;
7477
}*/
75-
desc->fn(pregs);
78+
desc->fn(pregs, desc->data);
7679
}

‎kernel/timer.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void timer_init()
7979
dev_simp_open(DEV_MAJOR_PIT, 0, 0, &data);
8080
dev_simp_ioctl(DEV_MAJOR_PIT, 0, data,
8181
TIMER_CMD_SETFREQ, (void *)HZ);
82-
irq_register(IRQ_TIMER, do_timer_int);
82+
irq_register(IRQ_TIMER, do_timer_int, NULL);
8383
pic_enable_irq(IRQ_TIMER);
8484
}
8585

0 commit comments

Comments
 (0)
Please sign in to comment.