Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
triazo
/
kernel
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
3
Merge Requests
0
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
8ca1326f
authored
Sep 29, 2015
by
malcolm
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
moved installs to c files
parent
b9a5b815
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
34 deletions
src/dt.asm
src/gdt.c
src/idt.c
src/dt.asm
deleted
100644 → 0
View file @
b9a5b815
section
.
text
global
idt_install
idt_install
:
mov
eax
,
[
esp
+
4
]
lidt
[eax]
ret
global
gdt_install
gdt_install
:
mov
eax
,
[
esp
+
4
]
lgdt
[eax]
ret
src/gdt.c
View file @
8ca1326f
#include "gdt.h"
#include "gdt.h"
#include "string.h"
#include "string.h"
typedef
struct
{
uint16_t
limit
;
uint32_t
base
;
}
__attribute__
((
packed
))
gdtr
;
static
gdt_desc
_gdt
[
MAX_GDT_DESC
]
;
uint16_t
gdt_limit
;
static
gdtr
_gdtr
;
uint32_t
gdt_base
;
extern
void
gdt_install
(
gdtr
_gdtr
)
;
static
gdt_desc
_gdt
[
MAX_GDT_DESC
]
;
void
gdt_set_desc
(
uint32_t
i
,
uint64_t
base
,
uint64_t
limit
,
uint8_t
access
,
uint8_t
gran
)
static
void
gdt_install
(){
{
struct
{
uint16_t
limit
;
uint32_t
base
;
}
__attribute__
((
packed
))
gdtr
;
gdtr
.
limit
=
gdt_limit
;
gdtr
.
base
=
gdt_base
;
asm
volatile
(
"lgdt (%0)"
:
:
"r"
(
&
gdtr
));
}
void
gdt_set_desc
(
uint32_t
i
,
uint64_t
base
,
uint64_t
limit
,
uint8_t
access
,
uint8_t
gran
){
if
(
i
>
MAX_GDT_DESC
)
if
(
i
>
MAX_GDT_DESC
)
return
;
return
;
memset
((
void
*
)
&
_gdt
[
i
],
0
,
sizeof
(
gdt_desc
));
memset
((
void
*
)
&
_gdt
[
i
],
0
,
sizeof
(
gdt_desc
));
...
@@ -32,14 +36,14 @@ gdt_desc* gdt_get_desc (int i) {
...
@@ -32,14 +36,14 @@ gdt_desc* gdt_get_desc (int i) {
return
&
_gdt
[
i
];
return
&
_gdt
[
i
];
}
}
int
gdt_init
()
{
int
gdt_init
()
{
_gdtr
.
limit
=
(
sizeof
(
gdt_desc
)
*
MAX_GDT_DESC
)
-
1
;
gdt_
limit
=
(
sizeof
(
gdt_desc
)
*
MAX_GDT_DESC
)
-
1
;
_gdtr
.
base
=
(
uint32_t
)
&
_gdt
[
0
];
gdt_
base
=
(
uint32_t
)
&
_gdt
[
0
];
//null
//null
gdt_set_desc
(
0
,
0
,
0
,
0
,
0
);
gdt_set_desc
(
0
,
0
,
0
,
0
,
0
);
//code
//code
gdt_set_desc
(
1
,
0
,
0xffffffff
,
GDT_RW
|
GDT_EXE
|
GDT_CDT
|
GDT_MEM
,
GDT_GR_PG
|
GDT_GR_32
|
GDT_GR_HI
);
gdt_set_desc
(
1
,
0
,
0xffffffff
,
GDT_RW
|
GDT_EXE
|
GDT_CDT
|
GDT_MEM
,
GDT_GR_PG
|
GDT_GR_32
|
GDT_GR_HI
);
//data
//data
gdt_set_desc
(
2
,
0
,
0xffffffff
,
GDT_RW
|
GDT_CDT
|
GDT_MEM
,
GDT_GR_PG
|
GDT_GR_32
|
GDT_GR_HI
);
gdt_set_desc
(
2
,
0
,
0xffffffff
,
GDT_RW
|
GDT_CDT
|
GDT_MEM
,
GDT_GR_PG
|
GDT_GR_32
|
GDT_GR_HI
);
gdt_install
(
_gdtr
);
gdt_install
(
);
return
0
;
return
0
;
}
}
src/idt.c
View file @
8ca1326f
#include "idt.h"
#include "idt.h"
#include "string.h"
#include "string.h"
typedef
struct
{
#include "serial.h"
uint16_t
limit
;
uint32_t
base
;
uint16_t
idt_limit
;
}
__attribute__
((
packed
))
idtr
;
uint32_t
idt_base
;
static
idt_desc
_idt
[
MAX_IDT_INT
];
static
idt_desc
_idt
[
MAX_IDT_INT
];
static
idtr
_idtr
;
extern
void
idt_install
(
idtr
_idtr
);
static
void
idt_install
(){
struct
{
uint16_t
limit
;
uint32_t
base
;
}
__attribute__
((
packed
))
idtr
;
idtr
.
limit
=
idt_limit
;
idtr
.
base
=
idt_base
;
asm
volatile
(
"lidt (%0)"
:
:
"r"
(
&
idtr
));
}
static
void
default_handler
()
{
static
void
default_handler
()
{
//DEBUG OUTPUT MAYBE?
//DEBUG OUTPUT MAYBE?
serial_writestring
(
"int caught
\n
"
);
for
(;;);
for
(;;);
}
}
...
@@ -24,7 +33,7 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
...
@@ -24,7 +33,7 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
return
0
;
return
0
;
if
(
!
irq
)
if
(
!
irq
)
return
0
;
return
0
;
uint64_t
uiBase
=
(
uint
64_t
)
&
(
*
irq
);
uint64_t
uiBase
=
(
uint
ptr_t
)(
&
(
*
irq
)
);
_idt
[
i
].
low_base
=
(
uint16_t
)(
uiBase
&
0xffff
);
_idt
[
i
].
low_base
=
(
uint16_t
)(
uiBase
&
0xffff
);
_idt
[
i
].
high_base
=
(
uint16_t
)((
uiBase
>>
16
)
&
0xffff
);
_idt
[
i
].
high_base
=
(
uint16_t
)((
uiBase
>>
16
)
&
0xffff
);
_idt
[
i
].
reserved
=
0
;
_idt
[
i
].
reserved
=
0
;
...
@@ -33,11 +42,11 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
...
@@ -33,11 +42,11 @@ int install_ir (uint32_t i, uint16_t flags, uint16_t code_sel, IRQ_HANDLER irq)
return
0
;
return
0
;
}
}
int
idt_init
(
uint16_t
code_sel
)
{
int
idt_init
(
uint16_t
code_sel
)
{
_idtr
.
limit
=
sizeof
(
idt_desc
)
*
MAX_IDT_INT
-
1
;
idt_
limit
=
sizeof
(
idt_desc
)
*
MAX_IDT_INT
-
1
;
_idtr
.
base
=
(
uint32_t
)
&
_idt
[
0
];
idt_
base
=
(
uint32_t
)
&
_idt
[
0
];
memset
((
void
*
)
&
_idt
[
0
],
0
,
sizeof
(
idt_desc
)
*
MAX_IDT_INT
-
1
);
memset
((
void
*
)
&
_idt
[
0
],
0
,
sizeof
(
idt_desc
)
*
MAX_IDT_INT
-
1
);
for
(
int
i
=
0
;
i
<
MAX_IDT_INT
;
i
++
)
for
(
int
i
=
0
;
i
<
MAX_IDT_INT
;
i
++
)
install_ir
(
i
,
IDT_PR
|
IDT_32
,
code_sel
,(
IRQ_HANDLER
)
default_handler
);
install_ir
(
i
,
IDT_PR
|
IDT_32
,
code_sel
,(
IRQ_HANDLER
)
default_handler
);
idt_install
(
_idtr
);
idt_install
();
return
0
;
return
0
;
}
}
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