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

📄 config.c

📁 linux下从网卡远程启动
💻 C
字号:
/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2, or (at * your option) any later version. */#include	"etherboot.h"#include	"nic.h"#ifdef CONFIG_PCI#include	"pci.h"#endif#ifdef CONFIG_ISA#include	"isa.h"#endifvoid print_config(void){	printf("Etherboot " VERSION " (GPL) http://etherboot.org "#ifdef	TAGGED_IMAGE		"Tagged "#endif#ifdef	ELF64_IMAGE		"ELF64 "#endif#ifdef	ELF_IMAGE		"ELF "#endif#ifdef	COFF_IMAGE		"COFF "#endif#ifdef	IMAGE_FREEBSD		"(FreeBSD) "#endif#ifdef	IMAGE_MULTIBOOT		"(Multiboot) "#endif#ifdef	AOUT_IMAGE		"a.out "#endif#ifdef	WINCE_IMAGE		"WINCE "#endif#ifdef	SAFEBOOTMODE		"SafeBoot "#endif		"for ");#ifdef CONFIG_PCI{	const struct pci_driver *driver;	for(driver = pci_drivers; driver < pci_drivers_end; driver++) {		printf("[%s]", driver->name);	}}#endif	#ifdef CONFIG_ISA{	const struct isa_driver *driver;	for(driver = isa_drivers; driver < isa_drivers_end; driver++) {		printf("[%s]", driver->name);	}}#endif		putchar('\n');#if	(BOOTP_SERVER != 67) || (BOOTP_CLIENT != 68)	printf("This Etherboot uses non-standard ports %d and %d\n",		BOOTP_SERVER, BOOTP_CLIENT);#endif}#ifdef CONFIG_PCIstatic int pci_probe(struct dev *dev, const char *type_name){/* *	NIC probing is in pci device order, followed by the  *      link order of the drivers.  A driver that matches  *      on vendor and device id will supersede a driver *      that matches on pci class. * *	If you want to probe for another device behind the same pci *      device just increment index.  And the previous probe call *      will be repeated. */	struct pci_probe_state *state = &dev->state.pci;	printf("Probing pci %s...\n", type_name);	if (dev->how_probe == PROBE_FIRST) {		state->advance    = 1;		state->dev.driver = 0;		state->dev.bus    = 0;		state->dev.devfn  = 0;		dev->index        = -1;	}	for(;;) {		if ((dev->how_probe != PROBE_AWAKE) && state->advance) {			find_pci(dev->type, &state->dev);			dev->index = -1;		}		state->advance = 1;				if (state->dev.driver == 0)			break;		#if 0		/* FIXME the romaddr code needs a total rethought to be useful */		if (state->dev.romaddr != ((unsigned long) rom.rom_segment << 4)) {			continue;		}#endif		if (dev->how_probe != PROBE_AWAKE) {			dev->type_index++;		}		dev->devid.bus_type = PCI_BUS_TYPE;		dev->devid.vendor_id = htons(state->dev.vendor);		dev->devid.device_id = htons(state->dev.dev_id);		/* FIXME how do I handle dev->index + PROBE_AGAIN?? */				printf("[%s]", state->dev.name);		if (state->dev.driver->probe(dev, &state->dev)) {			state->advance = (dev->index == -1);			return PROBE_WORKED;		}		putchar('\n');	}	return PROBE_FAILED;}#else#define pci_probe(d, tn) (PROBE_FAILED)#endif#ifdef CONFIG_ISAstatic int isa_probe(struct dev *dev, const char *type_name){/* *	NIC probing is in the order the drivers were linked togeter. *	If for some reason you want to change the order, *	just change the order you list the drivers in. */	struct isa_probe_state *state = &dev->state.isa;	printf("Probing isa %s...\n", type_name);	if (dev->how_probe == PROBE_FIRST) {		state->advance = 0;		state->driver  = isa_drivers;		dev->index     = -1;	}	for(;;)	{		if ((dev->how_probe != PROBE_AWAKE) && state->advance) {			state->driver++;			dev->index = -1;		}		state->advance = 1;				if (state->driver >= isa_drivers_end)			break;		if (state->driver->type != dev->type)			continue;		if (dev->how_probe != PROBE_AWAKE) {			dev->type_index++;		}		printf("[%s]", state->driver->name);		dev->devid.bus_type = ISA_BUS_TYPE;		/* FIXME how do I handle dev->index + PROBE_AGAIN?? */		/* driver will fill in vendor and device IDs */		if (state->driver->probe(dev, state->driver->ioaddrs)) {			state->advance = (dev->index == -1);			return PROBE_WORKED;		}		putchar('\n');	}	return PROBE_FAILED;}#else#define isa_probe(d, tn) (PROBE_FAILED)#endifstatic const char *driver_name[] = {	"nic", 	"disk", 	"floppy",};int probe(struct dev *dev){	const char *type_name;	type_name = "";	if ((dev->type >= 0) && 		(dev->type < sizeof(driver_name)/sizeof(driver_name[0]))) {		type_name = driver_name[dev->type];	}	if (dev->how_probe == PROBE_FIRST) {		dev->to_probe = PROBE_PCI;		memset(&dev->state, 0, sizeof(dev->state));	}	if (dev->to_probe == PROBE_PCI) {		dev->how_probe = pci_probe(dev, type_name);		if (dev->how_probe == PROBE_FAILED) {			dev->to_probe = PROBE_ISA;		}	}	if (dev->to_probe == PROBE_ISA) {		dev->how_probe = isa_probe(dev, type_name);		if (dev->how_probe == PROBE_FAILED) {			dev->to_probe = PROBE_NONE;		}	}	if ((dev->to_probe != PROBE_PCI) &&		(dev->to_probe != PROBE_ISA)) {		dev->how_probe = PROBE_FAILED;			}	return dev->how_probe;}void disable(struct dev *dev){	if (dev->disable) {		dev->disable(dev);		dev->disable = 0;	}}

⌨️ 快捷键说明

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