On Wed, Dec 08, 2010 at 06:00:04PM +0100, Andreas H. wrote:
Hi,
as part of a small exercise project for university I have to add a custom software interrupt to the bios code which is then used by some later booting stages. I already had a close look to the sourcefiles and although I don't understand many of the stuff (I can read and understand the individual parts but don't get the real big picture) I have some anchorpoints which I think are necessary to complete my work. I'd really appreciate if someone had a quick look on those points and just confirmed or denied (maybe with other hints) them :)
1.) the IVT is set up in "post.c", to add my interrupt, I have to add a line "SET_IVT(0x60, FUNC16(entry_60));" to init_ivt()
Yes.
2.) romlayout.S contains the declarations for the IRQ handler, I have to add a "DECL_IRQ_ENTRY_ARG 60" to the section "irqentryarg:"
Anywhere in romlayout.S. ("irqentryarg:" is a goto label, not a section definition.)
3.) in my own .c-file I have to add a function "void VISIBLE16 handle_60(struct bregs *regs)" which receives the IRQ
Yes.
4.) in this custom function I receive the set parameters from the caller in the register-structure and also set my return values in this
Yes.
5.) usable registers for arguments/return values are AX, BX, CX, DX, DS, etc. I'd need DS:DX (analog to DOS) for passing a memory address and CS:CX for a buffer size.
You can read/set any registers in "struct bregs" - whatever your handler needs.
6.) the IRQ handler has to end with "set_success(regs);" or "set_invalid(regs);" to return success/failure in CF (or should I use AX for this and just call set_success?)
What to return is up to you. The set_success/set_invalid calls are just wrappers around manipulating CF in the "struct bregs".
One last question: I chose IRQ 60 because it's stated as "user defined" in "post.c". Should I use another one to not run into issues with later stages of OS booting or will it just get overwritten at some point?
It's really hard to say what's appropriate - the best I can do is point you to Ralph Brown's Interrupt list:
http://www.cs.cmu.edu/~ralf/files.html
-Kevin