亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bootpz.c

?? linux-2.6.15.6
?? C
字號:
/* * arch/alpha/boot/bootpz.c * * Copyright (C) 1997 Jay Estabrook * * This file is used for creating a compressed BOOTP file for the * Linux/AXP kernel * * based significantly on the arch/alpha/boot/main.c of Linus Torvalds * and the decompression code from MILO. */#include <linux/kernel.h>#include <linux/string.h>#include <linux/version.h>#include <linux/mm.h>#include <asm/system.h>#include <asm/console.h>#include <asm/hwrpb.h>#include <asm/pgtable.h>#include <asm/io.h>#include <stdarg.h>#include "kzsize.h"/* FIXME FIXME FIXME */#define MALLOC_AREA_SIZE 0x200000 /* 2MB for now *//* FIXME FIXME FIXME *//*  WARNING NOTE  It is very possible that turning on additional messages may cause  kernel image corruption due to stack usage to do the printing.*/#undef DEBUG_CHECK_RANGE#undef DEBUG_ADDRESSES#undef DEBUG_LAST_STEPSextern unsigned long switch_to_osf_pal(unsigned long nr,	struct pcb_struct * pcb_va, struct pcb_struct * pcb_pa,	unsigned long *vptb);extern int decompress_kernel(void* destination, void *source,			     size_t ksize, size_t kzsize);extern void move_stack(unsigned long new_stack);struct hwrpb_struct *hwrpb = INIT_HWRPB;static struct pcb_struct pcb_va[1];/* * Find a physical address of a virtual object.. * * This is easy using the virtual page table address. */#define VPTB	((unsigned long *) 0x200000000)static inline unsigned longfind_pa(unsigned long address){	unsigned long result;	result = VPTB[address >> 13];	result >>= 32;	result <<= 13;	result |= address & 0x1fff;	return result;}	intcheck_range(unsigned long vstart, unsigned long vend,	    unsigned long kstart, unsigned long kend){	unsigned long vaddr, kaddr;#ifdef DEBUG_CHECK_RANGE	srm_printk("check_range: V[0x%lx:0x%lx] K[0x%lx:0x%lx]\n",		   vstart, vend, kstart, kend);#endif	/* do some range checking for detecting an overlap... */	for (vaddr = vstart; vaddr <= vend; vaddr += PAGE_SIZE)	{		kaddr = (find_pa(vaddr) | PAGE_OFFSET);		if (kaddr >= kstart && kaddr <= kend)		{#ifdef DEBUG_CHECK_RANGE			srm_printk("OVERLAP: vaddr 0x%lx kaddr 0x%lx"				   " [0x%lx:0x%lx]\n",				   vaddr, kaddr, kstart, kend);#endif			return 1;		}	}	return 0;}/* * This function moves into OSF/1 pal-code, and has a temporary * PCB for that. The kernel proper should replace this PCB with * the real one as soon as possible. * * The page table muckery in here depends on the fact that the boot * code has the L1 page table identity-map itself in the second PTE * in the L1 page table. Thus the L1-page is virtually addressable * itself (through three levels) at virtual address 0x200802000. */#define L1	((unsigned long *) 0x200802000)voidpal_init(void){	unsigned long i, rev;	struct percpu_struct * percpu;	struct pcb_struct * pcb_pa;	/* Create the dummy PCB.  */	pcb_va->ksp = 0;	pcb_va->usp = 0;	pcb_va->ptbr = L1[1] >> 32;	pcb_va->asn = 0;	pcb_va->pcc = 0;	pcb_va->unique = 0;	pcb_va->flags = 1;	pcb_va->res1 = 0;	pcb_va->res2 = 0;	pcb_pa = (struct pcb_struct *)find_pa((unsigned long)pcb_va);	/*	 * a0 = 2 (OSF)	 * a1 = return address, but we give the asm the vaddr of the PCB	 * a2 = physical addr of PCB	 * a3 = new virtual page table pointer	 * a4 = KSP (but the asm sets it)	 */	srm_printk("Switching to OSF PAL-code... ");	i = switch_to_osf_pal(2, pcb_va, pcb_pa, VPTB);	if (i) {		srm_printk("failed, code %ld\n", i);		__halt();	}	percpu = (struct percpu_struct *)		(INIT_HWRPB->processor_offset + (unsigned long) INIT_HWRPB);	rev = percpu->pal_revision = percpu->palcode_avail[2];	srm_printk("OK (rev %lx)\n", rev);	tbia(); /* do it directly in case we are SMP */}/* * Start the kernel. */static inline voidrunkernel(void){	__asm__ __volatile__(		"bis %0,%0,$27\n\t"		"jmp ($27)"		: /* no outputs: it doesn't even return */		: "r" (START_ADDR));}/* Must record the SP (it is virtual) on entry, so we can make sure   not to overwrite it during movement or decompression. */unsigned long SP_on_entry;/* Calculate the kernel image address based on the end of the BOOTP   bootstrapper (ie this program).*/extern char _end;#define KERNEL_ORIGIN \	((((unsigned long)&_end) + 511) & ~511)/* Round address to next higher page boundary. */#define NEXT_PAGE(a)	(((a) | (PAGE_SIZE - 1)) + 1)#ifdef INITRD_IMAGE_SIZE# define REAL_INITRD_SIZE INITRD_IMAGE_SIZE#else# define REAL_INITRD_SIZE 0#endif/* Defines from include/asm-alpha/system.h	BOOT_ADDR	Virtual address at which the consoles loads			the BOOTP image.	KERNEL_START    KSEG address at which the kernel is built to run,			which includes some initial data pages before the			code.	START_ADDR	KSEG address of the entry point of kernel code.	ZERO_PGE	KSEG address of page full of zeroes, but 			upon entry to kerne cvan be expected			to hold the parameter list and possible			INTRD information.   These are used in the local defines below.*/  /* Virtual addresses for the BOOTP image. Note that this includes the   bootstrapper code as well as the compressed kernel image, and   possibly the INITRD image.   Oh, and do NOT forget the STACK, which appears to be placed virtually   beyond the end of the loaded image.*/#define V_BOOT_IMAGE_START	BOOT_ADDR#define V_BOOT_IMAGE_END	SP_on_entry/* Virtual addresses for just the bootstrapper part of the BOOTP image. */#define V_BOOTSTRAPPER_START	BOOT_ADDR#define V_BOOTSTRAPPER_END	KERNEL_ORIGIN/* Virtual addresses for just the data part of the BOOTP   image. This may also include the INITRD image, but always   includes the STACK.*/#define V_DATA_START		KERNEL_ORIGIN#define V_INITRD_START		(KERNEL_ORIGIN + KERNEL_Z_SIZE)#define V_INTRD_END		(V_INITRD_START + REAL_INITRD_SIZE)#define V_DATA_END	 	V_BOOT_IMAGE_END/* KSEG addresses for the uncompressed kernel.   Note that the end address includes workspace for the decompression.   Note also that the DATA_START address is ZERO_PGE, to which we write   just before jumping to the kernel image at START_ADDR. */#define K_KERNEL_DATA_START	ZERO_PGE#define K_KERNEL_IMAGE_START	START_ADDR#define K_KERNEL_IMAGE_END	(START_ADDR + KERNEL_SIZE)/* Define to where we may have to decompress the kernel image, before   we move it to the final position, in case of overlap. This will be   above the final position of the kernel.   Regardless of overlap, we move the INITRD image to the end of this   copy area, because there needs to be a buffer area after the kernel   for "bootmem" anyway.*/#define K_COPY_IMAGE_START	NEXT_PAGE(K_KERNEL_IMAGE_END)/* Reserve one page below INITRD for the new stack. */#define K_INITRD_START \    NEXT_PAGE(K_COPY_IMAGE_START + KERNEL_SIZE + PAGE_SIZE)#define K_COPY_IMAGE_END \    (K_INITRD_START + REAL_INITRD_SIZE + MALLOC_AREA_SIZE)#define K_COPY_IMAGE_SIZE \    NEXT_PAGE(K_COPY_IMAGE_END - K_COPY_IMAGE_START)voidstart_kernel(void){	int must_move = 0;	/* Initialize these for the decompression-in-place situation,	   which is the smallest amount of work and most likely to	   occur when using the normal START_ADDR of the kernel	   (currently set to 16MB, to clear all console code.	*/	unsigned long uncompressed_image_start = K_KERNEL_IMAGE_START;	unsigned long uncompressed_image_end = K_KERNEL_IMAGE_END;	unsigned long initrd_image_start = K_INITRD_START;	/*	 * Note that this crufty stuff with static and envval	 * and envbuf is because:	 *	 * 1. Frequently, the stack is short, and we don't want to overrun;	 * 2. Frequently the stack is where we are going to copy the kernel to;	 * 3. A certain SRM console required the GET_ENV output to stack.	 *    ??? A comment in the aboot sources indicates that the GET_ENV	 *    destination must be quadword aligned.  Might this explain the	 *    behaviour, rather than requiring output to the stack, which	 *    seems rather far-fetched.	 */	static long nbytes;	static char envval[256] __attribute__((aligned(8)));	register unsigned long asm_sp asm("30");	SP_on_entry = asm_sp;	srm_printk("Linux/Alpha BOOTPZ Loader for Linux " UTS_RELEASE "\n");	/* Validity check the HWRPB. */	if (INIT_HWRPB->pagesize != 8192) {		srm_printk("Expected 8kB pages, got %ldkB\n",		           INIT_HWRPB->pagesize >> 10);		return;	}	if (INIT_HWRPB->vptb != (unsigned long) VPTB) {		srm_printk("Expected vptb at %p, got %p\n",			   VPTB, (void *)INIT_HWRPB->vptb);		return;	}	/* PALcode (re)initialization. */	pal_init();	/* Get the parameter list from the console environment variable. */	nbytes = callback_getenv(ENV_BOOTED_OSFLAGS, envval, sizeof(envval));	if (nbytes < 0 || nbytes >= sizeof(envval)) {		nbytes = 0;	}	envval[nbytes] = '\0';#ifdef DEBUG_ADDRESSES	srm_printk("START_ADDR 0x%lx\n", START_ADDR);	srm_printk("KERNEL_ORIGIN 0x%lx\n", KERNEL_ORIGIN);	srm_printk("KERNEL_SIZE 0x%x\n", KERNEL_SIZE);	srm_printk("KERNEL_Z_SIZE 0x%x\n", KERNEL_Z_SIZE);#endif	/* Since all the SRM consoles load the BOOTP image at virtual	 * 0x20000000, we have to ensure that the physical memory	 * pages occupied by that image do NOT overlap the physical	 * address range where the kernel wants to be run.  This	 * causes real problems when attempting to cdecompress the	 * former into the latter... :-(	 *	 * So, we may have to decompress/move the kernel/INITRD image	 * virtual-to-physical someplace else first before moving	 * kernel /INITRD to their final resting places... ;-}	 *	 * Sigh...	 */	/* First, check to see if the range of addresses occupied by	   the bootstrapper part of the BOOTP image include any of the	   physical pages into which the kernel will be placed for	   execution.	   We only need check on the final kernel image range, since we	   will put the INITRD someplace that we can be sure is not	   in conflict.	 */	if (check_range(V_BOOTSTRAPPER_START, V_BOOTSTRAPPER_END,			K_KERNEL_DATA_START, K_KERNEL_IMAGE_END))	{		srm_printk("FATAL ERROR: overlap of bootstrapper code\n");		__halt();	}	/* Next, check to see if the range of addresses occupied by	   the compressed kernel/INITRD/stack portion of the BOOTP	   image include any of the physical pages into which the	   decompressed kernel or the INITRD will be placed for	   execution.	 */	if (check_range(V_DATA_START, V_DATA_END,			K_KERNEL_IMAGE_START, K_COPY_IMAGE_END))	{#ifdef DEBUG_ADDRESSES		srm_printk("OVERLAP: cannot decompress in place\n");#endif		uncompressed_image_start = K_COPY_IMAGE_START;		uncompressed_image_end = K_COPY_IMAGE_END;		must_move = 1;		/* Finally, check to see if the range of addresses		   occupied by the compressed kernel/INITRD part of		   the BOOTP image include any of the physical pages		   into which that part is to be copied for		   decompression.		*/		while (check_range(V_DATA_START, V_DATA_END,				   uncompressed_image_start,				   uncompressed_image_end))		{#if 0			uncompressed_image_start += K_COPY_IMAGE_SIZE;			uncompressed_image_end += K_COPY_IMAGE_SIZE;			initrd_image_start += K_COPY_IMAGE_SIZE;#else			/* Keep as close as possible to end of BOOTP image. */			uncompressed_image_start += PAGE_SIZE;			uncompressed_image_end += PAGE_SIZE;			initrd_image_start += PAGE_SIZE;#endif		}	}	srm_printk("Starting to load the kernel with args '%s'\n", envval);#ifdef DEBUG_ADDRESSES	srm_printk("Decompressing the kernel...\n"		   "...from 0x%lx to 0x%lx size 0x%x\n",		   V_DATA_START,		   uncompressed_image_start,		   KERNEL_SIZE);#endif        decompress_kernel((void *)uncompressed_image_start,			  (void *)V_DATA_START,			  KERNEL_SIZE, KERNEL_Z_SIZE);	/*	 * Now, move things to their final positions, if/as required.	 */#ifdef INITRD_IMAGE_SIZE	/* First, we always move the INITRD image, if present. */#ifdef DEBUG_ADDRESSES	srm_printk("Moving the INITRD image...\n"		   " from 0x%lx to 0x%lx size 0x%x\n",		   V_INITRD_START,		   initrd_image_start,		   INITRD_IMAGE_SIZE);#endif	memcpy((void *)initrd_image_start, (void *)V_INITRD_START,	       INITRD_IMAGE_SIZE);#endif /* INITRD_IMAGE_SIZE */	/* Next, we may have to move the uncompressed kernel to the	   final destination.	 */	if (must_move) {#ifdef DEBUG_ADDRESSES		srm_printk("Moving the uncompressed kernel...\n"			   "...from 0x%lx to 0x%lx size 0x%x\n",			   uncompressed_image_start,			   K_KERNEL_IMAGE_START,			   (unsigned)KERNEL_SIZE);#endif		/*		 * Move the stack to a safe place to ensure it won't be		 * overwritten by kernel image.		 */		move_stack(initrd_image_start - PAGE_SIZE);		memcpy((void *)K_KERNEL_IMAGE_START,		       (void *)uncompressed_image_start, KERNEL_SIZE);	}		/* Clear the zero page, then move the argument list in. */#ifdef DEBUG_LAST_STEPS	srm_printk("Preparing ZERO_PGE...\n");#endif	memset((char*)ZERO_PGE, 0, PAGE_SIZE);	strcpy((char*)ZERO_PGE, envval);#ifdef INITRD_IMAGE_SIZE#ifdef DEBUG_LAST_STEPS	srm_printk("Preparing INITRD info...\n");#endif	/* Finally, set the INITRD paramenters for the kernel. */	((long *)(ZERO_PGE+256))[0] = initrd_image_start;	((long *)(ZERO_PGE+256))[1] = INITRD_IMAGE_SIZE;#endif /* INITRD_IMAGE_SIZE */#ifdef DEBUG_LAST_STEPS	srm_printk("Doing 'runkernel()'...\n");#endif	runkernel();}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡视频在线| 无吗不卡中文字幕| 精品欧美久久久| 日韩三级伦理片妻子的秘密按摩| 色综合天天综合狠狠| 不卡一区二区在线| 97se亚洲国产综合在线| 91欧美一区二区| 92国产精品观看| 在线看日本不卡| 欧美精品国产精品| 日韩精品一区二区三区视频播放 | 国产视频一区在线播放| 久久综合五月天婷婷伊人| 精品国产乱码久久| 国产午夜精品一区二区三区嫩草| 国产亚洲va综合人人澡精品| 国产精品久久久久影院| 亚洲激情一二三区| 视频在线在亚洲| 黄色日韩网站视频| 99久久婷婷国产| 欧美日韩日本视频| 久久久久综合网| 亚洲精品免费视频| 美女网站视频久久| 97se亚洲国产综合自在线| 欧美美女一区二区三区| 久久人人超碰精品| 一区二区三区在线影院| 激情偷乱视频一区二区三区| 播五月开心婷婷综合| 欧美三级韩国三级日本一级| 日韩免费看的电影| ●精品国产综合乱码久久久久 | 性欧美大战久久久久久久久| 久久精品国产澳门| 99视频在线观看一区三区| 欧美一级欧美三级| 国产精品成人在线观看| 麻豆精品一区二区| 色哟哟日韩精品| 久久久国产精品午夜一区ai换脸| 夜夜亚洲天天久久| 国产成人av一区二区三区在线 | 欧美α欧美αv大片| 亚洲视频免费在线观看| 国内精品久久久久影院色| 欧美调教femdomvk| 国产精品久久久一本精品| 日产国产欧美视频一区精品| 99久久99久久精品国产片果冻| 欧美一卡二卡三卡| 一区二区三区精品视频在线| 国产成人高清视频| 欧美成人一区二区| 五月婷婷激情综合| 色婷婷精品久久二区二区蜜臀av| 国产调教视频一区| 激情综合色综合久久| 欧美午夜精品免费| 亚洲免费观看高清完整版在线| 国产成人精品一区二区三区网站观看 | 免费成人美女在线观看| 日本电影欧美片| 国产精品不卡在线观看| 国产激情精品久久久第一区二区| 日韩欧美在线网站| 午夜精品福利一区二区蜜股av| 91香蕉视频污| 亚洲欧洲成人av每日更新| 丁香网亚洲国际| 久久久91精品国产一区二区精品 | 夜夜夜精品看看| 91久久精品一区二区| 亚洲丝袜自拍清纯另类| www.66久久| 亚洲丝袜制服诱惑| 色av成人天堂桃色av| 亚洲精品国产视频| 在线观看一区不卡| 午夜精品视频在线观看| 欧美日韩一区二区电影| 日韩黄色在线观看| 日韩一区二区三区电影在线观看 | 精品日韩av一区二区| 激情五月播播久久久精品| 久久综合久久鬼色中文字| 国产伦精一区二区三区| 欧美激情中文不卡| 一本色道久久综合亚洲91| 亚洲成精国产精品女| 日韩女优av电影| 99久久99久久久精品齐齐| 亚洲欧洲日本在线| 欧美二区三区91| 国产一区二区三区日韩| 国产精品国产三级国产aⅴ无密码| av亚洲产国偷v产偷v自拍| 一区二区三区日韩欧美精品 | 国产精品1区2区3区在线观看| www国产精品av| 国产91精品入口| 一区二区三区四区高清精品免费观看| 欧美日韩午夜影院| 国产一区二区三区四区在线观看 | 欧美中文一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 久久久综合网站| 91社区在线播放| 首页国产欧美久久| 国产精品看片你懂得| 在线成人高清不卡| 粉嫩绯色av一区二区在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 日韩色视频在线观看| www.成人网.com| 久久99精品国产麻豆婷婷洗澡| 亚洲人精品一区| 精品日韩一区二区三区 | 久久99精品国产麻豆不卡| 亚洲欧洲av另类| 日韩欧美在线网站| 在线观看亚洲精品| 成人黄色国产精品网站大全在线免费观看| 亚洲国产一区二区三区青草影视| 国产喷白浆一区二区三区| 欧美老年两性高潮| 99久久综合99久久综合网站| 免费观看在线综合| 一级精品视频在线观看宜春院| 中文字幕精品综合| 日韩一区二区三区视频| 欧美日韩精品一二三区| av电影天堂一区二区在线观看| 老司机免费视频一区二区三区| 亚洲永久免费视频| 国产精品盗摄一区二区三区| 国产亚洲短视频| 久久日一线二线三线suv| 91精品麻豆日日躁夜夜躁| 一本一道综合狠狠老| 成人午夜av在线| 国产精选一区二区三区| 精品亚洲aⅴ乱码一区二区三区| 亚洲成人一区二区| 亚洲一二三四久久| 亚洲精选在线视频| 一区二区三区四区乱视频| 亚洲日本成人在线观看| 国产精品伦理在线| 国产精品久久久久久久久久免费看| 久久综合九色综合欧美98| 26uuu欧美| www国产成人| 国产欧美日韩在线看| 国产欧美日韩视频一区二区| 国产亚洲综合性久久久影院| 久久亚洲精华国产精华液| 久久久久久亚洲综合| 亚洲国产高清aⅴ视频| 成人免费一区二区三区在线观看| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 久久久久国产精品麻豆| 久久先锋影音av| 久久精品免视看| 国产精品美女久久福利网站| 亚洲欧洲精品天堂一级| 亚洲一二三四久久| 日本va欧美va精品发布| 国产九色精品成人porny| bt欧美亚洲午夜电影天堂| 色菇凉天天综合网| 日韩一区二区三区精品视频 | 亚洲女爱视频在线| 一区二区三区精品| 另类小说图片综合网| 国产成人精品1024| 在线观看国产日韩| 精品国产在天天线2019| 国产精品免费视频一区| 亚洲一二三专区| 韩日欧美一区二区三区| 色哟哟精品一区| 日韩西西人体444www| 国产日本欧美一区二区| 午夜影院在线观看欧美| 国产成人在线看| 欧美日韩日日夜夜| 中文乱码免费一区二区| 午夜伊人狠狠久久| 国产成人精品影视| 宅男噜噜噜66一区二区66| 国产女主播视频一区二区| 一区二区欧美视频| 国产精品1区2区3区在线观看| 欧美日韩一区三区| 日韩一区在线播放| 国产精品99久久久久| 欧美精品色综合|