3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #define M_PIC 0x20 /* I/O for master PIC */
27 #define M_IMR 0x21 /* I/O for master IMR */
28 #define S_PIC 0xA0 /* I/O for slave PIC */
29 #define S_IMR 0xA1 /* I/O for slace IMR */
31 #define EOI 0x20 /* EOI command */
33 #define ICW1 0x11 /* Cascade, Edge triggered */
35 /* ICW3 is slave bitmap or number */
36 #define ICW4 0x01 /* 8088 mode */
38 #define M_VEC 0x68 /* Vector for master */
39 #define S_VEC 0x70 /* Vector for slave */
41 #define OCW3_IRR 0x0A /* Read IRR */
42 #define OCW3_ISR 0x0B /* Read ISR */
47 #define inw(port) ({ \
49 __asm__ volatile ("inw %%dx, %%ax":"=a" (_v):"dN" (port)); \
53 /*#define outw(value, port) \
54 __asm__ ("outw %%ax, %%dx"::"a" (value),"dN" (port))*/
56 #define outb_p(value, port) \
57 __asm__ ("outb %%al, %%dx\n" \
60 "1:"::"a" (value),"d" (port))
62 #define outw_p(value,port) \
63 __asm__ ("outw %%ax,%%dx\n" \
66 "1:"::"a" (value),"dN" (port))
68 #define inb_p(port) ({ \
70 __asm__ volatile ("inb %%dx,%%al\n" \
73 "1:":"=a" (_v):"d" (port)); \
78 /* This defines what the stack looks like after an ISR was running */
81 unsigned int ds
, es
, fs
, gs
;
82 unsigned int edi
, esi
, ebp
, esp
, ebx
, edx
, ecx
, eax
;
83 unsigned int int_no
, err_code
;
84 unsigned int eip
, cs
, eflags
, useresp
, ss
;
87 /* registers pushed on the stack by exceptions or interrupts that
88 switch from user privilege to kernel privilege
90 The layout of this struct must agree with the order in which
91 registers are pushed and popped in the assembly-language
92 interrupt handler code. */
95 unsigned edi
, esi
, ebp
, esp
, ebx
, edx
, ecx
, eax
; /* PUSHA/POP */
96 unsigned ds
, es
, fs
, gs
;
97 unsigned which_int
, err_code
;
98 unsigned eip
, cs
, eflags
, user_esp
, user_ss
; /* INT nn/IRET */
99 unsigned v_es
, v_ds
, v_fs
, v_gs
; /* V86 mode only */
102 #define _set_gate(gate_addr, type, dpl, addr) \
103 __asm__ ("movw %%dx,%%ax\n\t" \
105 "movl %%eax,%1\n\t" \
108 : "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
109 "o" (*((char *) (gate_addr))), \
110 "o" (*(4+(char *) (gate_addr))), \
111 "d" ((char *) (addr)),"a" (0x00080000))
113 void dma_xfer (unsigned char channel
, unsigned long address
, unsigned int length
, unsigned char read
);
115 void enable_irq (unsigned short irq_num
);
116 void disable_irq (unsigned short irq_num
);
118 extern void outb (unsigned port
, unsigned val
);
120 extern void init_v86_regs(uregs_t
*regs
);
121 extern void do_v86_int(uregs_t
*regs
, unsigned int_num
);
124 extern void gdt_set_gate (int num
, unsigned long base
, unsigned long limit
, unsigned char access
, unsigned char gran
);
125 extern unsigned int gdt_install ();
128 extern void idt_set_gate (unsigned char num
, unsigned long base
, unsigned short sel
, unsigned char flags
);
129 extern unsigned int idt_install ();
132 extern unsigned int isrs_install ();
135 extern void irq_install_handler (int irq
, void (*handler
)(struct regs
*r
));
136 extern void irq_uninstall_handler (int irq
);
137 extern unsigned int irq_install ();
140 extern void timer_wait (int ticks
);
141 extern unsigned int timer_install ();