[ SOLVED ] Page fault on interrupt when using IST

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
User avatar
austanss
Member
Member
Posts: 377
Joined: Sun Oct 11, 2020 9:46 pm
Location: United States

[ SOLVED ] Page fault on interrupt when using IST

Post by austanss »

I'm attempting to set up an IST for my interrupts.

I have the IST stacks set up in my TSS:

Code: Select all

void cpu::tss::tss_install(int num_cpu, uint64_t stack) {
    isr_stack = (memory::paging::allocation::request_page() + 0x1000);
    irq_stack = (memory::paging::allocation::request_page() + 0x1000);
    sgi_stack = (memory::paging::allocation::request_page() + 0x1000);


    uint64_t tss_base = (uint64_t)&s_tss_descriptors[num_cpu];
    memory::operations::memset((void *)tss_base, 0, sizeof(cpu::tss::tss_t));

    cpu::gdt::gdt_install_tss(tss_base, sizeof(cpu::tss::tss_t));

    s_tss_descriptors[num_cpu].rsp[0] = stack;
    s_tss_descriptors[num_cpu].io_map = sizeof(cpu::tss::tss_t);
    s_tss_descriptors[num_cpu].ist[0] = (uint64_t)isr_stack;
    s_tss_descriptors[num_cpu].ist[1] = (uint64_t)irq_stack;
    s_tss_descriptors[num_cpu].ist[2] = (uint64_t)sgi_stack;

    cpu::tss::load_tss(0x28);
}
And I configure my IDT to use the IST, like this:

Code: Select all

void idt_set(uint8_t number, uint64_t base, uint16_t selector, uint8_t flags) {
	/* Set Base Address */
	idt_s[number].baseLow = base & 0xFFFF;
	idt_s[number].baseMid = (base >> 16) & 0xFFFF;
	idt_s[number].baseHigh = (base >> 32) & 0xFFFFFFFF;

	/* Set Selector */
	idt_s[number].selector = selector;
	idt_s[number].flags = flags;

	/* Set IST */
	if (number < 32)
		idt_s[number].reservedIst = 1;
	else if (number < 48)
		idt_s[number].reservedIst = 2;	
	else
		idt_s[number].reservedIst = 3;

	/* Set Reserved Areas to Zero */
	idt_s[number].reserved = 0;
}
When I run it, I get a page fault on the first interrupt, error code 2 (write access | page not present), CR2=fffffffffffffff8, RSP is default kernel stack.

What am I missing?

I am pretty sure my TSS is valid, because I can switch context to/fro the kernel without the ISTs in the interrupts.
Last edited by austanss on Tue Feb 23, 2021 6:36 pm, edited 1 time in total.
Skylight: https://github.com/austanss/skylight

I make stupid mistakes and my vision is terrible. Not a good combination.

NOTE: Never respond to my posts with "it's too hard".
User avatar
austanss
Member
Member
Posts: 377
Joined: Sun Oct 11, 2020 9:46 pm
Location: United States

Re: Page fault on interrupt when using IST

Post by austanss »

I still have not resolved this issue.

I did realize, though, that I needed to move the TSS initialization before the IDT, but even then, it still doesn't work.

I pushed my code to my GitHub, link in signature,
Skylight: https://github.com/austanss/skylight

I make stupid mistakes and my vision is terrible. Not a good combination.

NOTE: Never respond to my posts with "it's too hard".
thewrongchristian
Member
Member
Posts: 426
Joined: Tue Apr 03, 2018 2:44 am

Re: Page fault on interrupt when using IST

Post by thewrongchristian »

rizxt wrote:I still have not resolved this issue.

I did realize, though, that I needed to move the TSS initialization before the IDT, but even then, it still doesn't work.

I pushed my code to my GitHub, link in signature,
Is it the same error?
rizxt wrote: When I run it, I get a page fault on the first interrupt, error code 2 (write access | page not present), CR2=fffffffffffffff8, RSP is default kernel stack.
Because that CR2 looks suspiciously like a NULL pointer used for a new RSP, which is trying to push a 64-bit value (pre-decremented to fffffffffffffff8, then page fault on write)
User avatar
austanss
Member
Member
Posts: 377
Joined: Sun Oct 11, 2020 9:46 pm
Location: United States

Re: Page fault on interrupt when using IST

Post by austanss »

thewrongchristian wrote:
rizxt wrote:I still have not resolved this issue.

I did realize, though, that I needed to move the TSS initialization before the IDT, but even then, it still doesn't work.

I pushed my code to my GitHub, link in signature,
Is it the same error?
rizxt wrote: When I run it, I get a page fault on the first interrupt, error code 2 (write access | page not present), CR2=fffffffffffffff8, RSP is default kernel stack.
Because that CR2 looks suspiciously like a NULL pointer used for a new RSP, which is trying to push a 64-bit value (pre-decremented to fffffffffffffff8, then page fault on write)
OK, so I did notice a bug here where I overrided the IST to zero after I used it... so the page fault was actually the fault of the IST not being used.

But with the IST now, I get this error:

Code: Select all

  140: v=0e e=0000 i=0 cpl=0 IP=0008:0000000000105b5b pc=0000000000105b5b SP=0010:0000000000113b98 CR2=00000010c0e00200
Where IP points to

Code: Select all

  105b5b:	4c 8d 35 42 fe ff ff 	lea    r14,[rip+0xfffffffffffffe42]        # 1059a4 <isr_common_stub>
Skylight: https://github.com/austanss/skylight

I make stupid mistakes and my vision is terrible. Not a good combination.

NOTE: Never respond to my posts with "it's too hard".
thewrongchristian
Member
Member
Posts: 426
Joined: Tue Apr 03, 2018 2:44 am

Re: Page fault on interrupt when using IST

Post by thewrongchristian »

rizxt wrote: But with the IST now, I get this error:

Code: Select all

  140: v=0e e=0000 i=0 cpl=0 IP=0008:0000000000105b5b pc=0000000000105b5b SP=0010:0000000000113b98 CR2=00000010c0e00200
Where IP points to

Code: Select all

  105b5b:	4c 8d 35 42 fe ff ff 	lea    r14,[rip+0xfffffffffffffe42]        # 1059a4 <isr_common_stub>
Compiling locally, I can't see this instruction sequence (debian/gcc 8.3.0). So you'll have to look up where this code lives in your binary, which function does it live in? I find objdump invaluable:

Code: Select all

$ objdump -S bin/microCORE.kernel | less 
Then just search for the above faulting code.

Skimming your code, the only references to isr_common_stub are in your interrupt handlers. Does your git repo match your current code?
User avatar
austanss
Member
Member
Posts: 377
Joined: Sun Oct 11, 2020 9:46 pm
Location: United States

Re: Page fault on interrupt when using IST

Post by austanss »

thewrongchristian wrote:
rizxt wrote: But with the IST now, I get this error:

Code: Select all

  140: v=0e e=0000 i=0 cpl=0 IP=0008:0000000000105b5b pc=0000000000105b5b SP=0010:0000000000113b98 CR2=00000010c0e00200
Where IP points to

Code: Select all

  105b5b:	4c 8d 35 42 fe ff ff 	lea    r14,[rip+0xfffffffffffffe42]        # 1059a4 <isr_common_stub>
Compiling locally, I can't see this instruction sequence (debian/gcc 8.3.0). So you'll have to look up where this code lives in your binary, which function does it live in? I find objdump invaluable:

Code: Select all

$ objdump -S bin/microCORE.kernel | less 
Then just search for the above faulting code.

Skimming your code, the only references to isr_common_stub are in your interrupt handlers. Does your git repo match your current code?
No. But, I have updated the code to the latest. Also, make sure you are viewing the non-default branch.
Skylight: https://github.com/austanss/skylight

I make stupid mistakes and my vision is terrible. Not a good combination.

NOTE: Never respond to my posts with "it's too hard".
User avatar
austanss
Member
Member
Posts: 377
Joined: Sun Oct 11, 2020 9:46 pm
Location: United States

Re: Page fault on interrupt when using IST

Post by austanss »

I re-arranged interrupts.asm and now I am getting an error back when unmask IRQ 0,

so I still believe this is a stack issue.

Code: Select all

    139: v=20 e=0000 i=0 cpl=0 IP=0008:0000000000101253 pc=0000000000101253 SP=0010:0000000000114b50 env->regs[R_EAX]=00000000000000fe
RAX=00000000000000fe RBX=000000000000005b RCX=0000000000000000 RDX=0000000000000021
RSI=00000000000000fe RDI=0000000000000021 RBP=0000000000114b68 RSP=0000000000114b50
R8 =0000000000108380 R9 =0000000000000000 R10=0000000000000000 R11=0000000000000004
R12=000000000000005b R13=000000001ea68018 R14=00000000001077f9 R15=000000001fb4c018
RIP=0000000000101253 RFL=00000212 [----A--] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
CS =0008 0000000000000000 00000fff 00a09a00 DPL=0 CS64 [-R-]
SS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
DS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
FS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
GS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0028 000000000010f0e0 00000068 00008900 DPL=0 TSS64-avl
GDT=     0000000000110000 0000007f
IDT=     00000010e0c00000 00000fff
CR0=80000033 CR2=0000000000000000 CR3=0000000000116000 CR4=00000668
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000 
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=0000000000000008 CCD=0000000000114b38 CCO=SUBQ    
EFER=0000000000000d00

check_exception old: 0xffffffff new 0xe
   140: v=0e e=0000 i=0 cpl=0 IP=0008:0000000000101253 pc=0000000000101253 SP=0010:0000000000114b50 CR2=00000010e0c00200
RAX=00000000000000fe RBX=000000000000005b RCX=0000000000000000 RDX=0000000000000021
RSI=00000000000000fe RDI=0000000000000021 RBP=0000000000114b68 RSP=0000000000114b50
R8 =0000000000108380 R9 =0000000000000000 R10=0000000000000000 R11=0000000000000004
R12=000000000000005b R13=000000001ea68018 R14=00000000001077f9 R15=000000001fb4c018
RIP=0000000000101253 RFL=00000212 [----A--] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
CS =0008 0000000000000000 00000fff 00a09a00 DPL=0 CS64 [-R-]
SS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
DS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
FS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
GS =0010 0000000000000000 00000fff 00a09300 DPL=0 DS   [-WA]
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0028 000000000010f0e0 00000068 00008900 DPL=0 TSS64-avl
GDT=     0000000000110000 0000007f
IDT=     00000010e0c00000 00000fff
CR0=80000033 CR2=00000010e0c00200 CR3=0000000000116000 CR4=00000668
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000 
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=0000000000000008 CCD=0000000000114b38 CCO=SUBQ    
EFER=0000000000000d00
Skylight: https://github.com/austanss/skylight

I make stupid mistakes and my vision is terrible. Not a good combination.

NOTE: Never respond to my posts with "it's too hard".
Octocontrabass
Member
Member
Posts: 5568
Joined: Mon Mar 25, 2013 7:01 pm

Re: Page fault on interrupt when using IST

Post by Octocontrabass »

rizxt wrote:

Code: Select all

    139: v=20

IDT=     00000010e0c00000 00000fff

check_exception old: 0xffffffff new 0xe
   140: v=0e ... CR2=00000010e0c00200
Looks like your IDTR is filled with garbage.

Are you sure that's the right type?
User avatar
austanss
Member
Member
Posts: 377
Joined: Sun Oct 11, 2020 9:46 pm
Location: United States

Re: Page fault on interrupt when using IST

Post by austanss »

Octocontrabass wrote:
rizxt wrote:

Code: Select all

    139: v=20

IDT=     00000010e0c00000 00000fff

check_exception old: 0xffffffff new 0xe
   140: v=0e ... CR2=00000010e0c00200
Looks like your IDTR is filled with garbage.

Are you sure that's the right type?
Wow, I can't believe the error was that simple. :facepalm:
I mix up words and dwords a bit. Thanks for your help, I would've never noticed that!
Skylight: https://github.com/austanss/skylight

I make stupid mistakes and my vision is terrible. Not a good combination.

NOTE: Never respond to my posts with "it's too hard".
Post Reply