git://scm.lunaixsky.com
/
lunaix-os.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
841bc2c
)
refactor: cut off some bloats in intr_ctx
author
Minep
<zelong56@gmail.com>
Wed, 4 Jan 2023 02:15:56 +0000
(
02:15
+0000)
committer
Minep
<zelong56@gmail.com>
Wed, 4 Jan 2023 02:15:56 +0000
(
02:15
+0000)
12 files changed:
lunaix-os/debug/bg_lsdbg.c
patch
|
blob
|
history
lunaix-os/debug/gdbstub.c
patch
|
blob
|
history
lunaix-os/debug/sdbg.c
patch
|
blob
|
history
lunaix-os/hal/ahci/io_event.c
patch
|
blob
|
history
lunaix-os/includes/arch/x86/interrupts.h
patch
|
blob
|
history
lunaix-os/includes/lunaix/process.h
patch
|
blob
|
history
lunaix-os/kernel/asm/x86/interrupt.S
patch
|
blob
|
history
lunaix-os/kernel/asm/x86/interrupts.c
patch
|
blob
|
history
lunaix-os/kernel/asm/x86/intr_routines.c
patch
|
blob
|
history
lunaix-os/kernel/asm/x86/pfault.c
patch
|
blob
|
history
lunaix-os/kernel/k_init.c
patch
|
blob
|
history
lunaix-os/kernel/process/sched.c
patch
|
blob
|
history
diff --git
a/lunaix-os/debug/bg_lsdbg.c
b/lunaix-os/debug/bg_lsdbg.c
index 0f0496de4681dc506fa65b28e45eb16847fc7c94..9c428b2755c11877e1fc989cfcc3d94db310f011 100644
(file)
--- a/
lunaix-os/debug/bg_lsdbg.c
+++ b/
lunaix-os/debug/bg_lsdbg.c
@@
-29,9
+29,11
@@
lunaix_sdbg_loop(isr_param* param)
char c;
if (sdbg_state == SDBG_STATE_WAIT_BRK) {
char c;
if (sdbg_state == SDBG_STATE_WAIT_BRK) {
- (param)->eflags &= ~(1 << 8);
+ (param)->e
xecp->e
flags &= ~(1 << 8);
sdbg_state = SDBG_STATE_INSESSION;
sdbg_state = SDBG_STATE_INSESSION;
- sdbg_printf("[%p:%p] Break point reached.\n", param->cs, param->eip);
+ sdbg_printf("[%p:%p] Break point reached.\n",
+ param->execp->cs,
+ param->execp->eip);
}
while (1) {
}
while (1) {
@@
-44,12
+46,14
@@
lunaix_sdbg_loop(isr_param* param)
switch (c) {
case SDBG_CLNT_HI:
if (sdbg_state == SDBG_STATE_START) {
switch (c) {
case SDBG_CLNT_HI:
if (sdbg_state == SDBG_STATE_START) {
- sdbg_printf(
- "[%p:%p] Session started.\n", param->cs, param->eip);
+ sdbg_printf("[%p:%p] Session started.\n",
+ param->execp->cs,
+ param->execp->eip);
sdbg_state = SDBG_STATE_INSESSION;
} else {
sdbg_state = SDBG_STATE_INSESSION;
} else {
- sdbg_printf(
- "[%p:%p] Session resumed.\n", param->cs, param->eip);
+ sdbg_printf("[%p:%p] Session resumed.\n",
+ param->execp->cs,
+ param->execp->eip);
}
break;
case SDBG_CLNT_RREG:
}
break;
case SDBG_CLNT_RREG:
@@
-57,7
+61,7
@@
lunaix_sdbg_loop(isr_param* param)
serial_tx_buffer(SERIAL_COM1, (char*)param, sizeof(isr_param));
break;
case SDBG_CLNT_STEP:
serial_tx_buffer(SERIAL_COM1, (char*)param, sizeof(isr_param));
break;
case SDBG_CLNT_STEP:
- ((isr_param*)param)->eflags |= (1 << 8); // set TF flags
+ ((isr_param*)param)->e
xecp->e
flags |= (1 << 8); // set TF flags
sdbg_state = SDBG_STATE_WAIT_BRK;
return;
case SDBG_CLNT_BRKP:
sdbg_state = SDBG_STATE_WAIT_BRK;
return;
case SDBG_CLNT_BRKP:
diff --git
a/lunaix-os/debug/gdbstub.c
b/lunaix-os/debug/gdbstub.c
index 9546b85800693788888f181892fc75494e98f551..d87db19fa33cc46ad519da0f74287cd2a0eb8c41 100644
(file)
--- a/
lunaix-os/debug/gdbstub.c
+++ b/
lunaix-os/debug/gdbstub.c
@@
-1211,7
+1211,7
@@
void
gdbstub_loop(isr_param* param)
{
/* Translate vector to signal */
gdbstub_loop(isr_param* param)
{
/* Translate vector to signal */
- switch (param->vector) {
+ switch (param->
execp->
vector) {
case 1:
gdb_state.signum = 5;
break;
case 1:
gdb_state.signum = 5;
break;
@@
-1227,14
+1227,14
@@
gdbstub_loop(isr_param* param)
gdb_state.registers[GDB_CPU_I386_REG_ECX] = param->registers.ecx;
gdb_state.registers[GDB_CPU_I386_REG_EDX] = param->registers.edx;
gdb_state.registers[GDB_CPU_I386_REG_EBX] = param->registers.ebx;
gdb_state.registers[GDB_CPU_I386_REG_ECX] = param->registers.ecx;
gdb_state.registers[GDB_CPU_I386_REG_EDX] = param->registers.edx;
gdb_state.registers[GDB_CPU_I386_REG_EBX] = param->registers.ebx;
- gdb_state.registers[GDB_CPU_I386_REG_ESP] = param->
registers.
esp;
+ gdb_state.registers[GDB_CPU_I386_REG_ESP] = param->esp;
gdb_state.registers[GDB_CPU_I386_REG_EBP] = param->registers.ebp;
gdb_state.registers[GDB_CPU_I386_REG_ESI] = param->registers.esi;
gdb_state.registers[GDB_CPU_I386_REG_EDI] = param->registers.edi;
gdb_state.registers[GDB_CPU_I386_REG_EBP] = param->registers.ebp;
gdb_state.registers[GDB_CPU_I386_REG_ESI] = param->registers.esi;
gdb_state.registers[GDB_CPU_I386_REG_EDI] = param->registers.edi;
- gdb_state.registers[GDB_CPU_I386_REG_PC] = param->eip;
- gdb_state.registers[GDB_CPU_I386_REG_CS] = param->cs;
- gdb_state.registers[GDB_CPU_I386_REG_PS] = param->eflags;
- gdb_state.registers[GDB_CPU_I386_REG_SS] = param->ss;
+ gdb_state.registers[GDB_CPU_I386_REG_PC] = param->e
xecp->e
ip;
+ gdb_state.registers[GDB_CPU_I386_REG_CS] = param->
execp->
cs;
+ gdb_state.registers[GDB_CPU_I386_REG_PS] = param->e
xecp->e
flags;
+ gdb_state.registers[GDB_CPU_I386_REG_SS] = param->
execp->
ss;
gdb_state.registers[GDB_CPU_I386_REG_DS] = param->registers.ds;
gdb_state.registers[GDB_CPU_I386_REG_ES] = param->registers.es;
gdb_state.registers[GDB_CPU_I386_REG_FS] = param->registers.fs;
gdb_state.registers[GDB_CPU_I386_REG_DS] = param->registers.ds;
gdb_state.registers[GDB_CPU_I386_REG_ES] = param->registers.es;
gdb_state.registers[GDB_CPU_I386_REG_FS] = param->registers.fs;
@@
-1247,14
+1247,14
@@
gdbstub_loop(isr_param* param)
param->registers.ecx = gdb_state.registers[GDB_CPU_I386_REG_ECX];
param->registers.edx = gdb_state.registers[GDB_CPU_I386_REG_EDX];
param->registers.ebx = gdb_state.registers[GDB_CPU_I386_REG_EBX];
param->registers.ecx = gdb_state.registers[GDB_CPU_I386_REG_ECX];
param->registers.edx = gdb_state.registers[GDB_CPU_I386_REG_EDX];
param->registers.ebx = gdb_state.registers[GDB_CPU_I386_REG_EBX];
- param->
registers.
esp = gdb_state.registers[GDB_CPU_I386_REG_ESP];
+ param->esp = gdb_state.registers[GDB_CPU_I386_REG_ESP];
param->registers.ebp = gdb_state.registers[GDB_CPU_I386_REG_EBP];
param->registers.esi = gdb_state.registers[GDB_CPU_I386_REG_ESI];
param->registers.edi = gdb_state.registers[GDB_CPU_I386_REG_EDI];
param->registers.ebp = gdb_state.registers[GDB_CPU_I386_REG_EBP];
param->registers.esi = gdb_state.registers[GDB_CPU_I386_REG_ESI];
param->registers.edi = gdb_state.registers[GDB_CPU_I386_REG_EDI];
- param->eip = gdb_state.registers[GDB_CPU_I386_REG_PC];
- param->cs = gdb_state.registers[GDB_CPU_I386_REG_CS];
- param->eflags = gdb_state.registers[GDB_CPU_I386_REG_PS];
- param->ss = gdb_state.registers[GDB_CPU_I386_REG_SS];
+ param->e
xecp->e
ip = gdb_state.registers[GDB_CPU_I386_REG_PC];
+ param->
execp->
cs = gdb_state.registers[GDB_CPU_I386_REG_CS];
+ param->e
xecp->e
flags = gdb_state.registers[GDB_CPU_I386_REG_PS];
+ param->
execp->
ss = gdb_state.registers[GDB_CPU_I386_REG_SS];
param->registers.ds = gdb_state.registers[GDB_CPU_I386_REG_DS];
param->registers.es = gdb_state.registers[GDB_CPU_I386_REG_ES];
param->registers.fs = gdb_state.registers[GDB_CPU_I386_REG_FS];
param->registers.ds = gdb_state.registers[GDB_CPU_I386_REG_DS];
param->registers.es = gdb_state.registers[GDB_CPU_I386_REG_ES];
param->registers.fs = gdb_state.registers[GDB_CPU_I386_REG_FS];
diff --git
a/lunaix-os/debug/sdbg.c
b/lunaix-os/debug/sdbg.c
index 3cc23cf29d388068ec7668b89ab6955d749acd04..60a89f360a40cffc3b4e1fe91fd790ff802a16e7 100644
(file)
--- a/
lunaix-os/debug/sdbg.c
+++ b/
lunaix-os/debug/sdbg.c
@@
-22,7
+22,8
@@
sdbg_loop(const isr_param* param)
// synchronized way. And we don't want these irq queue up at our APIC and
// confuse the CPU after ACK with APIC.
serial_disable_irq(SERIAL_COM1);
// synchronized way. And we don't want these irq queue up at our APIC and
// confuse the CPU after ACK with APIC.
serial_disable_irq(SERIAL_COM1);
- if (param->vector == 1 || param->vector == 3) {
+ struct exec_param* execp = param->execp;
+ if (execp->vector == 1 || execp->vector == 3) {
goto cont;
}
goto cont;
}
@@
-74,10
+75,11
@@
done:
void
sdbg_imm(const isr_param* param)
{
void
sdbg_imm(const isr_param* param)
{
+ struct exec_param* execp = param->execp;
kprintf(KDEBUG "Quick debug mode\n");
kprintf(KDEBUG "cs=%p eip=%p eax=%p ebx=%p\n",
kprintf(KDEBUG "Quick debug mode\n");
kprintf(KDEBUG "cs=%p eip=%p eax=%p ebx=%p\n",
-
param
->cs,
-
param
->eip,
+
execp
->cs,
+
execp
->eip,
param->registers.eax,
param->registers.ebx);
kprintf(KDEBUG "ecx=%p edx=%p edi=%p esi=%p\n",
param->registers.eax,
param->registers.ebx);
kprintf(KDEBUG "ecx=%p edx=%p edi=%p esi=%p\n",
@@
-86,12
+88,12
@@
sdbg_imm(const isr_param* param)
param->registers.edi,
param->registers.esi);
kprintf(KDEBUG "u.esp=%p k.esp=%p ebp=%p ps=%p\n",
param->registers.edi,
param->registers.esi);
kprintf(KDEBUG "u.esp=%p k.esp=%p ebp=%p ps=%p\n",
- param->registers.esp,
param->esp,
param->esp,
+ execp->esp,
param->registers.ebp,
param->registers.ebp,
-
param
->eflags);
+
execp
->eflags);
kprintf(KDEBUG "ss=%p ds=%p es=%p fs=%p gs=%p\n",
kprintf(KDEBUG "ss=%p ds=%p es=%p fs=%p gs=%p\n",
-
param
->ss,
+
execp
->ss,
param->registers.ds,
param->registers.es,
param->registers.fs,
param->registers.ds,
param->registers.es,
param->registers.fs,
diff --git
a/lunaix-os/hal/ahci/io_event.c
b/lunaix-os/hal/ahci/io_event.c
index e11016a3b5a1165208e1a78b40fef4465226d819..c1bd6a5ad2f2cc9465aac2ab52beec962314c99c 100644
(file)
--- a/
lunaix-os/hal/ahci/io_event.c
+++ b/
lunaix-os/hal/ahci/io_event.c
@@
-15,7
+15,7
@@
__ahci_hba_isr(const isr_param* param)
struct ahci_driver *pos, *n;
llist_for_each(pos, n, &ahcis, ahci_drvs)
{
struct ahci_driver *pos, *n;
llist_for_each(pos, n, &ahcis, ahci_drvs)
{
- if (pos->id == param->vector) {
+ if (pos->id == param->
execp->
vector) {
hba = &pos->hba;
goto proceed;
}
hba = &pos->hba;
goto proceed;
}
diff --git
a/lunaix-os/includes/arch/x86/interrupts.h
b/lunaix-os/includes/arch/x86/interrupts.h
index d25fbe3b68d9e931b7062d559b7f9cbf6ad411ed..395cfe27ee0d599638bf287c36cc62309d3dabc2 100644
(file)
--- a/
lunaix-os/includes/arch/x86/interrupts.h
+++ b/
lunaix-os/includes/arch/x86/interrupts.h
@@
-5,6
+5,18
@@
#ifndef __ASM__
#include <hal/cpu.h>
#ifndef __ASM__
#include <hal/cpu.h>
+
+struct exec_param
+{
+ unsigned int vector;
+ unsigned int err_code;
+ unsigned int eip;
+ unsigned int cs;
+ unsigned int eflags;
+ unsigned int esp;
+ unsigned int ss;
+} __attribute__((packed));
+
typedef struct
{
struct
typedef struct
{
struct
@@
-20,16
+32,14
@@
typedef struct
reg32 es;
reg32 fs;
reg32 gs;
reg32 es;
reg32 fs;
reg32 gs;
- reg32 esp;
+
//
reg32 esp;
} __attribute__((packed)) registers;
} __attribute__((packed)) registers;
- unsigned int vector;
- unsigned int err_code;
- unsigned int eip;
- unsigned int cs;
- unsigned int eflags;
- unsigned int esp;
- unsigned int ss;
+ union
+ {
+ reg32 esp;
+ struct exec_param* execp;
+ };
} __attribute__((packed)) isr_param;
void
} __attribute__((packed)) isr_param;
void
diff --git
a/lunaix-os/includes/lunaix/process.h
b/lunaix-os/includes/lunaix/process.h
index 7674a925ab182dc7b90bfa9f41cff7c59f3d663a..291aba2d2a731f343621fb422412038a1af67049 100644
(file)
--- a/
lunaix-os/includes/lunaix/process.h
+++ b/
lunaix-os/includes/lunaix/process.h
@@
-57,9
+57,9
@@
struct proc_info
pid_t pid; // offset = 0
struct proc_info* parent; // offset = 4
isr_param intr_ctx; // offset = 8
pid_t pid; // offset = 0
struct proc_info* parent; // offset = 4
isr_param intr_ctx; // offset = 8
- uintptr_t ustack_top; // offset = 84
- void* page_table; // offset = 88
- void* fxstate; // offset = 92
+ uintptr_t ustack_top; // offset = 84
-> 56
+ void* page_table; // offset = 88
-> 60
+ void* fxstate; // offset = 92
-> 64
/* ---- critical section end ---- */
/* ---- critical section end ---- */
diff --git
a/lunaix-os/kernel/asm/x86/interrupt.S
b/lunaix-os/kernel/asm/x86/interrupt.S
index 2961f3b7d89f50a8f01677abbf1d452bc972b323..e88c32f3f1dbdf8736f20cfd480e47be554b4e13 100644
(file)
--- a/
lunaix-os/kernel/asm/x86/interrupt.S
+++ b/
lunaix-os/kernel/asm/x86/interrupt.S
@@
-77,11
+77,11
@@
movl (__current), %eax
# 保存x87FPU的状态
movl (__current), %eax
# 保存x87FPU的状态
- movl
92
(%eax), %ebx
+ movl
64
(%eax), %ebx
fxsave (%ebx)
movl 68(%esp), %ebx # 取出esp
fxsave (%ebx)
movl 68(%esp), %ebx # 取出esp
- movl %ebx,
84
(%eax) # 存入__current->ustack_top
+ movl %ebx,
56
(%eax) # 存入__current->ustack_top
1:
movl %esp, %eax
1:
movl %esp, %eax
@@
-99,11
+99,12
@@
#ifdef __ASM_INTR_DIAGNOSIS
movl %eax, (debug_resv + 8)
#ifdef __ASM_INTR_DIAGNOSIS
movl %eax, (debug_resv + 8)
- movl 56(%esp), %eax
- movl %eax, (debug_resv + 4)
+ movl 44(%esp), %eax
+ movl 8(%eax), %eax
+ movl %eax, (debug_resv + 4) # eip
#endif
movl (__current), %eax
#endif
movl (__current), %eax
- movl
92
(%eax), %eax
+ movl
64
(%eax), %eax
test %eax, %eax # do we have stored x87 context?
jz 1f
test %eax, %eax # do we have stored x87 context?
jz 1f
@@
-151,8
+152,8
@@
popl %ebx # next
movl __current, %eax
popl %ebx # next
movl __current, %eax
- movl
88
(%eax), %ecx # __current->pagetable
- movl
88
(%ebx), %eax # next->pagetable
+ movl
60
(%eax), %ecx # __current->pagetable
+ movl
60
(%ebx), %eax # next->pagetable
cmpl %ecx, %eax # if(next->pagtable != __current->pagetable) {
jz 1f
cmpl %ecx, %eax # if(next->pagtable != __current->pagetable) {
jz 1f
diff --git
a/lunaix-os/kernel/asm/x86/interrupts.c
b/lunaix-os/kernel/asm/x86/interrupts.c
index 25b3791e7415f73af0d632d3702e020ced94a9a3..b4a443f10376812bd94cb3abb4051fe090b1ee08 100644
(file)
--- a/
lunaix-os/kernel/asm/x86/interrupts.c
+++ b/
lunaix-os/kernel/asm/x86/interrupts.c
@@
-21,24
+21,24
@@
intr_handler(isr_param* param)
{
__current->intr_ctx = *param;
{
__current->intr_ctx = *param;
-
isr_param* lparam = &__current->intr_ctx
;
+
struct exec_param* execp = __current->intr_ctx.execp
;
- if (
lparam
->vector <= 255) {
- isr_cb subscriber = isrm_get(
lparam
->vector);
+ if (
execp
->vector <= 255) {
+ isr_cb subscriber = isrm_get(
execp
->vector);
subscriber(param);
goto done;
}
kprint_panic("INT %u: (%x) [%p: %p] Unknown",
subscriber(param);
goto done;
}
kprint_panic("INT %u: (%x) [%p: %p] Unknown",
-
lparam
->vector,
-
lparam
->err_code,
-
lparam
->cs,
-
lparam
->eip);
+
execp
->vector,
+
execp
->err_code,
+
execp
->cs,
+
execp
->eip);
done:
// for all external interrupts except the spurious interrupt
// this is required by Intel Manual Vol.3A, section 10.8.1 & 10.8.5
done:
// for all external interrupts except the spurious interrupt
// this is required by Intel Manual Vol.3A, section 10.8.1 & 10.8.5
- if (
lparam->vector >= IV_EX && lparam
->vector != APIC_SPIV_IV) {
+ if (
execp->vector >= IV_EX && execp
->vector != APIC_SPIV_IV) {
apic_done_servicing();
}
apic_done_servicing();
}
diff --git
a/lunaix-os/kernel/asm/x86/intr_routines.c
b/lunaix-os/kernel/asm/x86/intr_routines.c
index 97903cffebfdc5c1e3e145485e71825605527e90..f4bebae4159490173e9df5c693421ed503890121 100644
(file)
--- a/
lunaix-os/kernel/asm/x86/intr_routines.c
+++ b/
lunaix-os/kernel/asm/x86/intr_routines.c
@@
-22,11
+22,12
@@
extern u32_t debug_resv;
void
__print_panic_msg(const char* msg, const isr_param* param)
{
void
__print_panic_msg(const char* msg, const isr_param* param)
{
+ struct exec_param* execp = param->execp;
kprint_panic(" INT %u: (%x) [%p: %p] %s",
kprint_panic(" INT %u: (%x) [%p: %p] %s",
-
param
->vector,
-
param
->err_code,
-
param
->cs,
-
param
->eip,
+
execp
->vector,
+
execp
->err_code,
+
execp
->cs,
+
execp
->eip,
msg);
}
msg);
}
diff --git
a/lunaix-os/kernel/asm/x86/pfault.c
b/lunaix-os/kernel/asm/x86/pfault.c
index fcd52cc26480058f3a83b2144e8b46ee0b2c949a..2e4750397602e55a3cc3deff8a8aa0d688252494 100644
(file)
--- a/
lunaix-os/kernel/asm/x86/pfault.c
+++ b/
lunaix-os/kernel/asm/x86/pfault.c
@@
-36,7
+36,7
@@
intr_routine_page_fault(const isr_param* param)
goto segv_term;
}
goto segv_term;
}
- if (!SEL_RPL(param->cs)) {
+ if (!SEL_RPL(param->
execp->
cs)) {
// 如果是内核页错误……
if (do_kernel(&mapping)) {
return;
// 如果是内核页错误……
if (do_kernel(&mapping)) {
return;
@@
-91,8
+91,8
@@
segv_term:
kprintf(KERROR "(pid: %d) Segmentation fault on %p (%p:%p)\n",
__current->pid,
ptr,
kprintf(KERROR "(pid: %d) Segmentation fault on %p (%p:%p)\n",
__current->pid,
ptr,
- param->cs,
- param->eip);
+ param->
execp->
cs,
+ param->e
xecp->e
ip);
__SIGSET(__current->sig_pending, _SIGSEGV);
schedule();
// should not reach
__SIGSET(__current->sig_pending, _SIGSEGV);
schedule();
// should not reach
diff --git
a/lunaix-os/kernel/k_init.c
b/lunaix-os/kernel/k_init.c
index e0730e32fef15ab7aeaadb12f159dcbbed86965a..25af27e1ce80166093a92b2fe2ca15ca1b2ded1d 100644
(file)
--- a/
lunaix-os/kernel/k_init.c
+++ b/
lunaix-os/kernel/k_init.c
@@
-127,11
+127,7
@@
spawn_proc0()
proc0->intr_ctx = (isr_param){ .registers = { .ds = KDATA_SEG,
.es = KDATA_SEG,
.fs = KDATA_SEG,
proc0->intr_ctx = (isr_param){ .registers = { .ds = KDATA_SEG,
.es = KDATA_SEG,
.fs = KDATA_SEG,
- .gs = KDATA_SEG },
- .cs = KCODE_SEG,
- .eip = (void*)__proc0,
- .ss = KDATA_SEG,
- .eflags = cpu_reflags() };
+ .gs = KDATA_SEG } };
proc0->parent = proc0;
// 方案1:必须在读取eflags之后禁用。否则当进程被调度时,中断依然是关闭的!
proc0->parent = proc0;
// 方案1:必须在读取eflags之后禁用。否则当进程被调度时,中断依然是关闭的!
@@
-155,19
+151,14
@@
spawn_proc0()
VMAP_NULL);
}
VMAP_NULL);
}
- // 手动设置进程上下文:用于第一次调度
- asm volatile("movl %%esp, %%ebx\n"
- "movl %1, %%esp\n"
- "pushf\n"
- "pushl %2\n"
- "pushl %3\n"
- "pushl $0\n"
- "pushl $0\n"
- "movl %%esp, %0\n"
- "movl %%ebx, %%esp\n"
- : "=m"(proc0->intr_ctx.registers.esp)
- : "i"(KSTACK_TOP), "i"(KCODE_SEG), "r"(proc0->intr_ctx.eip)
- : "%ebx", "memory");
+ struct exec_param* execp =
+ (struct exec_param*)(KSTACK_TOP - sizeof(struct exec_param));
+
+ *execp = (struct exec_param){ .cs = KCODE_SEG,
+ .eip = (void*)__proc0,
+ .ss = KDATA_SEG,
+ .eflags = cpu_reflags() };
+ proc0->intr_ctx.execp = execp;
// 加载x87默认配置
asm volatile("fninit\n"
// 加载x87默认配置
asm volatile("fninit\n"
diff --git
a/lunaix-os/kernel/process/sched.c
b/lunaix-os/kernel/process/sched.c
index f0c0a988c97d59c9f30bdff81266ac7cac4aae44..4ed9d3438ad9c2d818ee0421de6463cea8ca12da 100644
(file)
--- a/
lunaix-os/kernel/process/sched.c
+++ b/
lunaix-os/kernel/process/sched.c
@@
-58,23
+58,23
@@
sched_init_dummy()
extern void my_dummy();
static char dummy_stack[DUMMY_STACK_SIZE] __attribute__((aligned(16)));
extern void my_dummy();
static char dummy_stack[DUMMY_STACK_SIZE] __attribute__((aligned(16)));
- // memset to 0
- dummy_proc = (struct proc_info){};
- dummy_proc.intr_ctx = (isr_param){
- .registers = { .ds = KDATA_SEG,
- .es = KDATA_SEG,
- .fs = KDATA_SEG,
- .gs = KDATA_SEG,
- .esp = (void*)dummy_stack + DUMMY_STACK_SIZE - 20 },
+ struct exec_param* execp =
+ (void*)dummy_stack + DUMMY_STACK_SIZE - sizeof(struct exec_param);
+
+ *execp = (struct exec_param){
.cs = KCODE_SEG,
.cs = KCODE_SEG,
+ .eflags = cpu_reflags() | 0x0200,
.eip = (void*)my_dummy,
.ss = KDATA_SEG,
.eip = (void*)my_dummy,
.ss = KDATA_SEG,
- .eflags = cpu_reflags() | 0x0200
};
};
- *(u32_t*)(&dummy_stack[DUMMY_STACK_SIZE - 4]) = dummy_proc.intr_ctx.eflags;
- *(u32_t*)(&dummy_stack[DUMMY_STACK_SIZE - 8]) = KCODE_SEG;
- *(u32_t*)(&dummy_stack[DUMMY_STACK_SIZE - 12]) = dummy_proc.intr_ctx.eip;
+ // memset to 0
+ dummy_proc = (struct proc_info){};
+ dummy_proc.intr_ctx = (isr_param){ .registers = { .ds = KDATA_SEG,
+ .es = KDATA_SEG,
+ .fs = KDATA_SEG,
+ .gs = KDATA_SEG },
+ .execp = execp };
dummy_proc.page_table = cpu_rcr3();
dummy_proc.state = PS_READY;
dummy_proc.page_table = cpu_rcr3();
dummy_proc.state = PS_READY;
@@
-97,7
+97,7
@@
run(struct proc_info* proc)
由于这中间没有进行地址空间的交换,所以第二次跳转使用的是同一个内核栈,而之前默认tss.esp0的值是永远指向最顶部
这样一来就有可能会覆盖更早的上下文信息(比如嵌套的信号捕获函数)
*/
由于这中间没有进行地址空间的交换,所以第二次跳转使用的是同一个内核栈,而之前默认tss.esp0的值是永远指向最顶部
这样一来就有可能会覆盖更早的上下文信息(比如嵌套的信号捕获函数)
*/
- tss_update_esp(proc->intr_ctx.
registers.
esp);
+ tss_update_esp(proc->intr_ctx.esp);
apic_done_servicing();
apic_done_servicing();