1 Star 0 Fork 1

shamrock/qboot

forked from bbingo/qboot 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
code32seg.c 1.69 KB
一键复制 编辑 原始数据 按行查看 历史
Marc-André Lureau 提交于 2019-10-16 22:47 . Add meson build
#include <stddef.h>
#include "bios.h"
#include "pci.h"
#include "processor-flags.h"
#define PCI_FUNC_NOT_SUPPORTED 0x81
#define PCI_BAD_VENDOR_ID 0x83
#define PCI_DEVICE_NOT_FOUND 0x86
#define PCI_BUFFER_TOO_SMALL 0x89
/*
* The PCIBIOS handler must be position independent. To read a flat pointer,
* we use the instruction pointer to retrieve the address corresponding to
* physical address 0 (i.e., what Linux calls PAGE_OFFSET).
*/
static inline void *from_flat_ptr(void *p)
{
return p + pic_base();
}
#define FLAT_VAR(x) (*(typeof(&(x))) from_flat_ptr(&(x)))
#pragma GCC optimize("no-jump-tables")
bioscall void pcibios_handler(struct bios32regs *args)
{
switch (args->eax) {
/* discovery */
case 0xb101:
args->eax = 0x01;
args->ebx = 0x210;
args->ecx = FLAT_VAR(max_bus);
args->edx = 0x20494350;
goto success;
/* config space access */
case 0xb108:
args->ecx = pci_config_readb(args->ebx, args->edi);
goto success;
case 0xb109:
args->ecx = pci_config_readw(args->ebx, args->edi);
goto success;
case 0xb10a:
args->ecx = pci_config_readl(args->ebx, args->edi);
goto success;
case 0xb10b:
pci_config_writeb(args->ebx, args->edi, args->ecx);
goto success;
case 0xb10c:
pci_config_writew(args->ebx, args->edi, args->ecx);
goto success;
case 0xb10d:
pci_config_writel(args->ebx, args->edi, args->ecx);
goto success;
/* find device id, find class code */
case 0xb102:
case 0xb103:
args->eax &= ~0xff00;
args->eax |= PCI_DEVICE_NOT_FOUND << 8;
break;
default:
args->eax &= ~0xff00;
args->eax |= PCI_FUNC_NOT_SUPPORTED << 8;
break;
}
args->eflags |= X86_EFLAGS_CF;
return;
success:
/* On entry, CF=0 */
args->eax &= ~0xff00; /* clear ah */
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/xiajunqian/qboot.git
git@gitee.com:xiajunqian/qboot.git
xiajunqian
qboot
qboot
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385