Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Julian Nahuel Vidal
orga2 grupo5 parte1
Commits
e8f39cce
Commit
e8f39cce
authored
3 years ago
by
Santiago Orfanos
Browse files
Options
Download
Email Patches
Plain Diff
tp5 listo
parent
bf0d7c51
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
0 additions
and
262 deletions
+0
-262
TP5/solucion/idt.c
TP5/solucion/idt.c
+0
-262
No files found.
TP5/solucion/idt.c
deleted
100644 → 0
View file @
bf0d7c51
/* ** por compatibilidad se omiten tildes **
================================================================================
TALLER System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
================================================================================
definicion de las rutinas de atencion de interrupciones
*/
#include "idt.h"
#include "defines.h"
#include "i386.h"
#include "isr.h"
#include "screen.h"
idt_entry_t
idt
[
255
]
=
{
0
};
idt_descriptor_t
IDT_DESC
=
{
sizeof
(
idt
)
-
1
,
(
uint32_t
)
&
idt
};
/* Dada una expresion que resulta en un numero de 32 bits construye una que
* solo incluye sus 16bits menos significativos */
#define LOW_16_BITS(v) ((uint32_t)(v) & 0xFFFF)
/* Dada una expresion que resulta en un numero de 32 bits construye una que
* solo incluye sus 16bits mas significativos */
#define HIGH_16_BITS(v) ((uint32_t)(v) >> 16 & 0xFFFF)
/*
La siguiente es una macro de EJEMPLO para ayudar a armar entradas de
interrupciones. Para usar, completar CORRECTAMENTE los atributos
(en defines.h) y el registro de segmento (ver defines.h). Invocarla
desde idt_init() de la siguiene manera:
void idt_init() {
IDT_ENTRY0(0);
...
IDT_ENTRY0(19);
...
}
*/
/* COMPLETAR: Dado un numero de de interrupcion asigna a `idt` la entrada
* correspondiente con nivel 0 */
#define IDT_ENTRY0(numero) \
idt[numero] = (idt_entry_t) { \
.offset_31_16 = HIGH_16_BITS(&_isr##numero), \
.offset_15_0 = LOW_16_BITS(&_isr##numero), \
.segsel = GDT_CODE_0_SEL, \
.type = 0xe, \
.dpl = 0x0, \
.present = 0x1, \
}
/* COMPLETAR: Dado un numero de de interrupcion asigna a `idt` la entrada
* correspondiente con nivel 3 */
#define IDT_ENTRY3(numero) \
idt[numero] = (idt_entry_t) { \
.offset_31_16 = HIGH_16_BITS(&_isr##numero), \
.offset_15_0 = LOW_16_BITS(&_isr##numero), \
.segsel = GDT_CODE_3_SEL, \
.type = 0Xe, \
.dpl = 0x3, \
.present = 0x1, \
}
void
idt_init
()
{
// Excepciones
IDT_ENTRY0
(
0
);
IDT_ENTRY0
(
1
);
IDT_ENTRY0
(
2
);
IDT_ENTRY0
(
3
);
IDT_ENTRY0
(
4
);
IDT_ENTRY0
(
5
);
IDT_ENTRY0
(
6
);
IDT_ENTRY0
(
7
);
IDT_ENTRY0
(
8
);
IDT_ENTRY0
(
9
);
IDT_ENTRY0
(
10
);
IDT_ENTRY0
(
11
);
IDT_ENTRY0
(
12
);
IDT_ENTRY0
(
13
);
IDT_ENTRY0
(
14
);
IDT_ENTRY0
(
15
);
IDT_ENTRY0
(
16
);
IDT_ENTRY0
(
17
);
IDT_ENTRY0
(
18
);
IDT_ENTRY0
(
19
);
IDT_ENTRY0
(
20
);
IDT_ENTRY0
(
32
);
IDT_ENTRY0
(
33
);
IDT_ENTRY3
(
88
);
IDT_ENTRY3
(
98
);
}
const
char
*
code2exception
[]
=
{
"Divide Error #DE [0]"
,
"Debug #DB [1]"
,
"NMI Interrupt [2]"
,
"Breakpoint #BP [3]"
,
"Overflow #OF [4]"
,
"BOUND Range Exceeded #BR [5]"
,
"Invalid Opcode #UD [6]"
,
"Device Not Available #NM [7]"
,
"Double Fault (#DF) [8]"
,
"Coprocessor Segment Overrun [9]"
,
"Invalid TSS (#TS) [10]"
,
"Segment Not Present (#NP) [11]"
,
"Stack Fault (#SS) [12]"
,
"General Protection (#GP) [13]"
,
"Page-Fault (#PF) [14]"
,
"RESERVED [15]"
,
"Floating-Point Error (#MF) [16]"
,
"Alignment Check (#AC) [17]"
,
"Machine-Check (#MC) [18]"
,
"SIMD Floating-Point (#XM) [19]"
,
"Virtualization (#VE) [20]"
,
"Control Protection (#CP) [21]"
};
typedef
struct
error_frame_t
{
uint32_t
exception_number
;
uint32_t
error_code
;
uint32_t
eip
;
uint32_t
cs
;
uint32_t
eflags
;
uint32_t
esp
;
uint32_t
ss
;
}
error_frame
;
typedef
struct
kernel_error_frame_t
{
uint32_t
exception_number
;
uint32_t
error_code
;
uint32_t
eip
;
uint32_t
cs
;
uint32_t
eflags
;
}
kernel_error_frame
;
typedef
struct
general_regs_t
{
uint32_t
edi
;
uint32_t
esi
;
uint32_t
ebp
;
uint32_t
esp
;
uint32_t
ebx
;
uint32_t
edx
;
uint32_t
ecx
;
uint32_t
eax
;
}
general_regs
;
typedef
struct
segment_regs_t
{
uint32_t
cs
;
uint32_t
ds
;
uint32_t
es
;
uint32_t
fs
;
uint32_t
gs
;
uint32_t
ss
;
}
segment_regs
;
typedef
struct
control_regs_t
{
uint32_t
cr0
;
uint32_t
cr2
;
uint32_t
cr3
;
uint32_t
cr4
;
}
control_regs
;
#define GREGS_NAMES_START_COL 21
#define EFLAGS_NAME_START_COL 21
#define CREGS_NAMES_START_COL 46
#define GREGS_START_COL 25
#define EFLAGS_START_COL 28
#define CREGS_START_COL 50
#define STACK_START_COL 40
static
void
print_exception_template
(
void
)
{
screen_draw_box
(
1
,
19
,
40
,
40
,
0x0
,
0x0
);
print
(
"eax"
,
GREGS_NAMES_START_COL
,
6
,
0x0F
);
print
(
"ebx"
,
GREGS_NAMES_START_COL
,
8
,
0x0F
);
print
(
"ecx"
,
GREGS_NAMES_START_COL
,
10
,
0x0F
);
print
(
"edx"
,
GREGS_NAMES_START_COL
,
12
,
0x0F
);
print
(
"esi"
,
GREGS_NAMES_START_COL
,
14
,
0x0F
);
print
(
"edi"
,
GREGS_NAMES_START_COL
,
16
,
0x0F
);
print
(
"ebp"
,
GREGS_NAMES_START_COL
,
18
,
0x0F
);
print
(
"esp"
,
GREGS_NAMES_START_COL
,
20
,
0x0F
);
print
(
"eip"
,
GREGS_NAMES_START_COL
,
22
,
0x0F
);
print
(
" cs"
,
GREGS_NAMES_START_COL
,
24
,
0x0F
);
print
(
" ds"
,
GREGS_NAMES_START_COL
,
26
,
0x0F
);
print
(
" es"
,
GREGS_NAMES_START_COL
,
28
,
0x0F
);
print
(
" fs"
,
GREGS_NAMES_START_COL
,
30
,
0x0F
);
print
(
" gs"
,
GREGS_NAMES_START_COL
,
32
,
0x0F
);
print
(
" ss"
,
GREGS_NAMES_START_COL
,
34
,
0x0F
);
print
(
"eflags"
,
EFLAGS_NAME_START_COL
,
37
,
0x0F
);
print
(
"cr0"
,
CREGS_NAMES_START_COL
,
7
,
0x0F
);
print
(
"cr2"
,
CREGS_NAMES_START_COL
,
9
,
0x0F
);
print
(
"cr3"
,
CREGS_NAMES_START_COL
,
11
,
0x0F
);
print
(
"cr4"
,
CREGS_NAMES_START_COL
,
13
,
0x0F
);
print
(
"err"
,
CREGS_NAMES_START_COL
,
15
,
0x0F
);
print
(
"stack"
,
STACK_START_COL
,
19
,
0x0F
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
6
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
8
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
10
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
12
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
14
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
16
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
18
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
20
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
22
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
24
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
26
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
28
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
30
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
32
,
0x0A
);
print_hex
(
0
,
8
,
GREGS_START_COL
,
34
,
0x0A
);
print_hex
(
0
,
8
,
EFLAGS_START_COL
,
37
,
0x0A
);
print_hex
(
0
,
8
,
CREGS_START_COL
,
7
,
0x0A
);
print_hex
(
0
,
8
,
CREGS_START_COL
,
9
,
0x0A
);
print_hex
(
0
,
8
,
CREGS_START_COL
,
11
,
0x0A
);
print_hex
(
0
,
8
,
CREGS_START_COL
,
13
,
0x0A
);
print_hex
(
0
,
8
,
CREGS_START_COL
,
15
,
0x0A
);
}
static
void
print_regs
(
general_regs
*
gregs
,
segment_regs
*
sregs
,
control_regs
*
cregs
,
uint32_t
eip
,
uint32_t
eflags
,
uint32_t
error_code
)
{
print_hex
(
gregs
->
eax
,
8
,
GREGS_START_COL
,
6
,
0x0A
);
print_hex
(
gregs
->
ebx
,
8
,
GREGS_START_COL
,
8
,
0x0A
);
print_hex
(
gregs
->
ecx
,
8
,
GREGS_START_COL
,
10
,
0x0A
);
print_hex
(
gregs
->
edx
,
8
,
GREGS_START_COL
,
12
,
0x0A
);
print_hex
(
gregs
->
esi
,
8
,
GREGS_START_COL
,
14
,
0x0A
);
print_hex
(
gregs
->
edi
,
8
,
GREGS_START_COL
,
16
,
0x0A
);
print_hex
(
gregs
->
ebp
,
8
,
GREGS_START_COL
,
18
,
0x0A
);
print_hex
(
gregs
->
esp
,
8
,
GREGS_START_COL
,
20
,
0x0A
);
print_hex
(
eip
,
8
,
GREGS_START_COL
,
22
,
0x0A
);
print_hex
(
sregs
->
cs
,
8
,
GREGS_START_COL
,
24
,
0x0A
);
print_hex
(
sregs
->
ds
,
8
,
GREGS_START_COL
,
26
,
0x0A
);
print_hex
(
sregs
->
es
,
8
,
GREGS_START_COL
,
28
,
0x0A
);
print_hex
(
sregs
->
fs
,
8
,
GREGS_START_COL
,
30
,
0x0A
);
print_hex
(
sregs
->
gs
,
8
,
GREGS_START_COL
,
32
,
0x0A
);
print_hex
(
sregs
->
ss
,
8
,
GREGS_START_COL
,
34
,
0x0A
);
print_hex
(
eflags
,
8
,
EFLAGS_START_COL
,
37
,
0x0A
);
print_hex
(
cregs
->
cr0
,
8
,
CREGS_START_COL
,
7
,
0x0A
);
print_hex
(
cregs
->
cr2
,
8
,
CREGS_START_COL
,
9
,
0x0A
);
print_hex
(
cregs
->
cr3
,
8
,
CREGS_START_COL
,
11
,
0x0A
);
print_hex
(
cregs
->
cr4
,
8
,
CREGS_START_COL
,
13
,
0x0A
);
print_hex
(
error_code
,
8
,
CREGS_START_COL
,
15
,
0x0A
);
}
void
kernel_exception
(
control_regs
cregs
,
segment_regs
sregs
,
general_regs
gregs
,
kernel_error_frame
frame
)
{
//breakpoint();
print_exception_template
();
print
(
code2exception
[
frame
.
exception_number
],
20
,
2
,
0x0A
);
sregs
.
cs
=
frame
.
cs
;
print_regs
(
&
gregs
,
&
sregs
,
&
cregs
,
frame
.
eip
,
frame
.
eflags
,
frame
.
error_code
);
print_hex
(
*
((
uint32_t
*
)
gregs
.
esp
),
8
,
STACK_START_COL
,
21
,
C_BG_BLACK
|
C_FG_LIGHT_GREEN
);
print_hex
(
*
((
uint32_t
*
)
gregs
.
esp
+
1
),
8
,
STACK_START_COL
,
23
,
C_BG_BLACK
|
C_FG_LIGHT_GREEN
);
print_hex
(
*
((
uint32_t
*
)
gregs
.
esp
+
2
),
8
,
STACK_START_COL
,
25
,
C_BG_BLACK
|
C_FG_LIGHT_GREEN
);
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment