⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sal.c

📁 网卡 BOOT ROM 的 64 住源程序。模块有:核心代码、H文件、网卡驱动程序、头代码文件。
💻 C
字号:
#include "etherboot.h"#include "sal.h"struct sal_entry_base {	uint8_t entry_type;#define SAL_TYPE_ENTRYPOINT           0#define SAL_TYPE_MEMORY               1#define SAL_TYPE_PLATFORM_FEATURES    2#define SAL_TYPE_TRANSLATION_REGISTER 3#define SAL_TYPE_PURGE_DOMAIN         4#define SAL_TYPE_AP_WAKEUP            5};struct sal_entry_point_descriptor {	uint8_t  entry_type;	uint8_t  reserved[7];	uint64_t pal_proc;	uint64_t sal_proc;	uint64_t sal_gp;	uint8_t  reserved2[16];};struct sal_memory_descriptor {	uint8_t  entry_type;	uint8_t  sal_needs_virt_mapping;	uint8_t  mem_attr;#define MEM_ATTR_WB   0#define MEM_ATTR_UC   8#define MEM_ATTR_UCE  9#define MEM_ATTR_WC  10		uint8_t  access_rights;	uint8_t  mem_attr_support;#define MEM_ATTR_SUPPORTS_WB  1#define MEM_ATTR_SUPPORTS_UC  2#define MEM_ATTR_SUPPORTS_UCE 4#define MEM_ATTR_SUPPORTS_WC  8	uint8_t  reserved;	uint8_t  mem_type;#define MEM_TYPE_RAM         0#define MEM_TYPE_MIO         1#define MEM_TYPE_SAPIC       2#define MEM_TYPE_PIO         3#define MEM_TYPE_FIRMWARE    4#define MEM_TYPE_BAD_RAM     9#define MEM_TYPE_BLACK_HOLE 10	uint8_t  mem_usage;#define MEM_USAGE_UNSPECIFIED            0#define MEM_USAGE_PAL_CODE               1#define MEM_USAGE_BOOT_SERVICES_CODE     2#define MEM_USAGE_BOOT_SERVICES_DATA     3#define MEM_USAGE_RUNTIME_SERVICES_CODE  4#define MEM_USAGE_RUNTIME_SERVICES_DATA  5#define MEM_USAGE_IA32_OPTION_ROM        6#define MEM_USAGE_IA32_SYSTEM_ROM        7#define MEM_USAGE_ACPI_RECLAIM_MEMORY    8#define MEM_USAGE_ACPI_NVS_MEMORY        9#define MEM_USAGE_SAL_PMI_CODE          10#define MEM_USAGE_SAL_PMI_DATA          11#define MEM_USAGE_FIRMWARE_RESERVED_RAM 12#define MEM_USAGE_CPU_TO_IO              0	uint64_t phys_address;	uint32_t pages; /* In 4k pages */	uint32_t reserved2; 	uint8_t  oem_reserved[8];};struct sal_platform_features {	uint8_t  entry_type;	uint8_t  feature_list;#define SAL_FEATURE_BUS_LOCK                   1#define SAL_FEATURE_PLATFORM_REDIRECTION_HINT  2#define SAL_FEATURE_PROCESSOR_REDIRECTION_HINT 3	uint8_t  reserved[14];};struct sal_translation_register {	uint8_t  entry_type;	uint8_t  tr_type;#define SAL_ITR 0#define SAL_DTR 1	uint8_t  tr_number;	uint8_t  reserved[5];	uint64_t virtual_address;	uint64_t page_size;	uint8_t  reserved2[8];};struct sal_purge_translation_cache_coherency_domain {	uint8_t  entry_type;	uint8_t  reserved[3];	uint32_t coherence_domain_count;	uint64_t coherence_domain_addr;};struct sal_ap_wakeup_descriptor {	uint8_t  entry_type;	uint8_t  wakeup_mechanism;	uint8_t  reserved[6];	uint64_t interrupt;};struct sal_entry {	union {		struct sal_entry_base base;		struct sal_entry_point_descriptor entry_point;		struct sal_memory_descriptor mem;		struct sal_platform_features features;		struct sal_translation_register tr;		struct sal_purge_translation_cache_coherency_domain purge;		struct sal_ap_wakeup_descriptor ap_wakeup;	};};struct sal_system_table {	uint8_t  signature[4]; /* SST_ */	uint32_t table_length;	uint16_t sal_rev;	uint16_t entry_count;	uint8_t  checksum;	uint8_t  reserved1[7];	uint16_t sal_a_version;	uint16_t sal_b_version;	uint8_t  oem_id[32];	uint8_t  product_id[32];	uint8_t  reserved2[8];	struct sal_entry entry[0];};static struct sal_system_table *sal;struct fptr sal_entry;int parse_sal_system_table(void *table){	struct sal_system_table *salp = table;	uint8_t *ptr;	uint8_t checksum;	struct sal_entry *entry;	unsigned i;	if (memcmp(salp->signature, "SST_", 4) != 0) {		return 0;	}	ptr = table;	checksum = 0;	for(i = 0; i < salp->table_length; i++) {		checksum += ptr[i];	}	if (checksum != 0) {		return 0;	}#if 0	printf("SALA: %hx SALB: %hx\n",		salp->sal_a_version,		salp->sal_b_version);	printf("SAL OEM: ");	for(i = 0; i < sizeof(salp->oem_id); i++) {		uint8_t ch = salp->oem_id[i];		if (ch == 0)			break;		printf("%c", ch);	}	printf("\n");	printf("SAL PRODUCT: ");	for(i = 0; i < sizeof(salp->product_id); i++) {		uint8_t ch = salp->product_id[i];		if (ch == 0)			break;		printf("%c", ch);	}	printf("\n");#endif	sal = salp;	pal_entry.entry = 0;	pal_entry.gp = 0;	sal_entry.entry = 0;	sal_entry.gp = 0;	entry = sal->entry;	i = 0;	while(i < salp->entry_count) {		unsigned long size = 0;		switch(entry->base.entry_type) {		case SAL_TYPE_ENTRYPOINT:			size = sizeof(entry->entry_point);			pal_entry.entry = entry->entry_point.pal_proc;			sal_entry.entry = entry->entry_point.sal_proc;			sal_entry.gp    = entry->entry_point.sal_gp;			break;		case SAL_TYPE_MEMORY:			size = sizeof(entry->mem);			break;		case SAL_TYPE_PLATFORM_FEATURES:			size = sizeof(entry->features);			break;		case SAL_TYPE_TRANSLATION_REGISTER:			size = sizeof(entry->tr);			break;		case SAL_TYPE_PURGE_DOMAIN:			size = sizeof(entry->purge);			break;		case SAL_TYPE_AP_WAKEUP:			size = sizeof(entry->ap_wakeup);			break;		default:			break;		}		entry = (struct sal_entry *)(((char *)entry) + size);		i++;	}	return 1;}#define SAL_SET_VECTORS			0x01000000#define SAL_GET_STATE_INFO		0x01000001#define SAL_GET_STATE_INFO_SIZE		0x01000002#define SAL_CLEAR_STATE_INFO		0x01000003#define SAL_MC_RENDEZ			0x01000004#define SAL_MC_SET_PARAMS		0x01000005#define SAL_REGISTER_PHYSICAL_ADDR	0x01000006#define SAL_CACHE_FLUSH			0x01000008#define SAL_CACHE_INIT			0x01000009#define SAL_PCI_CONFIG_READ		0x01000010#define SAL_PCI_CONFIG_WRITE		0x01000011#define SAL_FREQ_BASE			0x01000012#define SAL_UPDATE_PAL			0x01000020/* * Now define a couple of inline functions for improved type checking * and convenience. */long sal_freq_base (unsigned long which, unsigned long *ticks_per_second,	unsigned long *drift_info){	struct {		long status;		unsigned long ticks_per_second;		unsigned long drift_info;	} result, __call(void *,...);	result = __call(&sal_entry, SAL_FREQ_BASE, which, 0, 0, 0, 0, 0, 0); 	*ticks_per_second = result.ticks_per_second;	*drift_info = result.drift_info;	return result.status;}/* Read from PCI configuration space */long sal_pci_config_read (	unsigned long pci_config_addr, unsigned long size, unsigned long *value){	struct {		long status;		unsigned long value;	} result, __call(void *,...);		result = __call(&sal_entry, SAL_PCI_CONFIG_READ, pci_config_addr, size, 0, 0, 0, 0, 0);	if (value)		*value = result.value;	return result.status;}/* Write to PCI configuration space */long sal_pci_config_write (	unsigned long pci_config_addr, unsigned long size, unsigned long value){	struct {		long status;	} result, __call(void *,...);	result = __call(&sal_entry, SAL_PCI_CONFIG_WRITE, pci_config_addr, size, value, 0, 0, 0, 0);	return result.status;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -