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
Danke dir

21. May 2025, 12:48
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.
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;
uint32_t dev_status = pci_read_word(pcnet_device.bus, pcnet_device.slot, pcnet_device.function, 6);
if(!(dev_status & 8))
return false;
pci_write_word(pci_info->bus, pci_info->slot, pci_info->function, 4, 0x5);
memset((void*)®s, 0, sizeof(regs16_t));
regs.ax = 0x4F15;
regs.bx = 1;
regs.es = 0;
regs.di = 0x1000;
int32(0x10, ®s);
printf("AX: %X | ES:DI: %X:%X\n", regs.ax, regs.es, regs.di);
uint8_t eject_cmd[12] = { 0x1B, 0, 0, 0, 0x02, 0, 0, 0, 0, 0, 0, 0 };
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;
}
#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);
}
}
}