提交 ac0a9fb2 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

A 64-bit struct taskstate.

上级 e030cdee
...@@ -110,7 +110,7 @@ struct intdesc ...@@ -110,7 +110,7 @@ struct intdesc
u16 rip1; u16 rip1;
u32 rip2; u32 rip2;
u32 reserved1; u32 reserved1;
}; } __attribute__((packed, aligned(16)));
// See section 4.6 of amd64 vol2 // See section 4.6 of amd64 vol2
struct desctr struct desctr
...@@ -121,8 +121,13 @@ struct desctr ...@@ -121,8 +121,13 @@ struct desctr
struct taskstate struct taskstate
{ {
u64 rsp0; u8 reserved0[4];
} __attribute__((packed)); u64 rsp[3];
u64 ist[8];
u8 reserved1[10];
u16 iomba;
u8 iopb[];
} __attribute__ ((packed, aligned(16)));
#endif #endif
#define INT_P (1<<7) /* interrupt descriptor present */ #define INT_P (1<<7) /* interrupt descriptor present */
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "queue.h" #include "queue.h"
#include "condvar.h" #include "condvar.h"
#include "proc.h" #include "proc.h"
#include <stddef.h>
extern char data[]; // defined in data.S extern char data[]; // defined in data.S
...@@ -123,7 +124,8 @@ switchuvm(struct proc *p) ...@@ -123,7 +124,8 @@ switchuvm(struct proc *p)
mycpu()->gdt[TSSSEG>>3] = (struct segdesc) mycpu()->gdt[TSSSEG>>3] = (struct segdesc)
SEGDESC(base, (sizeof(mycpu()->ts)-1), SEG_P|SEG_TSS64A); SEGDESC(base, (sizeof(mycpu()->ts)-1), SEG_P|SEG_TSS64A);
mycpu()->gdt[(TSSSEG>>3)+1] = (struct segdesc) SEGDESCHI(base); mycpu()->gdt[(TSSSEG>>3)+1] = (struct segdesc) SEGDESCHI(base);
mycpu()->ts.rsp0 = (u64) myproc()->kstack + KSTACKSIZE; mycpu()->ts.rsp[0] = (u64) myproc()->kstack + KSTACKSIZE;
mycpu()->ts.iomba = (u16)offsetof(struct taskstate, iopb);
ltr(TSSSEG); ltr(TSSSEG);
if(p->vmap == 0 || p->vmap->pml4 == 0) if(p->vmap == 0 || p->vmap->pml4 == 0)
panic("switchuvm: no vmap/pml4"); panic("switchuvm: no vmap/pml4");
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论