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() 2.) romlayout.S contains the declarations for the IRQ handler, I have to add a "DECL_IRQ_ENTRY_ARG 60" to the section "irqentryarg:" 3.) in my own .c-file I have to add a function "void VISIBLE16 handle_60(struct bregs *regs)" which receives the IRQ 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 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. 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?)
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?
Thanks in advance, Kosi
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