forked from koniifer/ableos
port ecah changes from svga_driver branch
This commit is contained in:
parent
12ee3a9b87
commit
8577920d90
|
@ -12,7 +12,8 @@ use crate::alloc::string::ToString;
|
||||||
|
|
||||||
/// Enumerate PCI devices and run initialisation routines on ones we support
|
/// Enumerate PCI devices and run initialisation routines on ones we support
|
||||||
pub fn init(device_tree: &mut DeviceTree) {
|
pub fn init(device_tree: &mut DeviceTree) {
|
||||||
device_tree.devices
|
device_tree
|
||||||
|
.devices
|
||||||
.insert("Unidentified PCI".to_string(), alloc::vec![]);
|
.insert("Unidentified PCI".to_string(), alloc::vec![]);
|
||||||
let mut devices = alloc::vec![];
|
let mut devices = alloc::vec![];
|
||||||
|
|
||||||
|
@ -23,6 +24,7 @@ pub fn init(device_tree: &mut DeviceTree) {
|
||||||
let id = device_info.device_id.id;
|
let id = device_info.device_id.id;
|
||||||
use Vendor::*;
|
use Vendor::*;
|
||||||
let (dev_type, dev_name) = match (vendor, id) {
|
let (dev_type, dev_name) = match (vendor, id) {
|
||||||
|
(VMWareInc, 1029) => ("GPUs", "SVGAII PCI GPU"),
|
||||||
(Qemu, 4369) => ("GPUs", "QEMU VGA"),
|
(Qemu, 4369) => ("GPUs", "QEMU VGA"),
|
||||||
(VirtIO, 4176) => ("GPUs", "VirtIO PCI GPU"),
|
(VirtIO, 4176) => ("GPUs", "VirtIO PCI GPU"),
|
||||||
(CirrusLogic, 184) => ("GPUs", "Cirrus SVGA"), //GD 5446?
|
(CirrusLogic, 184) => ("GPUs", "Cirrus SVGA"), //GD 5446?
|
||||||
|
@ -269,8 +271,7 @@ impl Display for Vendor {
|
||||||
|
|
||||||
use core::fmt::Display;
|
use core::fmt::Display;
|
||||||
|
|
||||||
use x86_64::instructions::port::Port;
|
use {crate::device_tree::DeviceTree, x86_64::instructions::port::Port};
|
||||||
use crate::device_tree::DeviceTree;
|
|
||||||
|
|
||||||
#[allow(non_camel_case_types, dead_code)]
|
#[allow(non_camel_case_types, dead_code)]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
|
|
|
@ -86,47 +86,98 @@ pub fn handler(vm: &mut Vm) {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(_) => {}
|
Err(_) => {}
|
||||||
}
|
}
|
||||||
//
|
|
||||||
}
|
}
|
||||||
3 => {
|
3 => {
|
||||||
unsafe fn x86_in(address: u16) -> u8 {
|
unsafe fn x86_in(address: u16) -> u8 {
|
||||||
x86_64::instructions::port::Port::new(address).read()
|
x86_64::instructions::port::Port::new(address).read()
|
||||||
}
|
}
|
||||||
|
unsafe fn x86_in_16(address: u16) -> u16 {
|
||||||
|
x86_64::instructions::port::Port::new(address).read()
|
||||||
|
}
|
||||||
|
unsafe fn x86_in_32(address: u16) -> u32 {
|
||||||
|
x86_64::instructions::port::Port::new(address).read()
|
||||||
|
}
|
||||||
unsafe fn x86_out(address: u16, value: u8) {
|
unsafe fn x86_out(address: u16, value: u8) {
|
||||||
x86_64::instructions::port::Port::new(address).write(value);
|
x86_64::instructions::port::Port::new(address).write(value);
|
||||||
}
|
}
|
||||||
|
unsafe fn x86_out_16(address: u16, value: u16) {
|
||||||
|
x86_64::instructions::port::Port::new(address).write(value);
|
||||||
|
}
|
||||||
|
unsafe fn x86_out_32(address: u16, value: u32) {
|
||||||
|
x86_64::instructions::port::Port::new(address).write(value);
|
||||||
|
}
|
||||||
|
|
||||||
let mut msg_vec = block_read(mem_addr, length);
|
let mut msg_vec = block_read(mem_addr, length);
|
||||||
let msg_type = msg_vec[0];
|
let msg_type = msg_vec[0];
|
||||||
msg_vec.remove(0);
|
msg_vec.remove(0);
|
||||||
match msg_type {
|
match msg_type {
|
||||||
0 => {
|
// XY\0\0V
|
||||||
let mut addr = msg_vec[0] as u16;
|
// X = 0: Read, 1: Write
|
||||||
|
// Y = 0: 8bit, 1: 16bit, 2: 32bit
|
||||||
|
// \0 = Port
|
||||||
|
// V = Value
|
||||||
|
0 => 'wow: {
|
||||||
|
// info!("inb");
|
||||||
|
let size = match msg_vec[0] {
|
||||||
|
0 => 1,
|
||||||
|
1 => 2,
|
||||||
|
2 => 4,
|
||||||
|
_ => {
|
||||||
|
error!("Tried to write more than 32 bits");
|
||||||
|
break 'wow;
|
||||||
|
}
|
||||||
|
};
|
||||||
msg_vec.remove(0);
|
msg_vec.remove(0);
|
||||||
|
|
||||||
let addr2 = msg_vec[0] as u16;
|
let addr = ((msg_vec[0] as u16) << 8) + msg_vec[1] as u16;
|
||||||
msg_vec.remove(0);
|
msg_vec.remove(0);
|
||||||
|
msg_vec.remove(0);
|
||||||
addr = ((addr) << 8) | addr2;
|
let value = unsafe {
|
||||||
|
match size {
|
||||||
let value = unsafe { x86_in(addr) };
|
1 => x86_in(addr) as u64,
|
||||||
|
2 => x86_in_16(addr) as u64,
|
||||||
|
4 => x86_in_32(addr) as u64,
|
||||||
|
_ => panic!("how?"),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
msg_vec.clear();
|
||||||
trace!("Read the value {} from address {}", value, addr);
|
trace!("Read the value {} from address {}", value, addr);
|
||||||
vm.registers[1] = hbvm::value::Value(value as u64);
|
vm.registers[1] = hbvm::value::Value(value);
|
||||||
}
|
}
|
||||||
1 => {
|
1 => 'wow: {
|
||||||
let mut addr = msg_vec[0] as u16;
|
let size = match msg_vec[0] {
|
||||||
|
0 => 1,
|
||||||
|
1 => 2,
|
||||||
|
2 => 4,
|
||||||
|
_ => {
|
||||||
|
error!("Tried to write more than 32 bits");
|
||||||
|
break 'wow;
|
||||||
|
}
|
||||||
|
};
|
||||||
msg_vec.remove(0);
|
msg_vec.remove(0);
|
||||||
|
let addr = ((msg_vec[0] as u16) << 8) + msg_vec[1] as u16;
|
||||||
let addr2 = msg_vec[0] as u16;
|
|
||||||
msg_vec.remove(0);
|
msg_vec.remove(0);
|
||||||
|
|
||||||
addr = ((addr) << 8) | addr2;
|
|
||||||
|
|
||||||
let value = msg_vec[0];
|
|
||||||
msg_vec.remove(0);
|
msg_vec.remove(0);
|
||||||
trace!("Setting the address {} to {}", addr, value);
|
trace!("Setting address {}", addr);
|
||||||
unsafe { x86_out(addr, value) };
|
unsafe {
|
||||||
|
match size {
|
||||||
|
1 => x86_out(addr, msg_vec[0]),
|
||||||
|
2 => x86_out_16(
|
||||||
|
addr,
|
||||||
|
core::mem::transmute::<[u8; 2], u16>(
|
||||||
|
msg_vec[0..2].try_into().unwrap(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
4 => x86_out_32(
|
||||||
|
addr,
|
||||||
|
core::mem::transmute::<[u8; 4], u32>(
|
||||||
|
msg_vec[0..4].try_into().unwrap(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
_ => panic!("How?"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg_vec.clear();
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
@ -147,7 +198,7 @@ pub fn handler(vm: &mut Vm) {
|
||||||
msg_vec.push(value);
|
msg_vec.push(value);
|
||||||
}
|
}
|
||||||
buff.push(msg_vec.clone());
|
buff.push(msg_vec.clone());
|
||||||
info!(
|
debug!(
|
||||||
"Message {:?} has been sent to Buffer({})",
|
"Message {:?} has been sent to Buffer({})",
|
||||||
msg_vec, buffer_id
|
msg_vec, buffer_id
|
||||||
);
|
);
|
||||||
|
@ -191,7 +242,7 @@ pub fn handler(vm: &mut Vm) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("Recieve {:?} from Buffer({})", msg, buffer_id);
|
debug!("Recieve {:?} from Buffer({})", msg, buffer_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
5 => {
|
5 => {
|
||||||
|
|
|
@ -9,7 +9,11 @@ use {
|
||||||
|
|
||||||
pub fn init() -> Result<(), SetLoggerError> {
|
pub fn init() -> Result<(), SetLoggerError> {
|
||||||
log::set_logger(&crate::logger::Logger)?;
|
log::set_logger(&crate::logger::Logger)?;
|
||||||
log::set_max_level(log::LevelFilter::Debug);
|
if cfg!(debug_assertions) {
|
||||||
|
log::set_max_level(log::LevelFilter::Debug);
|
||||||
|
} else {
|
||||||
|
log::set_max_level(log::LevelFilter::Info);
|
||||||
|
}
|
||||||
|
|
||||||
Lazy::force(&TERMINAL_LOGGER);
|
Lazy::force(&TERMINAL_LOGGER);
|
||||||
|
|
||||||
|
|
|
@ -17,19 +17,41 @@ release_page := fn(ptr: ^u8, page_count: u8): void {
|
||||||
return @eca(void, 3, 2, msg, 12)
|
return @eca(void, 3, 2, msg, 12)
|
||||||
}
|
}
|
||||||
|
|
||||||
outb := fn(addr_high: u8, addr_low: u8, value: u8): void {
|
outb := fn(addr: u16, value: u8): void {
|
||||||
msg := "\0\0\0\0";
|
msg := "\0\0\0\0\0";
|
||||||
*msg = 1;
|
*msg = 1;
|
||||||
*(msg + 1) = addr_high;
|
*(msg + 1) = 0;
|
||||||
*(msg + 2) = addr_low;
|
*@as(^u16, @bitcast(msg + 2)) = addr;
|
||||||
*(msg + 3) = value
|
*(msg + 4) = value
|
||||||
@eca(void, 3, 3, msg, 4)
|
@eca(void, 3, 3, msg, 5)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
inb := fn(addr_high: u8, addr_low: u8): u8 {
|
inb := fn(addr: u16): u8 {
|
||||||
msg := "\0\0\0\0";
|
msg := "\0\0\0\0";
|
||||||
*(msg + 1) = addr_high;
|
*msg = 0;
|
||||||
*(msg + 2) = addr_low
|
*(msg + 1) = 0;
|
||||||
return @eca(u8, 3, 3, msg, 3)
|
*@as(^u16, @bitcast(msg + 2)) = addr
|
||||||
|
return @eca(u8, 3, 3, msg, 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
outl := fn(addr: u16, value: u32): void {
|
||||||
|
msg := "\0\0\0\0\0\0\0\0";
|
||||||
|
*msg = 1;
|
||||||
|
*(msg + 1) = 2;
|
||||||
|
*@as(^u16, @bitcast(msg + 2)) = addr;
|
||||||
|
*(msg + 4) = value >> 24 & 255;
|
||||||
|
*(msg + 5) = value >> 16 & 255;
|
||||||
|
*(msg + 6) = value >> 8 & 255;
|
||||||
|
*(msg + 7) = value & 255
|
||||||
|
@eca(void, 3, 3, msg, 8)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
inl := fn(addr: u16): u32 {
|
||||||
|
msg := "\0\0\0\0";
|
||||||
|
*msg = 0;
|
||||||
|
*(msg + 1) = 2;
|
||||||
|
*@as(^u16, @bitcast(msg + 2)) = addr
|
||||||
|
return @eca(u32, 3, 3, msg, 4)
|
||||||
}
|
}
|
|
@ -5,7 +5,7 @@ serial_print := fn(ptr: ^u8): void {
|
||||||
letter := 0
|
letter := 0
|
||||||
loop if *ptr == 0 break else {
|
loop if *ptr == 0 break else {
|
||||||
letter = *ptr
|
letter = *ptr
|
||||||
memory.outb(3, 248, letter)
|
memory.outb(63491, letter)
|
||||||
ptr += 1
|
ptr += 1
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -13,8 +13,8 @@ serial_print := fn(ptr: ^u8): void {
|
||||||
|
|
||||||
serial_println := fn(ptr: ^u8): void {
|
serial_println := fn(ptr: ^u8): void {
|
||||||
serial_print(ptr)
|
serial_print(ptr)
|
||||||
memory.outb(3, 248, 12)
|
memory.outb(63491, 12)
|
||||||
memory.outb(3, 248, 13)
|
memory.outb(63491, 13)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@ stn := @use("../../../libraries/stn/src/lib.hb");
|
||||||
|
|
||||||
main := fn(): int {
|
main := fn(): int {
|
||||||
// shuts down ableOS
|
// shuts down ableOS
|
||||||
//memory.outb(0, 244, 0)
|
//memory.outb(62464, 0)
|
||||||
|
|
||||||
a := memory.inb(0, 70)
|
a := memory.inb(17920)
|
||||||
b := memory.inb(0, 71)
|
b := memory.inb(18176)
|
||||||
|
|
||||||
c := buffer.search("XNumber\0")
|
c := buffer.search("XNumber\0")
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ LIGHTBLUE := ColorBGRA.{b: 255, g: 0, r: 0, a: 255}
|
||||||
LIGHTMAGENTA := ColorBGRA.{b: 255, g: 0, r: 255, a: 255}
|
LIGHTMAGENTA := ColorBGRA.{b: 255, g: 0, r: 255, a: 255}
|
||||||
LIGHTCYAN := ColorBGRA.{b: 255, g: 255, r: 0, a: 255}
|
LIGHTCYAN := ColorBGRA.{b: 255, g: 255, r: 0, a: 255}
|
||||||
|
|
||||||
// i have no clue if this works. please don't me ask how it works. -aurlex
|
// i have no clue if this works. please don't me ask how it works. -koniifer
|
||||||
blend := fn(fg: ColorBGRA, bg: ColorBGRA): ColorBGRA {
|
blend := fn(fg: ColorBGRA, bg: ColorBGRA): ColorBGRA {
|
||||||
s := fg + bg
|
s := fg + bg
|
||||||
m := s - ((fg ^ bg) & 16843008) & 16843008
|
m := s - ((fg ^ bg) & 16843008) & 16843008
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb")
|
.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb")
|
||||||
|
|
||||||
send_byte := fn(byte: u8): u8 {
|
send_byte := fn(byte: u8): u8 {
|
||||||
memory.outb(0, 96, byte)
|
memory.outb(24576, byte)
|
||||||
return memory.inb(0, 96)
|
return memory.inb(24576)
|
||||||
}
|
}
|
||||||
|
|
||||||
main := fn(): int {
|
main := fn(): int {
|
||||||
|
@ -17,13 +17,13 @@ main := fn(): int {
|
||||||
ptr := memory.request_page(1)
|
ptr := memory.request_page(1)
|
||||||
prev_input := 250
|
prev_input := 250
|
||||||
loop {
|
loop {
|
||||||
input := memory.inb(0, 96)
|
input := memory.inb(24576)
|
||||||
if input == prev_input {
|
if input == prev_input {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
prev_input = input
|
prev_input = input
|
||||||
keycode_str := string.display_int(input, ptr)
|
keycode_str := string.display_int(input, ptr)
|
||||||
log.info(string.display_int(buf))
|
log.info(string.display_int(input, ptr))
|
||||||
buffer.send_message(keycode_str, buf)
|
buffer.send_message(keycode_str, buf)
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
|
|
Loading…
Reference in a new issue