feat: ajout d'une interruption 20 qui permet de faire un DUMP du cpu sur l'écran
This commit is contained in:
parent
eff52c8853
commit
945bca37b5
|
@ -7,6 +7,9 @@
|
||||||
# define _ASM
|
# define _ASM
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
# define int20 asm("int $0x14")
|
||||||
|
|
||||||
# define halt() asm("hlt"::)
|
# define halt() asm("hlt"::)
|
||||||
|
|
||||||
# define sti() asm("sti"::)
|
# define sti() asm("sti"::)
|
||||||
|
|
|
@ -16,6 +16,7 @@ jmp exception_suite
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro semidumpcpu
|
.macro semidumpcpu
|
||||||
|
cli
|
||||||
pushl %ds
|
pushl %ds
|
||||||
pushl %es
|
pushl %es
|
||||||
pushl %fs
|
pushl %fs
|
||||||
|
@ -88,6 +89,16 @@ pushl $0x00
|
||||||
semidumpcpu
|
semidumpcpu
|
||||||
call sysenter_handler
|
call sysenter_handler
|
||||||
|
|
||||||
|
.global wrapper_interruption20
|
||||||
|
wrapper_interruption20:
|
||||||
|
pushl %ss
|
||||||
|
pushl %esp
|
||||||
|
pushf
|
||||||
|
pushl %cs
|
||||||
|
pushl $0x14
|
||||||
|
semidumpcpu
|
||||||
|
call interruption_handler
|
||||||
|
|
||||||
.global wrapper_interruption
|
.global wrapper_interruption
|
||||||
wrapper_interruption:
|
wrapper_interruption:
|
||||||
pushl %ss
|
pushl %ss
|
||||||
|
|
|
@ -247,8 +247,7 @@ unsigned convert(u32 keypressed)
|
||||||
|
|
||||||
else if (key == SCAN_F9)
|
else if (key == SCAN_F9)
|
||||||
{
|
{
|
||||||
regs dump;
|
int20;
|
||||||
show_cpu(&dump);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (key == SCAN_F10)
|
else if (key == SCAN_F10)
|
||||||
|
@ -363,6 +362,7 @@ unsigned convert(u32 keypressed)
|
||||||
|
|
||||||
__attribute__((interrupt)) void keyboard_handler(exception_stack_noerror *caller)
|
__attribute__((interrupt)) void keyboard_handler(exception_stack_noerror *caller)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
u8 scancode, ascii;
|
u8 scancode, ascii;
|
||||||
while ((inb(0x64) & 1) == 0);
|
while ((inb(0x64) & 1) == 0);
|
||||||
scancode = inb(0x60);
|
scancode = inb(0x60);
|
||||||
|
@ -375,6 +375,7 @@ __attribute__((interrupt)) void keyboard_handler(exception_stack_noerror *caller
|
||||||
bufferascii[ptrascii] = ascii;
|
bufferascii[ptrascii] = ascii;
|
||||||
}
|
}
|
||||||
irqendmaster();
|
irqendmaster();
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
|
@ -66,6 +66,7 @@ void outmsecmd(u8 command)
|
||||||
|
|
||||||
__attribute__((interrupt)) void mouse_handler(exception_stack_noerror *caller)
|
__attribute__((interrupt)) void mouse_handler(exception_stack_noerror *caller)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
u8 mbyte = inb(0x60);
|
u8 mbyte = inb(0x60);
|
||||||
s8 changex, changey;
|
s8 changex, changey;
|
||||||
|
|
||||||
|
@ -142,6 +143,7 @@ __attribute__((interrupt)) void mouse_handler(exception_stack_noerror *caller)
|
||||||
endofint:
|
endofint:
|
||||||
irqendmaster();
|
irqendmaster();
|
||||||
irqendslave();
|
irqendslave();
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
|
@ -76,8 +76,10 @@ END */
|
||||||
|
|
||||||
void processexit(void)
|
void processexit(void)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
deleteprocess(getcurrentpid());
|
deleteprocess(getcurrentpid());
|
||||||
switchtask(maketid(1,1));
|
switchtask(maketid(1,1));
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
@ -257,6 +259,7 @@ process* findcurrentprocess(void)
|
||||||
|
|
||||||
void switchtask(tid_t tid)
|
void switchtask(tid_t tid)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
tid_t previous = current;
|
tid_t previous = current;
|
||||||
task *atask = findtask(tid);
|
task *atask = findtask(tid);
|
||||||
if (atask==NULL) return;
|
if (atask==NULL) return;
|
||||||
|
@ -346,6 +349,7 @@ task* findcurrenttask(void)
|
||||||
|
|
||||||
void deletetask(tid_t tid)
|
void deletetask(tid_t tid)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
stoptask(tid);
|
stoptask(tid);
|
||||||
process* aprocess=findprocess(tid.pid);
|
process* aprocess=findprocess(tid.pid);
|
||||||
if (aprocess==NULL) return;
|
if (aprocess==NULL) return;
|
||||||
|
@ -353,6 +357,7 @@ void deletetask(tid_t tid)
|
||||||
if (atask==NULL) return;
|
if (atask==NULL) return;
|
||||||
TAILQ_REMOVE(&aprocess->task_head, atask, tailq);
|
TAILQ_REMOVE(&aprocess->task_head, atask, tailq);
|
||||||
vfree(atask);
|
vfree(atask);
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
@ -360,6 +365,7 @@ void deletetask(tid_t tid)
|
||||||
|
|
||||||
void runtask(tid_t tid)
|
void runtask(tid_t tid)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
task *atask=findtask(tid);
|
task *atask=findtask(tid);
|
||||||
if (atask==NULL) return;
|
if (atask==NULL) return;
|
||||||
if (atask->status == TASK_STATUS_READY)
|
if (atask->status == TASK_STATUS_READY)
|
||||||
|
@ -367,6 +373,7 @@ void runtask(tid_t tid)
|
||||||
atask->status = TASK_STATUS_RUN;
|
atask->status = TASK_STATUS_RUN;
|
||||||
switchtask(tid);
|
switchtask(tid);
|
||||||
}
|
}
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
@ -374,6 +381,7 @@ void runtask(tid_t tid)
|
||||||
|
|
||||||
tid_t createtask(pid_t pid,u8 *entry, bool kerneltask)
|
tid_t createtask(pid_t pid,u8 *entry, bool kerneltask)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
tid_t tid;
|
tid_t tid;
|
||||||
tid.pid=pid;
|
tid.pid=pid;
|
||||||
process* aprocess=findprocess(pid);
|
process* aprocess=findprocess(pid);
|
||||||
|
@ -429,6 +437,7 @@ tid_t createtask(pid_t pid,u8 *entry, bool kerneltask)
|
||||||
new->dump.edi = 0;
|
new->dump.edi = 0;
|
||||||
new->status = TASK_STATUS_READY;
|
new->status = TASK_STATUS_READY;
|
||||||
return new->tid;
|
return new->tid;
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
@ -436,9 +445,11 @@ tid_t createtask(pid_t pid,u8 *entry, bool kerneltask)
|
||||||
|
|
||||||
void stoptask(tid_t tid)
|
void stoptask(tid_t tid)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
task *atask=findtask(tid);
|
task *atask=findtask(tid);
|
||||||
if (atask==NULL) return;
|
if (atask==NULL) return;
|
||||||
atask->status=TASK_STATUS_STOP;
|
atask->status=TASK_STATUS_STOP;
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
@ -446,6 +457,7 @@ void stoptask(tid_t tid)
|
||||||
|
|
||||||
pid_t createprocess(u8 *src, bool kerneltask)
|
pid_t createprocess(u8 *src, bool kerneltask)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
tid_t previous = current;
|
tid_t previous = current;
|
||||||
current.pid = getfreepid();
|
current.pid = getfreepid();
|
||||||
current.number = 0;
|
current.number = 0;
|
||||||
|
@ -467,6 +479,7 @@ pid_t createprocess(u8 *src, bool kerneltask)
|
||||||
cr3=old->pdd->addr->paddr;
|
cr3=old->pdd->addr->paddr;
|
||||||
setCR3(cr3);
|
setCR3(cr3);
|
||||||
new->status=PROCESS_STATUS_READY;
|
new->status=PROCESS_STATUS_READY;
|
||||||
|
sti();
|
||||||
return new->pid;
|
return new->pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,6 +488,7 @@ pid_t createprocess(u8 *src, bool kerneltask)
|
||||||
|
|
||||||
void deleteprocess(pid_t pid)
|
void deleteprocess(pid_t pid)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
stopprocess(pid);
|
stopprocess(pid);
|
||||||
process* aprocess=findprocess(pid);
|
process* aprocess=findprocess(pid);
|
||||||
if (aprocess==NULL) return;
|
if (aprocess==NULL) return;
|
||||||
|
@ -482,7 +496,7 @@ void deleteprocess(pid_t pid)
|
||||||
TAILQ_FOREACH(next, &aprocess->task_head, tailq)
|
TAILQ_FOREACH(next, &aprocess->task_head, tailq)
|
||||||
deletetask(next->tid);
|
deletetask(next->tid);
|
||||||
aprocess->status = PROCESS_STATUS_FREE;
|
aprocess->status = PROCESS_STATUS_FREE;
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
@ -490,6 +504,7 @@ void deleteprocess(pid_t pid)
|
||||||
|
|
||||||
void runprocess(pid_t pid)
|
void runprocess(pid_t pid)
|
||||||
{
|
{
|
||||||
|
cli();
|
||||||
process* aprocess=findprocess(pid);
|
process* aprocess=findprocess(pid);
|
||||||
if (aprocess==NULL) return;
|
if (aprocess==NULL) return;
|
||||||
if (aprocess->status == PROCESS_STATUS_READY)
|
if (aprocess->status == PROCESS_STATUS_READY)
|
||||||
|
@ -501,6 +516,7 @@ void runprocess(pid_t pid)
|
||||||
atask->status=TASK_STATUS_RUN;
|
atask->status=TASK_STATUS_RUN;
|
||||||
switchtask(tid);
|
switchtask(tid);
|
||||||
}
|
}
|
||||||
|
sti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
|
@ -449,8 +449,7 @@ int showinfo()
|
||||||
|
|
||||||
int showregs()
|
int showregs()
|
||||||
{
|
{
|
||||||
regs dump;
|
int20;
|
||||||
show_cpu(&dump);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ void main(void)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (getticks()%10==0)
|
if (getticks()%100000==0)
|
||||||
print("[TEST]\r\n");
|
print("[TEST]\r\n");
|
||||||
}
|
}
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
|
@ -26,6 +26,7 @@ static u8 errormsg[] =
|
||||||
static u8 key = 0;
|
static u8 key = 0;
|
||||||
|
|
||||||
extern wrapper_timer;
|
extern wrapper_timer;
|
||||||
|
extern wrapper_interruption20;
|
||||||
|
|
||||||
void ok()
|
void ok()
|
||||||
{
|
{
|
||||||
|
@ -77,6 +78,8 @@ int main(u32 magic, u32 addr)
|
||||||
print("\033[37m\033[0m -Initilisation des interruptions");
|
print("\033[37m\033[0m -Initilisation des interruptions");
|
||||||
initidt();
|
initidt();
|
||||||
initpic();
|
initpic();
|
||||||
|
setidt((u32) &wrapper_interruption20, SEL_KERNEL_CODE,
|
||||||
|
ENTRY_PRESENT | ENTRY_RING3 | TRAPGATE, 20);
|
||||||
sti();
|
sti();
|
||||||
ok();
|
ok();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue