Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
redox-os
drivers
Commits
b553e1dd
Commit
b553e1dd
authored
Oct 09, 2017
by
Jeremy Soller
Committed by
GitHub
Oct 09, 2017
Browse files
Merge pull request #19 from redox-os/cap
Use capability mode (null namespace) for drivers
parents
e3a9314a
bd8a377c
Changes
11
Hide whitespace changes
Inline
Side-by-side
ahcid/src/main.rs
View file @
b553e1dd
...
...
@@ -48,6 +48,9 @@ fn main() {
let
mut
event_file
=
File
::
open
(
"event:"
)
.expect
(
"ahcid: failed to open event file"
);
let
scheme
=
DiskScheme
::
new
(
scheme_name
,
ahci
::
disks
(
address
,
&
name
));
syscall
::
setrens
(
0
,
0
)
.expect
(
"ahcid: failed to enter null namespace"
);
loop
{
let
mut
event
=
Event
::
default
();
if
event_file
.read
(
&
mut
event
)
.expect
(
"ahcid: failed to read event file"
)
==
0
{
...
...
alxd/src/main.rs
View file @
b553e1dd
...
...
@@ -41,18 +41,21 @@ fn main() {
let
socket_fd
=
syscall
::
open
(
":network"
,
syscall
::
O_RDWR
|
syscall
::
O_CREAT
|
syscall
::
O_NONBLOCK
)
.expect
(
"alxd: failed to create network scheme"
);
let
socket
=
Arc
::
new
(
RefCell
::
new
(
unsafe
{
File
::
from_raw_fd
(
socket_fd
)
}));
let
mut
irq_file
=
File
::
open
(
format!
(
"irq:{}"
,
irq
))
.expect
(
"alxd: failed to open IRQ file"
);
let
address
=
unsafe
{
syscall
::
physmap
(
bar
,
128
*
1024
,
MAP_WRITE
)
.expect
(
"alxd: failed to map address"
)
};
{
let
device
=
Arc
::
new
(
RefCell
::
new
(
unsafe
{
device
::
Alx
::
new
(
address
)
.expect
(
"alxd: failed to allocate device"
)
}));
let
mut
event_queue
=
EventQueue
::
<
usize
>
::
new
()
.expect
(
"alxd: failed to create event queue"
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"alxd: failed to enter null namespace"
);
let
todo
=
Arc
::
new
(
RefCell
::
new
(
Vec
::
<
Packet
>
::
new
()));
let
device_irq
=
device
.clone
();
let
socket_irq
=
socket
.clone
();
let
todo_irq
=
todo
.clone
();
let
mut
irq_file
=
File
::
open
(
format!
(
"irq:{}"
,
irq
))
.expect
(
"alxd: failed to open IRQ file"
);
event_queue
.add
(
irq_file
.as_raw_fd
(),
move
|
_count
:
usize
|
->
Result
<
Option
<
usize
>>
{
let
mut
irq
=
[
0
;
8
];
irq_file
.read
(
&
mut
irq
)
?
;
...
...
bgad/src/main.rs
View file @
b553e1dd
...
...
@@ -40,6 +40,9 @@ fn main() {
bga
:
bga
,
display
:
File
::
open
(
"display:input"
)
.ok
()
};
syscall
::
setrens
(
0
,
0
)
.expect
(
"bgad: failed to enter null namespace"
);
loop
{
let
mut
packet
=
Packet
::
default
();
socket
.read
(
&
mut
packet
)
.expect
(
"bgad: failed to read events from bga scheme"
);
...
...
e1000d/src/main.rs
View file @
b553e1dd
...
...
@@ -36,18 +36,21 @@ fn main() {
let
socket_fd
=
syscall
::
open
(
":network"
,
syscall
::
O_RDWR
|
syscall
::
O_CREAT
|
syscall
::
O_NONBLOCK
)
.expect
(
"e1000d: failed to create network scheme"
);
let
socket
=
Arc
::
new
(
RefCell
::
new
(
unsafe
{
File
::
from_raw_fd
(
socket_fd
)
}));
let
mut
irq_file
=
File
::
open
(
format!
(
"irq:{}"
,
irq
))
.expect
(
"e1000d: failed to open IRQ file"
);
let
address
=
unsafe
{
syscall
::
physmap
(
bar
,
128
*
1024
,
MAP_WRITE
)
.expect
(
"e1000d: failed to map address"
)
};
{
let
device
=
Arc
::
new
(
unsafe
{
device
::
Intel8254x
::
new
(
address
)
.expect
(
"e1000d: failed to allocate device"
)
});
let
mut
event_queue
=
EventQueue
::
<
usize
>
::
new
()
.expect
(
"e1000d: failed to create event queue"
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"e1000d: failed to enter null namespace"
);
let
todo
=
Arc
::
new
(
RefCell
::
new
(
Vec
::
<
Packet
>
::
new
()));
let
device_irq
=
device
.clone
();
let
socket_irq
=
socket
.clone
();
let
todo_irq
=
todo
.clone
();
let
mut
irq_file
=
File
::
open
(
format!
(
"irq:{}"
,
irq
))
.expect
(
"e1000d: failed to open IRQ file"
);
event_queue
.add
(
irq_file
.as_raw_fd
(),
move
|
_count
:
usize
|
->
Result
<
Option
<
usize
>>
{
let
mut
irq
=
[
0
;
8
];
irq_file
.read
(
&
mut
irq
)
?
;
...
...
ihdad/src/main.rs
View file @
b553e1dd
...
...
@@ -20,7 +20,7 @@ use syscall::error::EWOULDBLOCK;
pub
mod
HDA
;
use
HDA
::
IntelHDA
;
...
...
@@ -28,11 +28,11 @@ use HDA::IntelHDA;
/*
/*
VEND:PROD
Virtualbox 8086:2668
QEMU ICH9 8086:293E
82801H ICH8 8086:284B
82801H ICH8 8086:284B
*/
fn
main
()
{
...
...
@@ -47,54 +47,43 @@ fn main() {
let
irq_str
=
args
.next
()
.expect
(
"ihda: no irq provided"
);
let
irq
=
irq_str
.parse
::
<
u8
>
()
.expect
(
"ihda: failed to parse irq"
);
let
vend_str
=
args
.next
()
.expect
(
"ihda: no vendor id provided"
);
let
vend
=
usize
::
from_str_radix
(
&
vend_str
,
16
)
.expect
(
"ihda: failed to parse vendor id"
);
let
prod_str
=
args
.next
()
.expect
(
"ihda: no product id provided"
);
let
prod
=
usize
::
from_str_radix
(
&
prod_str
,
16
)
.expect
(
"ihda: failed to parse product id"
);
print!
(
"{}"
,
format!
(
" + ihda {} on: {:X} IRQ: {}
\n
"
,
name
,
bar
,
irq
));
// Daemonize
if
unsafe
{
syscall
::
clone
(
0
)
.unwrap
()
}
==
0
{
let
address
=
unsafe
{
syscall
::
physmap
(
bar
,
0x4000
,
MAP_WRITE
)
.expect
(
"ihdad: failed to map address"
)
};
{
let
mut
irq_file
=
File
::
open
(
format!
(
"irq:{}"
,
irq
))
.expect
(
"IHDA: failed to open IRQ file"
);
let
vend_prod
:
u32
=
((
vend
as
u32
)
<<
16
)
|
(
prod
as
u32
);
let
vend_prod
:
u32
=
((
vend
as
u32
)
<<
16
)
|
(
prod
as
u32
);
let
device
=
Arc
::
new
(
RefCell
::
new
(
unsafe
{
HDA
::
IntelHDA
::
new
(
address
,
vend_prod
)
.expect
(
"ihdad: failed to allocate device"
)
}));
let
socket_fd
=
syscall
::
open
(
":audio"
,
syscall
::
O_RDWR
|
syscall
::
O_CREAT
|
syscall
::
O_NONBLOCK
)
.expect
(
"IHDA: failed to create audio scheme"
);
let
socket
=
Arc
::
new
(
RefCell
::
new
(
unsafe
{
File
::
from_raw_fd
(
socket_fd
)
}));
let
mut
event_queue
=
EventQueue
::
<
usize
>
::
new
()
.expect
(
"IHDA: Could not create event queue."
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"ihdad: failed to enter null namespace"
);
let
todo
=
Arc
::
new
(
RefCell
::
new
(
Vec
::
<
Packet
>
::
new
()));
let
todo_irq
=
todo
.clone
();
let
device_irq
=
device
.clone
();
let
socket_irq
=
socket
.clone
();
let
device_loop
=
device
.clone
();
event_queue
.add
(
irq_file
.as_raw_fd
(),
move
|
_count
:
usize
|
->
Result
<
Option
<
usize
>>
{
let
mut
irq
=
[
0
;
8
];
irq_file
.read
(
&
mut
irq
)
?
;
let
_irq
=
unsafe
{
device_irq
.borrow_mut
()
.irq
()};
if
_irq
{
irq_file
.write
(
&
mut
irq
)
?
;
...
...
@@ -161,10 +150,7 @@ fn main() {
})
.expect
(
"IHDA: failed to write event"
);
}
loop
{
loop
{
{
//device_loop.borrow_mut().handle_interrupts();
}
...
...
@@ -186,5 +172,3 @@ fn main() {
unsafe
{
let
_
=
syscall
::
physunmap
(
address
);
}
}
}
nvmed/src/main.rs
View file @
b553e1dd
...
...
@@ -58,6 +58,9 @@ fn main() {
let mut event_file = File::open("event:").expect("nvmed: failed to open event file");
let scheme = DiskScheme::new(nvme::disks(address, &name));
syscall::setrens(0, 0).expect("nvmed: failed to enter null namespace");
loop {
let mut event = Event::default();
if event_file.read(&mut event).expect("nvmed: failed to read event file") == 0 {
...
...
ps2d/src/main.rs
View file @
b553e1dd
...
...
@@ -269,11 +269,17 @@ fn daemon(input: File) {
},
None
=>
(
keymap
::
us
::
get_char
)
};
let
mut
key_irq
=
File
::
open
(
"irq:1"
)
.expect
(
"ps2d: failed to open irq:1"
);
let
mut
mouse_irq
=
File
::
open
(
"irq:12"
)
.expect
(
"ps2d: failed to open irq:12"
);
let
ps2d
=
Arc
::
new
(
RefCell
::
new
(
Ps2d
::
new
(
input
,
keymap
)));
let
mut
event_queue
=
EventQueue
::
<
()
>
::
new
()
.expect
(
"ps2d: failed to create event queue"
);
let
mut
key_irq
=
File
::
open
(
"irq:1"
)
.expect
(
"ps2d: failed to open irq:1"
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"ps2d: failed to enter null namespace"
);
let
key_ps2d
=
ps2d
.clone
();
event_queue
.add
(
key_irq
.as_raw_fd
(),
move
|
_count
:
usize
|
->
Result
<
Option
<
()
>>
{
let
mut
irq
=
[
0
;
8
];
...
...
@@ -284,7 +290,6 @@ fn daemon(input: File) {
Ok
(
None
)
})
.expect
(
"ps2d: failed to poll irq:1"
);
let
mut
mouse_irq
=
File
::
open
(
"irq:12"
)
.expect
(
"ps2d: failed to open irq:12"
);
let
mouse_ps2d
=
ps2d
;
event_queue
.add
(
mouse_irq
.as_raw_fd
(),
move
|
_count
:
usize
|
->
Result
<
Option
<
()
>>
{
let
mut
irq
=
[
0
;
8
];
...
...
rtl8168d/src/main.rs
View file @
b553e1dd
...
...
@@ -44,6 +44,8 @@ fn main() {
let
mut
event_queue
=
EventQueue
::
<
usize
>
::
new
()
.expect
(
"rtl8168d: failed to create event queue"
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"rtl8168d: failed to enter null namespace"
);
let
todo
=
Arc
::
new
(
RefCell
::
new
(
Vec
::
<
Packet
>
::
new
()));
let
device_irq
=
device
.clone
();
...
...
vboxd/src/main.rs
View file @
b553e1dd
...
...
@@ -238,6 +238,8 @@ fn main() {
let
mut
event_queue
=
EventQueue
::
<
()
>
::
new
()
.expect
(
"vboxd: failed to create event queue"
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"vboxd: failed to enter null namespace"
);
let
mut
bga
=
Bga
::
new
();
let
get_mouse
=
VboxGetMouse
::
new
()
.expect
(
"vboxd: failed to map GetMouse"
);
let
display_change
=
VboxDisplayChange
::
new
()
.expect
(
"vboxd: failed to map DisplayChange"
);
...
...
vesad/src/main.rs
View file @
b553e1dd
...
...
@@ -62,6 +62,8 @@ fn main() {
let
mut
scheme
=
DisplayScheme
::
new
(
width
,
height
,
onscreen
,
&
spec
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"vesad: failed to enter null namespace"
);
let
mut
blocked
=
Vec
::
new
();
loop
{
let
mut
packet
=
Packet
::
default
();
...
...
xhcid/src/main.rs
View file @
b553e1dd
...
...
@@ -49,6 +49,8 @@ fn main() {
let
mut
event_queue
=
EventQueue
::
<
()
>
::
new
()
.expect
(
"xhcid: failed to create event queue"
);
syscall
::
setrens
(
0
,
0
)
.expect
(
"xhcid: failed to enter null namespace"
);
let
todo
=
Arc
::
new
(
RefCell
::
new
(
Vec
::
<
Packet
>
::
new
()));
let
hci_irq
=
hci
.clone
();
...
...
Write
Preview
Supports
Markdown
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