#ifndef __TL__KRNL_H
#define __TL__KRNL_H
//#ifdef __cplusplus
//extern "C"
//{
//#endif
#include <setjmp.h> /* jmp_buf */
#define MAX_VC 12 /* maximum number of virtual terminals */
/**
* CPU error codes
*/
#define _K_CPU_DBZ 0 /* Divide by zero */
#define _K_CPU_SS 1 /* Single Step */
#define _K_CPU_NMI 2 /* Non-maskable (NMI) */
#define _K_CPU_BPX 3 /* Breakpoint */
#define _K_CPU_OFT 4 /* Overflow trap */
#define _K_CPU_BND 5 /* BOUND range exceeded */
#define _K_CPU_IOP 6 /* Invalid opcode */
#define _K_CPU_CNA 7 /* Coprocessor not available */
#define _K_CPU_DFE 8 /* Double fault exception */
#define _K_CPU_CSO 9 /* Coprocessor segment overrun */
#define _K_CPU_CPE 10 /* Coprocessor error */
#define _K_CPU_ITS 0x0A /* Invalid task state management */
#define _K_CPU_SNP 0x0B /* Segment not present */
#define _K_CPU_SEX 0x0C /* Stack exception (or illicit sex) */
#define _K_CPU_GPF 0x0D /* General protection exception */
#define _K_CPU_PGF 0x0E /* Page fault */
/**
* Interrupt table
*/
#define _K_IRQ_TIMER 0x08 /* timer (55ms intervals, 18.21590/sec) */
#define _K_IRQ_KEYBOARD 0x09 /* keyboard service required */
#define _K_IRQ_S8259 0x0A /* slave 8259 or EGA/VGA vertical retrace */
#define _K_IRQ_COM2 0x0B /* COM2 service required (PS/2 MCA COM3-COM8) */
#define _K_IRQ_COM1 0x0C /* COM1 service required */
#define _K_IRQ_HDDREQ 0x0D /* fixed disk or data request from LPT2 */
#define _K_IRQ_FDDSERV 0x0E /* floppy disk service required */
#define _K_IRQ_LPT1REQ 0x0F /* data request from LPT1 */
#define _K_IRQ_VIDEO 0x10 /* video (int 10h) */
#define _K_IRQ_EQPDET 0x11 /* equipment determination (int 11h) */
#define _K_IRQ_MEMORY 0x12 /* memory size (int 12h) */
#define _K_IRQ_DIO 0x13 /* disk I/O service (int 13h) */
#define _K_IRQ_SERIAL 0x14 /* serial communications (int 14h) */
#define _K_IRQ_SYSTEM 0x15 /* system services, cassette (int 15h) */
#define _K_IRQ_KBDSERV 0x16 /* keyboard services (int 16h) */
#define _K_IRQ_LPT 0x17 /* parallel printer (int 17h) */
#define _K_IRQ_ROM 0x18 /* ROM BASIC loader */
#define _K_IRQ_BTSTRAP 0x19 /* bootstrap loader (unreliable, int 19h) */
#define _K_IRQ_TOD 0x1A /* time of day (int 1A) */
#define _K_IRQ_CBREAK 0x1B /* user defined ctrl-break handler (int 1B) */
#define _K_IRQ_TICK 0x1C /* user defined clock tick handler (int 1C) */
#define _K_IRQ_VIDEOP 0x1D /* 6845 video parameter pointer */
#define _K_IRQ_DISKPARAM 0x1E /* diskette parameter pointer (base table) */
#define _K_IRQ_GCHTBL 0x1F /* graphics character table */
#define _K_IRQ_HDD 0x40 /* hard disk */
#define _K_IRQ_FIXEDD0 0x41 /* fixed disk 0 parameters pointer (int 13h, int 9h) */
#define _K_IRQ_RELVID 0x42 /* relocated video handler (EGA/VGA/PS) */
#define _K_IRQ_UFT 0x43 /* user font table (EGA/VGA/PS) */
#define _K_IRQ_GRAPH 0x44 /* first 128 graphics characters (also Netware) */
#define _K_IRQ_FIXED1 0x46 /* fixed disk 1 parameters ptr (int 13h, int 9h/int 41h) */
#define _K_IRQ_PCJR 0x48 /* PCjr cordless keyboard translation */
#define _K_IRQ_PCJRSCAN 0x49 /* PCjr non-keyboard scancode translation table */
#define _K_IRQ_USERALARM 0x4A /* user alarm (int 4A) */
#define _K_IRQ_PALARM 0x50 /* periodic alarm timer (PS/2) */
#define _K_IRQ_GSS 0x59 /* GSS computer graphics interface */
#define _K_IRQ_BIOSEP 0x5A /* cluster adapter BIOS entry point */
#define _K_IRQ_CADAPBT 0x5B /* cluster adapter boot */
#define _K_IRQ_NETBIOS 0x5C /* NETBIOS interface, TOPS interface */
#define _K_IRQ_EMS 0x67 /* LIM/EMS specifications (int 67h) */
#define _K_IRQ_APPC 0x68 /* APPC */
#define _K_IRQ_RTC 0x70 /* real time clock (int 15h) */
#define _K_IRQ_REDIRIRQ2 0x71 /* software redirected to IRQ2 */
#define _K_IRQ_MOUSE 0x74 /* mouse interrupt */
#define _K_IRQ_HDC 0x76 /* fixed disk controller */
/* the code for setvect() and getvect() in
KSTART.ASM depends on the layout of this structure */
typedef struct
{
unsigned access_byte, eip;
} vector_t;
/* the layout of this structure must match the order of registers
pushed and popped by the exception handlers in KSTART.ASM */
typedef struct
{
/* pushed by pusha */
unsigned edi, esi, ebp, esp, ebx, edx, ecx, eax;
/* pushed separately */
unsigned ds, es, fs, gs;
unsigned which_int, err_code;
/* pushed by exception. Exception may also push err_code.
user_esp and user_ss are pushed only if a privilege change occurs. */
unsigned eip, cs, eflags, user_esp, user_ss;
} regs_t;
typedef struct /* circular queue */
{
unsigned char *data;
unsigned size, in_base, in_ptr/*, out_base*/, out_ptr;
} queue_t;
typedef struct
{
/* virtual console input */
queue_t keystrokes;
/* virtual console output */
unsigned esc, attrib, csr_x, csr_y, esc1, esc2, esc3;
unsigned short *fb_adr;
} console_t;
typedef struct
{
console_t *vc;
jmp_buf state;
enum
{
TS_RUNNABLE = 1, TS_BLOCKED = 2, TS_ZOMBIE = 3
} status;
} task_t;
#ifdef __cplusplus
}
#endif
#endif