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.


Nachrichten - Ch40zz

Seiten: [1]
1
Lowlevel-Coding / Re: [GCC Linker] ELF header in memory
« am: 28. June 2016, 21:49 »
Hab mir mal eine neue GRUB iso gemacht und jetzt gehts...
Danke dir :)
2
Lowlevel-Coding / Re: [GCC Linker] ELF header in memory
« am: 28. June 2016, 14:27 »
Hm danke das hab ich wohl übersehen :D
Bei mir ist aber die addresse an 0x24 leider 0 :(
Muss ich etwas besonderes bei GRUB einstellen?

Bit 4 und 5 in den Flags sind nicht gesetzt.
3
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!
4
Lowlevel-Coding / Re: [PCI] Interrupts ändern
« am: 04. March 2016, 15:28 »
Hm danke :)
Ich glaub ich poste mal im Virtualbox Forum, da das ganze auf QEMU ja geht.
Und viel falsch machen beim Lesen kann man ja nicht xD (Grade weil der Rest ja perfekt funktioniert)
Mal sehen was die dazu meinen :P
Ich melde mich hier wieder, wenn ich eine Antwort bekommen habe

EDIT: Anscheinend wird das Status Register von Nichts und Niemandem benutzt...
Hab jetzt in den Interrupts einfach Device spezifischen Code der überprüft ob an den jeweiligen IO-Ports die IRQ Flags gesetzt sind.
5
Lowlevel-Coding / Re: [PCI] Interrupts ändern
« am: 04. March 2016, 11:13 »
Danke für die Antwort :)
Eigentlich hatte ich nicht vor das ganze AML zeugs jetzt schon zu verwenden :D
Was ich nicht verstehe ist, warum im Status Register der jeweiligen PCI Karte der Status in Virtualbox nicht gesetzt wird :(
Geht das denn nur wenn auch min. 2 Geräte die gleiche IRQ haben und vorher nicht? o.o
6
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!
7
Lowlevel-Coding / Re: VESA EDID Infos
« am: 19. February 2016, 22:58 »
Okay Danke, dann werde ich das wohl auch so machen.
Im Endeffekt ist es ja kein großes Problem, war nur nervig dass ach VirtualBox und VMWare es nicht implementiert haben :(
8
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!
9
Lowlevel-Coding / Re: ATAPI CD/DVD-ROM lesen
« am: 10. February 2016, 14:49 »
Hey Danke, das habe ich auch grade bemerkt xD (War gestern wohl ein wenig müde..)
Soweit hab ich es erstmal geschafft das Laufwerk mit einem SCSI command zu öffnen (Port ist rebased und ready):

uint8_t eject_cmd[12] = { 0x1B, 0, 0, 0, 0x02, 0, 0, 0, 0, 0, 0, 0 };
Danach hab ich versucht Daten mittels 0xA8 zu lesen, sieht nun so aus:
bool ahci_read_atapi(HBA_PORT *port, DWORD lba, DWORD count, WORD *buf, int slot_count)
{
port->is = 0xFFFFFFFF; // Clear pending interrupt bits

int i;
int spin = 0; // Spin lock timeout counter
int slot = find_cmdslot(port, slot_count);
if (slot == -1)
return false;
 
HBA_CMD_HEADER *cmdheader = (HBA_CMD_HEADER*)port->clb;
cmdheader += slot;
cmdheader->cfl = sizeof(FIS_REG_H2D) / sizeof(DWORD); // Command FIS size
cmdheader->a = 1;
cmdheader->prdtl = 1;

//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;
 
HBA_CMD_TBL *cmdtbl = (HBA_CMD_TBL*)(cmdheader->ctba);
memset((void*)cmdtbl, 0, sizeof(HBA_CMD_TBL));
cmdtbl->prdt_entry[i].dba = (DWORD)buf;
cmdtbl->prdt_entry[i].dbc = 2048;
cmdtbl->prdt_entry[i].i = 1;

//Copy command packet
int j;
for(j = 0; j < 12; j++)
cmdtbl->acmd[j] = read_cmd[j];
 
// Setup command
FIS_REG_H2D *cmdfis = (FIS_REG_H2D*)(&cmdtbl->cfis);
cmdfis->fis_type = FIS_TYPE_REG_H2D;
cmdfis->pmport = 0;
cmdfis->c = 1; // Command
cmdfis->command = 0xA0; //ATAPI Packet command
cmdfis->featurel = 1;
 
// Wait until the port is no longer busy before issuing a new command
while ((port->tfd & (ATA_DEV_BUSY | ATA_DEV_DRQ)))
{
if (spin >= 1000000)
{
printf("Port doesnt respond!\n");
return false;
}

spin++;
}
 
port->ci = 1 << slot; // Issue command
 
// Wait for completion
while (1)
{
// In some longer duration reads, it may be helpful to spin on the DPS bit
// in the PxIS port field as well (1 << 5)
if ((port->ci & (1 << slot)) == 0)
break;
if (port->is & HBA_PxIS_TFES) // Task file error
{
printf("Disk error!\n");
return false;
}
}
 
// Check again
if (port->is & HBA_PxIS_TFES)
{
printf("Disk error!\n");
return false;
}
 
return true;
}

Vielen Dank für die Hilfe, die ersten paar K bytes sind einfach Nuller :D
Nun funktioniert alles!

"Since sectors 0x00-0x0F of the CD are reserved as System Area, the Volume Descriptors can be found starting at sector 0x10. The format of the volume descriptors is as follows..."
10
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!
11
Lowlevel-Coding / Re: [QEMU] AC97 driver - Kein Sound
« am: 08. February 2016, 12:24 »
Ok danke Leute :D
Hab endlich mal das echte Datenblatt gefunden (http://download.intel.com/design/chipsets/datashts/29065503.pdf)
Da steht alles drin wegen den Buffern und Interrupts.

Hab mir QEMU Manager gedownloaded, und siehe da, die alte QEMU Version unterstützt Sound! :D
Musste nur eine andere Auflöung für meine GUI suchen, es unterstützt wohl noch keine 1920x1080.
Danke an alle :)
12
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