Page 1 of 1

PCI in RONIXOS not working

Posted: Thu Feb 16, 2017 12:52 am
by SpaceboyRoss01
Hey, I'm developing this OS called RONIXOS or RONIX for short. The system is a multitasking, multiarchitecture system that allows PCI . Recently in version 0.0.11 Pre-Alpha it includes BGA (Simple Implementation), VGA (Text), PCI, CMOS (RTC), Serial (COM1-4) and Multitasking. However, I've run into a problem where all of my PCI Devices that I'm trying to read would return me 0x10 then the next one would equal to 0, this would repeat throughout the reading of the device. My code is located on GitHub at https://github.com/SpaceboyRoss01/ronix-core, look inside of src/Kernel/sys/hardware/x86 and look at the PCI C++ file. If anyone knows how to fix this glitch, please tell me. I thought of the name by combining my last name, Ross, with nix. I started RONIX in the beginning of 2016.


This is how I feel from the glitch: :evil: :evil: :evil:

Edit: I've updated the driver, someone please test it and reply back if it works.
New Edit: 0.0.12 Pre-Alpha Released

Re: PCI in RONIXOS not working

Posted: Thu Feb 16, 2017 11:29 am
by ronsor
What isn't working?

Re: PCI in RONIXOS not working

Posted: Thu Feb 16, 2017 12:34 pm
by sleephacker

Code: Select all

uint8_t PCI::read_byte(uint8_t bus,uint8_t slot,uint8_t func,uint8_t offset) {
	write_addr(bus,slot,func,offset);
	using namespace io;
	return (uint8_t)((Ports::read_long(0xCFC) >> ((offset & 3) * 8)) & 0xFF);
	using namespace hardware;
}

void PCI::write_addr(uint8_t bus,uint8_t slot,uint8_t fn,uint8_t offset) {
	using namespace io;
	uint32_t addr = (uint32_t)((uint32_t)0x80000000 | (uint32_t)bus << 16 | (uint32_t)slot << 11 | (uint32_t)fn << 8 | (uint32_t)offset);
	Ports::write_long(0xCF8,addr);
	using namespace hardware;
}

...

void Ports::write_long(uint16_t port,uint16_t value) {
	asm volatile ("outw %w0,%w1" :: "a"(value),"d"(port));
}

uint16_t Ports::read_long(uint16_t port) {
	uint16_t value;
	asm volatile ("inw %w1,%w0" : "=a"(value) : "d"(port));
	return value;
}
You are confusing 32 bit longs / dwords with 16 bit words all over the place.
Your Ports::write_long() function is called with a 32 bit value, but only takes 16 bit values.
Similarly, your Ports::read_long() function is used to read 32 bit values, but only returns 16 bit values.
One of the many problems that are caused by this that PCI::write_addr() isn't actually able to send the enable bit to the address port, which means that PCI::read_whatever() doesn't actually read anything at all, not even the wrong address.

Re: PCI in RONIXOS not working

Posted: Thu Feb 16, 2017 1:01 pm
by hannah
ronsor wrote:Hey, I already used the name Ronix

http://github.com/ronsoros/ronix4

and I'm going to release a 5.x version too.
Somehow, I doubt you've trademarked the name Ronix.

Re: PCI in RONIXOS not working

Posted: Thu Feb 16, 2017 6:58 pm
by kzinti
LOL, he just updated his README...

Re: PCI in RONIXOS not working

Posted: Fri Feb 17, 2017 7:09 am
by matt11235
kzinti wrote:LOL, he just updated his README...
I'm not sure where Ronsor is from, but in the UK Ronix is already trademarked and it covers class 9 (software). https://www.ipo.gov.uk/tmcase/Results/2/WO0000001273133
Anyway, this is a bit off topic.