Skip to content

Commit

Permalink
use a different alternative interrupt stack for page faults
Browse files Browse the repository at this point in the history
We muse use another alternative stack otherwise a page fault that occurs
during interrupt processing will corrupt the stack.
  • Loading branch information
prekageo committed Oct 2, 2017
1 parent bffcd76 commit 2073142
Showing 1 changed file with 21 additions and 10 deletions.
31 changes: 21 additions & 10 deletions libdune/entry.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,28 +96,33 @@ static void map_ptr(void *p, int len)
}

#define SAFE_STACK_SIZE (2048 * 1024)
#define SAFE_STACKS 2 /* Must be less than 8 */

static int setup_safe_stack(struct dune_percpu *percpu)
{
int i;
char *safe_stack;
char *safe_stack[SAFE_STACKS];

safe_stack = mmap(NULL, SAFE_STACK_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
for (i = 0; i < SAFE_STACKS; i++) {
safe_stack[i] = mmap(NULL, SAFE_STACK_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);

if (safe_stack == MAP_FAILED)
return -ENOMEM;
if (safe_stack[i] == MAP_FAILED)
return -ENOMEM;

map_ptr(safe_stack[i], SAFE_STACK_SIZE);

map_ptr(safe_stack, SAFE_STACK_SIZE);
safe_stack[i] += SAFE_STACK_SIZE;
}

safe_stack += SAFE_STACK_SIZE;
percpu->tss.tss_iomb = offsetof(struct Tss, tss_iopb);

for (i = 1; i < 8; i++)
percpu->tss.tss_ist[i] = (uintptr_t) safe_stack;
/* Note: tss_ist[0] is ignored */
for (i = 0; i < SAFE_STACKS; i++)
percpu->tss.tss_ist[i + 1] = (uintptr_t) safe_stack[i];

/* changed later on jump to G3 */
percpu->tss.tss_rsp[0] = (uintptr_t) safe_stack;
percpu->tss.tss_rsp[0] = (uintptr_t) safe_stack[0];

return 0;
}
Expand Down Expand Up @@ -210,6 +215,12 @@ static void setup_idt(void)
id->ist = 1;

switch (i) {
case T_PGFLT:
/* We muse use another alternative stack otherwise a
* page fault that occurs during interrupt processing
* will corrupt the stack. */
id->ist = 2;
break;
case T_BRKPT:
id->type |= IDTD_CPL3;
break;
Expand Down

0 comments on commit 2073142

Please sign in to comment.