Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Themen - Ch40zz

Seiten: [1]
1
Lowlevel-Coding / [GCC Linker] ELF header in memory
« am: 27. June 2016, 19:19 »
Hey, nach längerer Pause mal wieder angefangen an meinem OS zu coden :)
Kann man den ELF Header mit einem linker script für gcc irgendwie von GRUB in den RAM bekommen?
GRUB lädt ja nur alle sections, da der header keine section ist wird er nichr geladen.
Das ganze müsste auch noch direkt nach dem multiboot header sein, leider hab ich keine Ahnung wie das gehen soll :(
Vielen Dank im Voraus!
2
Lowlevel-Coding / [PCI] Interrupts ändern
« am: 03. March 2016, 23:45 »
Hey Leute :D
Ich hab da mal wieder ein Problem :(
Da nun mehr als 2 devices von meinem OS unterstützt werden, hab ich mir gedacht, dass ich mal eine Netzwerkkarte ausprobiere.
Nun benutze ich die PCnet Fast III.

Das Problem:
Die Netzwerkkarte hat den selben IRQ wie die Soundkarte vom BIOS bekommen, soweit so gut.
Nun hab ich versucht diese IRQ zu ändern, nach dem schreiben lese ich das Register nochmal aus, um sicher zu gehen, dass es auch wirklich geändert wurde - was es auch tut.
Dennoch spammen die Karten weiterhin die alte IRQ als ob nichts geändert wurde.
Muss ich das Ändern der IRQ noch noch irgendwie dem PIC mitteilen?

Hier ein wenig code:
uint32_t data = pci_read_dword(pci_info.bus, pci_info.slot, pci_info.function, 60) & 0xFFFFFF00;
pci_write_dword(pci_info.bus, pci_info.slot, pci_info.function, 60, data | new_irq);
pci_info.irq = pci_read_word(pci_info.bus, pci_info.slot, pci_info.function, 60) & 0x00FF;

Danach hab ich IRQ Sharing versucht, es läuft in QEMU auch ganz gut, aber in VirtualBox ist das Bit einfach nie gesetzt und der handler returned direkt:
uint32_t dev_status = pci_read_word(pcnet_device.bus, pcnet_device.slot, pcnet_device.function, 6);
if(!(dev_status & 8))
return false;

Das 10. Bit wurde natürlich auch gecleared:
pci_write_word(pci_info->bus, pci_info->slot, pci_info->function, 4, 0x5);
Vielen Dank im Vorraus!
3
Lowlevel-Coding / VESA EDID Infos
« am: 19. February 2016, 19:17 »
Hey, ich habe mal wieder ein Problem :D
Um eine Standardauflösung für mein OS zu suchen wollte ich die EDID Infos aus dem BIOS lesen.
VESA an sich funktioniert gut, man kann alle Auflösungen auswählen und dort Bitmaps zeichnen lassen.
Das Problem ist, dass nach dem EDID call das Register AH 1 ist und AL nicht 0x4F ist (also: not supported)
Hier mein code (credits für den mode switcher gehen an Napalm)
memset((void*)&regs, 0, sizeof(regs16_t));
regs.ax = 0x4F15;
regs.bx = 1;
regs.es = 0;
regs.di = 0x1000;
int32(0x10, &regs);

printf("AX: %X | ES:DI: %X:%X\n", regs.ax, regs.es, regs.di);

Getestet habe ich den Code auf QEMU 1,2 und auf VirtualBox, bei allen das selbe Ergebnis :(
Liegt es vielleicht an den VMs?
Vielen Dank im Vorraus!
4
Lowlevel-Coding / ATAPI CD/DVD-ROM lesen
« am: 10. February 2016, 00:28 »
Hey Leute :D
Hab mal wieder ein Problem, welches ich einfach nicht lösen kann.
Momentan versuche ich mithilfe eines SATA devices und AHCI den Inhalt meines ISO images zu lesen.
Die ISO ist als CD/DVD in VirtualBox im Port 0 des SATA controllers, swowohl das Laufwerk als auch die HDD werden von meinem OS erkannt.

Ich habe alles probiert, hier ist ein Link zu einem Tutorial was ich dazu gefunden habe:
1: http://wiki.osdev.org/IDE#Reading_from_an_ATAPI_Drive
2: http://wiki.osdev.org/ATAPI

Ich habe beide gelesen und denke auch verstanden, leider bekomme ich als Antwort auf mein 0xA0 Packet immer nur status=0 und error=0 zurück :(
Hier mein code:
#define ATA_DRIVE_MASTER    0xA0
#define ATA_DRIVE_SLAVE      0xB0
#define ATA_DATA(x)(x)
#define ATA_FEATURES(x)(x+1)
#define ATA_SECTOR_COUNT(x) (x+2)
#define ATA_ADDRESS1(x)(x+3)
#define ATA_ADDRESS2(x)(x+4)
#define ATA_ADDRESS3(x)(x+5)
#define ATA_DRIVE_SELECT(x)(x+6)
#define ATA_COMMAND(x)(x+7)
#define ATA_CONTROL(x)(x+0xC)
#define ATA_DCR(x)(x+0x206)
#define ATA_SELECT_DELAY(bus) \
  {inb(ATA_DCR(bus));inb(ATA_DCR(bus));inb(ATA_DCR(bus));inb(ATA_DCR(bus));}

int atapi_drive_read_sector(uint32_t bus, uint32_t drive, uint8_t is_slave, uint32_t lba, uint8_t *buffer)
{
uint8_t status;
int size;

//0xA8 is "READ SECTORS" command byte.
uint8_t read_cmd[12] = { 0xA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
read_cmd[9] = 1; //Sector count
read_cmd[2] = (lba >> 24) & 0xFF; //Address to read from
read_cmd[3] = (lba >> 16) & 0xFF;
read_cmd[4] = (lba >> 8) & 0xFF;
read_cmd[5] = (lba >> 0) & 0xFF;

//Enable IRQs
outb(ATA_CONTROL(bus), 0);

//Select drive (4th bit set means select slave)
outb(ATA_DRIVE_SELECT(bus), drive | (is_slave << 4));

//400ns delay
ATA_SELECT_DELAY(bus);

//PIO-Mode
outb(ATA_FEATURES(bus), 0x00);

//Max Size (2048 bytes)
outb(ATA_ADDRESS2(bus), ATAPI_SECTOR_SIZE & 0xFF);
outb(ATA_ADDRESS3(bus), ATAPI_SECTOR_SIZE >> 8);

//ATA-Packet
outb(ATA_COMMAND(bus), 0xA0);

//Is Busy?
while ((status = inb(ATA_COMMAND(bus))) & 0x80)
asm volatile ("pause");

printf("status: %X | Error: %X\n", status, inb(bus + 0x1));

//No Device
if(status == 0)
return 0;

printf("2\n");

//Data request ready? No error?
while (!((status = inb(ATA_COMMAND(bus))) & 0x8) && !(status & 0x1))
asm volatile ("pause");

printf("3\n");
}

...

uint32_t primary_base = (pci_info.address0 & 0xFFFFFFFC) + 0x1F0 * (!pci_info.address0);
uint32_t secondary_base  = (pci_info.address2 & 0xFFFFFFFC) + 0x170 * (!pci_info.address2);

int j, k, m;
for(j = 0; j < 2; j++)
{
for(k = 0; k < 3; k++)
{
for(m = 0; m < 2; m++)
{
uint32_t base = primary_base;
if(m == 1)
base = secondary_base;

if(k == 0)
atapi_drive_read_sector(base, ATA_DRIVE_MASTER, j, 0, buff);
else if(k == 1)
atapi_drive_read_sector(base, ATA_DRIVE_SLAVE, j, 0, buff);
else
atapi_drive_read_sector(base, 0, j, 0, buff);
}
}
}

pci_info.address0 und pci_info.address2 sind nicht 0 sondern Adressen im I/O Raum. (Bit-0 ist gesetzt)
Ich hoffe mir kann Jemand helfen :)
Vielen Dank im Vorraus!
5
Lowlevel-Coding / [QEMU] AC97 driver - Kein Sound
« am: 07. February 2016, 23:19 »
Hey Leute :)
Bin relativ neu hier, super wiki und forum habt ihr :D
Nun zu meinem Problem:
Dank des Tutorials in der wiki konnte ich mir schnell den AC97 driver für Intel ICH (0x8086, 0x2415) kopieren und testen (Man findet ja kaum verwertbare Informationen zu den Specs, in den Intel Docs steht nicht viel dazu).
In Virtualbox läuft alles ziemlich gut, die WAV wird komplett ohne Fehler abgespielt.
Jedoch funktioniert das ganze in QEMU nicht. Benutze momentan "-soundhw all" in der commandline, das Gerät wird auch gefunden und erkannt.
Außerdem wird im Windows-Sound Mixer QEMU anezeigt wenn ich die play flags in den port schreibe, nur leider hört man keinen Ton und die Interrupts triggern nicht.
Vielen Dank im Vorraus :)

PS: Ist das normal dass der Interrupt nach dem abspielen des Sounds durchgehend gespammed wird? o.o
Seiten: [1]

Einloggen