.macro pushaq
	pushq %rax
	pushq %rcx
	pushq %rdx
	pushq %rbx
	pushq %rbp
	pushq %rsi
	pushq %rdi
	pushq %r8
	pushq %r9
	pushq %r10
	pushq %r11
	pushq %r12
	pushq %r13
	pushq %r14
	pushq %r15
.endm

.macro popaq
	popq %r15
	popq %r14
	popq %r13
	popq %r12
	popq %r11
	popq %r10
	popq %r9
	popq %r8
	popq %rdi
	popq %rsi
	popq %rbp
	popq %rbx
	popq %rdx
	popq %rcx
	popq %rax
.endm

isr_stub:
	pushaq
	cld
	movq %cr0, %rax; pushq %rax
	movq %cr2, %rax; pushq %rax
	movq %cr3, %rax; pushq %rax
	movq %cr4, %rax; pushq %rax

	movq 152(%rsp), %rdi	// isr number
	movq 160(%rsp), %rsi	// error code
	leaq 168(%rsp), %rdx	// interrupt stack ptr
	movq %rsp, %rcx			// register ptr
	call cpp_isr_handler
	addq $32, %rsp

	popaq
	addq $16, %rsp
	iretq

irq_stub:
	pushaq
	cld
	movq 120(%rsp), %rdi	# irq number
	call cpp_irq_handler
	popaq
	addq $16, %rsp
	iretq

.global asm_yield_handler
asm_yield_handler:
	pushaq
	cld
	leaq 120(%rsp), %rdi # interrupt stack ptr
	movq     %rsp,  %rsi # interrupt register ptr
	call cpp_yield_handler
	popaq
	iretq

.global asm_ipi_handler
asm_ipi_handler:
	pushaq
	cld
	call cpp_ipi_handler
	popaq
	iretq

.global asm_timer_handler
asm_timer_handler:
	pushaq
	cld
	call cpp_timer_handler
	popaq
	iretq

.macro isr n
	.global isr\n
	isr\n:
		pushq $0
		pushq $\n
		jmp isr_stub
.endm

.macro isr_err n
	.global isr\n
	isr\n:
		pushq $\n
		jmp isr_stub
.endm

.macro irq n
	.global irq\n
	irq\n:
		pushq $0
		pushq $\n
		jmp irq_stub
.endm

isr 0
isr 1
isr 2
isr 3
isr 4
isr 5
isr 6
isr 7
isr_err 8
isr 9
isr_err 10
isr_err 11
isr_err 12
isr_err 13
isr_err 14
isr 15
isr 16
isr_err 17
isr 18
isr 19
isr 20
isr 21
isr 22
isr 23
isr 24
isr 25
isr 26
isr 27
isr 28
isr 29
isr 30
isr 31

.irp i,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, \
        10, 11, 12, 13, 14, 15, 16, 17, 18, 19, \
        20, 21, 22, 23, 24, 25, 26, 27, 28, 29, \
        30, 31, 32, 33, 34, 35, 36, 37, 38, 39, \
        40, 41, 42, 43, 44, 45, 46, 47, 48, 49, \
        50, 51, 52, 53, 54, 55, 56, 57, 58, 59, \
        60, 61, 62, 63, 64, 65, 66, 67, 68, 69, \
        70, 71, 72, 73, 74, 75, 76, 77, 78, 79, \
        80, 81, 82, 83, 84, 85, 86, 87, 88, 89, \
        90, 91, 92, 93, 94, 95, 96, 97, 98, 99, \
       100,101,102,103,104,105,106,107,108,109, \
       110,111,112,113,114,115,116,117,118,119, \
       120,121,122,123,124,125,126,127,128,129, \
       130,131,132,133,134,135,136,137,138,139, \
       140,141,142,143,144,145,146,147,148,149, \
       150,151,152,153,154,155,156,157,158,159, \
       160,161,162,163,164,165,166,167,168,169, \
       170,171,172,173,174,175,176,177,178,179, \
       180,181,182,183,184,185,186,187,188,189, \
       190,191,192,193,194,195,196,197,198,199, \
       200,201,202,203,204,205,206,207
	irq \i
.endr
