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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? bootpz.c

?? linux-2.4.29操作系統(tǒng)的源碼
?? C
字號(hào):
/* * 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 */#undef DEBUG_CHECK_RANGE#define DEBUG_ADDRESSESextern 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. */	memset((char*)ZERO_PGE, 0, PAGE_SIZE);	strcpy((char*)ZERO_PGE, envval);#ifdef INITRD_IMAGE_SIZE	/* 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 */	runkernel();}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国理伦片一区二区三区在线播放| 日本一区二区视频在线| 欧美电视剧免费观看| 久久女同精品一区二区| 亚洲日本在线天堂| 午夜免费欧美电影| 在线观看视频91| 日韩精品中文字幕一区二区三区| 国产欧美日本一区视频| 亚洲免费在线观看| 免费欧美日韩国产三级电影| 国产高清久久久久| 欧美视频精品在线观看| 亚洲精品一区二区三区四区高清| 中文字幕亚洲视频| 免费在线观看一区| 99久久伊人久久99| 欧美精品欧美精品系列| 中文文精品字幕一区二区| 亚洲国产一区二区a毛片| 精品亚洲免费视频| 在线观看免费视频综合| 久久夜色精品国产噜噜av | 乱中年女人伦av一区二区| 国产成a人亚洲| 欧美日韩国产在线播放网站| 久久久久国产精品免费免费搜索| 亚洲黄色av一区| 国产伦精品一区二区三区免费迷| 色琪琪一区二区三区亚洲区| 亚洲精品一线二线三线| 伊人色综合久久天天| 国产一区二区久久| 欧美美女视频在线观看| 专区另类欧美日韩| 国产成人在线看| 日韩视频免费观看高清完整版| 亚洲欧美日韩精品久久久久| 国产在线乱码一区二区三区| 欧美午夜精品一区二区三区| 中文字幕不卡的av| 久久99精品久久久久久| 欧美视频精品在线观看| 中文字幕中文字幕一区二区| 另类综合日韩欧美亚洲| 欧美三级电影网站| 亚洲欧洲日产国码二区| 国产乱子伦一区二区三区国色天香| 欧美吞精做爰啪啪高潮| 最近中文字幕一区二区三区| 国产精品白丝jk黑袜喷水| 7878成人国产在线观看| 亚洲人成网站在线| 成人激情图片网| 精品国精品自拍自在线| 日本欧美一区二区在线观看| 91黄色免费版| 亚洲视频免费看| www.亚洲国产| 国产视频一区在线播放| 激情六月婷婷综合| 日韩欧美国产三级| 免费久久精品视频| 欧美一区日韩一区| 亚洲成人av电影| 欧美日韩一区二区欧美激情| 亚洲综合一二三区| 色噜噜狠狠成人网p站| ...av二区三区久久精品| 日韩欧美卡一卡二| 日本aⅴ亚洲精品中文乱码| 精品污污网站免费看| 亚洲精选视频免费看| 91亚洲国产成人精品一区二三| 国产喂奶挤奶一区二区三区| 国产精品99久久久久久似苏梦涵| 精品国内片67194| 国产最新精品精品你懂的| 精品国精品国产尤物美女| 久久黄色级2电影| 26uuu亚洲| 国产成人在线视频免费播放| 中文字幕+乱码+中文字幕一区| 成人av电影在线| 樱花草国产18久久久久| 欧美在线观看禁18| 午夜av一区二区| 欧美一卡2卡3卡4卡| 精品亚洲国产成人av制服丝袜| 久久久久久久综合色一本| 成人免费观看av| 亚洲欧美日韩一区二区 | 亚洲国产一区二区三区| 欧美区视频在线观看| 免费人成在线不卡| 精品va天堂亚洲国产| 国产精品1区2区| 中文字幕视频一区| 欧美视频一区在线| 美日韩黄色大片| 国产三级三级三级精品8ⅰ区| 99re这里只有精品视频首页| 亚洲一区二区三区小说| 欧美一区二区三区在线电影| 国产精品一区二区91| 国产精品成人午夜| 欧美少妇一区二区| 久久超碰97中文字幕| 国产精品理论片在线观看| 91精品福利视频| 免费精品视频在线| 国产精品视频免费| 欧美三级电影网站| 国产精品538一区二区在线| 亚洲精品福利视频网站| 91精品婷婷国产综合久久性色| 国产精品一区二区视频| 一区二区三区蜜桃| 精品奇米国产一区二区三区| www.激情成人| 日韩国产成人精品| 亚洲国产精品精华液ab| 欧美亚洲免费在线一区| 国产在线精品一区二区三区不卡| 亚洲国产成人午夜在线一区| 欧美午夜影院一区| 国产精品一区一区三区| 香蕉影视欧美成人| 国产欧美日韩另类视频免费观看| 在线免费观看成人短视频| 国产在线精品一区二区不卡了| 亚洲美女视频一区| 日韩欧美一区在线| 91一区二区在线| 黄色资源网久久资源365| 亚洲伦理在线精品| 精品国产乱子伦一区| 91国偷自产一区二区开放时间| 久久91精品久久久久久秒播| 亚洲永久免费av| 中文一区二区完整视频在线观看| 欧美一区二区三区人| 91在线精品一区二区| 激情五月婷婷综合网| 午夜电影网一区| 亚洲男同性恋视频| 亚洲国产aⅴ天堂久久| 国产精品天美传媒| 日韩一区二区免费高清| 91色porny蝌蚪| 国产成人激情av| 久久99热国产| 午夜久久久久久电影| 日韩一区在线免费观看| 久久色在线视频| 日韩一区二区免费高清| 在线观看91视频| jlzzjlzz亚洲日本少妇| 国产精品一区二区无线| 蜜桃av一区二区| 天天综合网天天综合色| 一区二区三区国产| 国产精品乱码妇女bbbb| 久久婷婷一区二区三区| 日韩欧美激情四射| 宅男噜噜噜66一区二区66| 欧美在线短视频| 色综合天天狠狠| 97se亚洲国产综合自在线| 国产福利91精品| 国产麻豆欧美日韩一区| 久久精品国产一区二区| 日本中文字幕一区二区视频 | 欧美三级午夜理伦三级中视频| 99热精品一区二区| 成人精品视频一区二区三区尤物| 久草热8精品视频在线观看| 奇米色一区二区三区四区| 午夜精品一区二区三区三上悠亚 | 精品视频在线视频| 在线视频一区二区三区| 9久草视频在线视频精品| 国产精品一二三四五| 国产一区美女在线| 国产在线精品国自产拍免费| 国内精品伊人久久久久av一坑 | 国产网红主播福利一区二区| 久久婷婷国产综合精品青草| 久久老女人爱爱| 国产免费久久精品| 国产丝袜美腿一区二区三区| 国产欧美一区二区三区鸳鸯浴| 国产欧美一区二区在线观看| 欧美国产成人在线| 成人欧美一区二区三区小说 | 91精品办公室少妇高潮对白| 在线看一区二区| 欧美久久久久免费| 日韩三级视频在线看| www国产精品av|