Save/restore %ebp on irq entry.
Support saving and restoring %ebp on call16.
Enable display of %ebp in register dumps.
OFFSET(BREGS_ebx, bregs, ebx);
OFFSET(BREGS_ecx, bregs, ecx);
OFFSET(BREGS_edx, bregs, edx);
+ OFFSET(BREGS_ebp, bregs, ebp);
OFFSET(BREGS_esi, bregs, esi);
OFFSET(BREGS_edi, bregs, edi);
OFFSET(BREGS_flags, bregs, flags);
u16 es;
UREG(edi, di, di_hi, di_lo);
UREG(esi, si, si_hi, si_lo);
+ UREG(ebp, bp, bp_hi, bp_lo);
UREG(ebx, bx, bh, bl);
UREG(edx, dx, dh, dl);
UREG(ecx, cx, ch, cl);
pushl %ecx
pushl %edx
pushl %ebx
+ pushl %ebp
pushl %esi
pushl %edi
pushw %es
popw %es
popl %edi
popl %esi
+ popl %ebp
popl %ebx
popl %edx
popl %ecx
pushl %ecx
pushl %edx
pushl %ebx
+ pushl %ebp
pushl %esi
pushl %edi
pushw %es
movw %cx, %ds
movl %esp, %ebx // Backup %esp, then zero high bits
movzwl %sp, %esp
- movl 24(%esp), %ecx // Get calling function
- movl %eax, 24(%esp) // Save %eax
+ movl 28(%esp), %ecx // Get calling function
+ movl %eax, 28(%esp) // Save %eax
movl %esp, %eax // First arg is pointer to struct bregs
calll *%ecx
movl %ebx, %esp // Restore %esp (including high bits)
popw %es
popl %edi
popl %esi
+ popl %ebp
popl %ebx
popl %edx
popl %ecx
pushl %ecx
pushl %edx
pushl %ebx
+ pushl %ebp
pushl %esi
pushl %edi
pushw %es
popw %es
popl %edi
popl %esi
+ popl %ebp
popl %ebx
popl %edx
popl %ecx
dprintf(1, " NULL\n");
return;
}
- dprintf(1, " a=%08x b=%08x c=%08x d=%08x si=%08x di=%08x\n"
+ dprintf(1, " a=%08x b=%08x c=%08x d=%08x ds=%04x es=%04x ss=%04x\n"
, regs->eax, regs->ebx, regs->ecx, regs->edx
- , regs->esi, regs->edi);
- dprintf(1, " ds=%08x es=%08x ip=%08x cs=%08x f=%08x r=%08x\n"
- , regs->ds, regs->es, regs->ip, regs->cs, regs->flags, (u32)regs);
+ , regs->ds, regs->es, GET_SEG(SS));
+ dprintf(1, " si=%08x di=%08x bp=%08x r=%08x cs=%04x ip=%04x f=%04x\n"
+ , regs->esi, regs->edi, regs->ebp, (u32)regs
+ , regs->cs, regs->ip, regs->flags);
}
// Report entry to an Interrupt Service Routine (ISR).
// Load calling registers.
movl BREGS_edi(%eax), %edi
movl BREGS_esi(%eax), %esi
+ movl BREGS_ebp(%eax), %ebp
movl BREGS_ebx(%eax), %ebx
movl BREGS_edx(%eax), %edx
movl BREGS_ecx(%eax), %ecx
movw %es, BREGS_es(%eax)
movl %edi, BREGS_edi(%eax)
movl %esi, BREGS_esi(%eax)
+ movl %ebp, BREGS_ebp(%eax)
movl %ebx, BREGS_ebx(%eax)
movl %edx, BREGS_edx(%eax)