81 lines
1.8 KiB
C
81 lines
1.8 KiB
C
// Structure layout of cpu registers that the bios uses.
|
|
//
|
|
// Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
|
|
//
|
|
// This file may be distributed under the terms of the GNU LGPLv3 license.
|
|
|
|
#ifndef __BREGS_H
|
|
#define __BREGS_H
|
|
|
|
#include "types.h" // u16
|
|
#include "x86.h" // F_CF
|
|
|
|
|
|
/****************************************************************
|
|
* Registers saved/restored in romlayout.S
|
|
****************************************************************/
|
|
|
|
#define UREG(ER, R, RH, RL) union { u32 ER; struct { u16 R; u16 R ## _hi; }; struct { u8 RL; u8 RH; u8 R ## _hilo; u8 R ## _hihi; }; }
|
|
|
|
// Layout of registers passed in to irq handlers. Note that this
|
|
// layout corresponds to code in romlayout.S - don't change it here
|
|
// without also updating the assembler code.
|
|
struct bregs {
|
|
u16 ds;
|
|
u16 es;
|
|
UREG(edi, di, di8u, di8l);
|
|
UREG(esi, si, si8u, si8l);
|
|
UREG(ebp, bp, bp8u, bp8l);
|
|
UREG(ebx, bx, bh, bl);
|
|
UREG(edx, dx, dh, dl);
|
|
UREG(ecx, cx, ch, cl);
|
|
UREG(eax, ax, ah, al);
|
|
struct segoff_s code;
|
|
u16 flags;
|
|
} PACKED;
|
|
|
|
|
|
/****************************************************************
|
|
* Helper functions
|
|
****************************************************************/
|
|
|
|
static inline void
|
|
set_cf(struct bregs *regs, int cond)
|
|
{
|
|
if (cond)
|
|
regs->flags |= F_CF;
|
|
else
|
|
regs->flags &= ~F_CF;
|
|
}
|
|
|
|
// Frequently used return codes
|
|
#define RET_EUNSUPPORTED 0x86
|
|
|
|
static inline void
|
|
set_success(struct bregs *regs)
|
|
{
|
|
set_cf(regs, 0);
|
|
}
|
|
|
|
static inline void
|
|
set_code_success(struct bregs *regs)
|
|
{
|
|
regs->ah = 0;
|
|
set_cf(regs, 0);
|
|
}
|
|
|
|
static inline void
|
|
set_invalid_silent(struct bregs *regs)
|
|
{
|
|
set_cf(regs, 1);
|
|
}
|
|
|
|
static inline void
|
|
set_code_invalid_silent(struct bregs *regs, u8 code)
|
|
{
|
|
regs->ah = code;
|
|
set_cf(regs, 1);
|
|
}
|
|
|
|
#endif // bregs.h
|