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

📄 misc.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		puts("\n");	}	if ( residual )	{		puts("board data at: "); puthex((unsigned long)residual);		puts(" ");		puthex((unsigned long)((unsigned long)residual + sizeof(RESIDUAL)));		puts("\n");		puts("relocated to:  ");		puthex((unsigned long)hold_residual);		puts(" ");		puthex((unsigned long)((unsigned long)hold_residual + sizeof(RESIDUAL)));		puts("\n");	}	/* we have to subtract 0x10000 here to correct for objdump including the	   size of the elf header which we strip -- Cort */	zimage_start = (char *)(load_addr - 0x10000 + ZIMAGE_OFFSET);	zimage_size = ZIMAGE_SIZE;	if ( INITRD_OFFSET )		initrd_start = load_addr - 0x10000 + INITRD_OFFSET;	else		initrd_start = 0;	initrd_end = INITRD_SIZE + initrd_start;	/*	 * Find a place to stick the zimage and initrd and 	 * relocate them if we have to. -- Cort	 */	avail_ram = (char *)PAGE_ALIGN((unsigned long)_end);	puts("zimage at:     "); puthex((unsigned long)zimage_start);	puts(" "); puthex((unsigned long)(zimage_size+zimage_start)); puts("\n");	if ( (unsigned long)zimage_start <= 0x00800000 )	{		memcpy( (void *)avail_ram, (void *)zimage_start, zimage_size );		zimage_start = (char *)avail_ram;		puts("relocated to:  "); puthex((unsigned long)zimage_start);		puts(" ");		puthex((unsigned long)zimage_size+(unsigned long)zimage_start);		puts("\n");		avail_ram += zimage_size;	}	/* relocate initrd */	if ( initrd_start )	{		puts("initrd at:     "); puthex(initrd_start);		puts(" "); puthex(initrd_end); puts("\n");		if ( (unsigned long)initrd_start <= 0x00800000 )		{			memcpy( (void *)avail_ram,				(void *)initrd_start, initrd_end-initrd_start );			puts("relocated to:  ");			initrd_end = (unsigned long) avail_ram + (initrd_end-initrd_start);			initrd_start = (unsigned long)avail_ram;			puthex((unsigned long)initrd_start);			puts(" ");			puthex((unsigned long)initrd_end);			puts("\n");		}		avail_ram = (char *)PAGE_ALIGN((unsigned long)initrd_end);	}	avail_ram = (char *)0x00400000;	end_avail = (char *)0x00800000;	puts("avail ram:     "); puthex((unsigned long)avail_ram); puts(" ");	puthex((unsigned long)end_avail); puts("\n");	if (keyb_present)		CRT_tstc();  /* Forces keyboard to be initialized */	puts("\nLinux/PPC load: ");	timer = 0;	cp = cmd_line;	memcpy (cmd_line, cmd_preset, sizeof(cmd_preset));	while ( *cp ) putc(*cp++);	while (timer++ < 5*1000) {		if (tstc()) {			while ((ch = getc()) != '\n' && ch != '\r') {				if (ch == '\b') {					if (cp != cmd_line) {						cp--;						puts("\b \b");					}				} else {					*cp++ = ch;					putc(ch);				}			}			break;  /* Exit 'timer' loop */		}		udelay(1000);  /* 1 msec */	}	*cp = 0;	puts("\n");	puts("Uncompressing Linux...");	gunzip(0, 0x400000, zimage_start, &zimage_size);	puts("done.\n");		{		struct bi_record *rec;	    		rec = (struct bi_record *)PAGE_ALIGN(zimage_size);	    		rec->tag = BI_FIRST;		rec->size = sizeof(struct bi_record);		rec = (struct bi_record *)((unsigned long)rec + rec->size);		rec->tag = BI_BOOTLOADER_ID;		memcpy( (void *)rec->data, "prepboot", 9);		rec->size = sizeof(struct bi_record) + 8 + 1;		rec = (struct bi_record *)((unsigned long)rec + rec->size);	    		rec->tag = BI_MACHTYPE;		rec->data[0] = _MACH_prep;		rec->data[1] = 1;		rec->size = sizeof(struct bi_record) + sizeof(unsigned long);		rec = (struct bi_record *)((unsigned long)rec + rec->size);	    		rec->tag = BI_CMD_LINE;		memcpy( (char *)rec->data, cmd_line, strlen(cmd_line)+1);		rec->size = sizeof(struct bi_record) + strlen(cmd_line) + 1;		rec = (struct bi_record *)((ulong)rec + rec->size);				rec->tag = BI_LAST;		rec->size = sizeof(struct bi_record);		rec = (struct bi_record *)((unsigned long)rec + rec->size);	}	puts("Now booting the kernel\n");	return (unsigned long)hold_residual;}void puthex(unsigned long val){	unsigned char buf[10];	int i;	for (i = 7;  i >= 0;  i--)	{		buf[i] = "0123456789ABCDEF"[val & 0x0F];		val >>= 4;	}	buf[8] = '\0';	puts(buf);}/* * PCI/ISA I/O support */volatile unsigned char *ISA_io  = (unsigned char *)0x80000000;volatile unsigned char *ISA_mem = (unsigned char *)0xC0000000;voidoutb(int port, char val){	/* Ensure I/O operations complete */	__asm__ volatile("eieio");	ISA_io[port] = val;}unsigned charinb(int port){	/* Ensure I/O operations complete */	__asm__ volatile("eieio");	return (ISA_io[port]);}unsigned longlocal_to_PCI(unsigned long addr){	return ((addr & 0x7FFFFFFF) | 0x80000000);}void_bcopy(char *src, char *dst, int len){	while (len--) *dst++ = *src++;}#define FALSE 0#define TRUE  1#include <stdarg.h>intstrlen(char *s){	int len = 0;	while (*s++) len++;	return len;}_printk(char const *fmt, ...){	int ret;	va_list ap;	va_start(ap, fmt);	ret = _vprintk(putc, fmt, ap);	va_end(ap);	return (ret);}#define is_digit(c) ((c >= '0') && (c <= '9'))int_vprintk(putc, fmt0, ap)int (*putc)();const char *fmt0;va_list ap;{	char c, sign, *cp;	int left_prec, right_prec, zero_fill, length, pad, pad_on_right;	char buf[32];	long val;	while (c = *fmt0++)	{		if (c == '%')		{			c = *fmt0++;			left_prec = right_prec = pad_on_right = 0;			if (c == '-')			{				c = *fmt0++;				pad_on_right++;			}			if (c == '0')			{				zero_fill = TRUE;				c = *fmt0++;			} else			{				zero_fill = FALSE;			}			while (is_digit(c))			{				left_prec = (left_prec * 10) + (c - '0');				c = *fmt0++;			}			if (c == '.')			{				c = *fmt0++;				zero_fill++;				while (is_digit(c))				{					right_prec = (right_prec * 10) + (c - '0');					c = *fmt0++;				}			} else			{				right_prec = left_prec;			}			sign = '\0';			switch (c)			{			case 'd':			case 'x':			case 'X':				val = va_arg(ap, long);				switch (c)				{				case 'd':					if (val < 0)					{						sign = '-';						val = -val;					}					length = _cvt(val, buf, 10, "0123456789");					break;				case 'x':					length = _cvt(val, buf, 16, "0123456789abcdef");					break;				case 'X':					length = _cvt(val, buf, 16, "0123456789ABCDEF");					break;				}				cp = buf;				break;			case 's':				cp = va_arg(ap, char *);				length = strlen(cp);				break;			case 'c':				c = va_arg(ap, long /*char*/);				(*putc)(c);				continue;			default:				(*putc)('?');			}			pad = left_prec - length;			if (sign != '\0')			{				pad--;			}			if (zero_fill)			{				c = '0';				if (sign != '\0')				{					(*putc)(sign);					sign = '\0';				}			} else			{				c = ' ';			}			if (!pad_on_right)			{				while (pad-- > 0)				{					(*putc)(c);				}			}			if (sign != '\0')			{				(*putc)(sign);			}			while (length-- > 0)			{				(*putc)(c = *cp++);				if (c == '\n')				{					(*putc)('\r');				}			}			if (pad_on_right)			{				while (pad-- > 0)				{					(*putc)(c);				}			}		} else		{			(*putc)(c);			if (c == '\n')			{				(*putc)('\r');			}		}	}}int _cvt(unsigned long val, char *buf, long radix, char *digits){	char temp[80];	char *cp = temp;	int length = 0;	if (val == 0)	{ /* Special case */		*cp++ = '0';	} else		while (val)		{			*cp++ = digits[val % radix];			val /= radix;		}	while (cp != temp)	{		*buf++ = *--cp;		length++;	}	*buf = '\0';	return (length);}_dump_buf_with_offset(unsigned char *p, int s, unsigned char *base){	int i, c;	if ((unsigned int)s > (unsigned int)p)	{		s = (unsigned int)s - (unsigned int)p;	}	while (s > 0)	{		if (base)		{			_printk("%06X: ", (int)p - (int)base);		} else		{			_printk("%06X: ", p);		}		for (i = 0;  i < 16;  i++)		{			if (i < s)			{				_printk("%02X", p[i] & 0xFF);			} else			{				_printk("  ");			}			if ((i % 2) == 1) _printk(" ");			if ((i % 8) == 7) _printk(" ");		}		_printk(" |");		for (i = 0;  i < 16;  i++)		{			if (i < s)			{				c = p[i] & 0xFF;				if ((c < 0x20) || (c >= 0x7F)) c = '.';			} else			{				c = ' ';			}			_printk("%c", c);		}		_printk("|\n");		s -= 16;		p += 16;	}}_dump_buf(unsigned char *p, int s){	_printk("\n");	_dump_buf_with_offset(p, s, 0);}

⌨️ 快捷键说明

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