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

📄 ofw-shark.c

📁 microwindows移植到S3C44B0的源码
💻 C
字号:
/* * linux/arch/arm/boot/compressed/ofw-shark.c * * by Alexander Schulz <aschulz@netwinder.org> * * This file is used to get some basic information * about the memory layout of the shark we are running * on. Memory is usually divided in blocks a 8 MB. * And bootargs are copied from OpenFirmware. */#include <linux/kernel.h>#include <linux/types.h>#include <asm/setup.h>#include <asm/page.h>asmlinkage voidcreate_params (unsigned long *buffer){	/* Is there a better address? Also change in mach-shark/arch.c */	struct param_struct *params = (struct param_struct *) 0x08003000;	int j,i,m,k,nr_banks,size;	for (j=0;j<256;j++) params->u1.unused[j]=0;	size=0;	nr_banks=(unsigned int) buffer[0];	if (nr_banks > NR_BANKS) nr_banks = NR_BANKS;	for (j=0;j<nr_banks;j++){		/* search the lowest address and put it into the next entry   */		/* not a fast sort algorithm, but there are at most 8 entries */		/* and this is used only once anyway                          */		m=0xffffffff;		for (i=0;i<(unsigned int) buffer[0];i++){			if (buffer[2*i+1]<m) {				m=buffer[2*i+1];				k=i;			}		}	  		/* using pages_in_bank for startaddress and size               */		/* start is in bytes, size in pages and not bigger than 0x2000 */		/* This is decoded in fixup_shark in arch/arm/kernel/arch.c    */		params->u1.s.pages_in_bank[j]=buffer[2*k+1]|(buffer[2*k+2]/PAGE_SIZE);		size += buffer[2*k+2];		buffer[2*k+1]=0xffffffff;                    /* mark as copied             */	}		params->u1.s.page_size = PAGE_SIZE;	params->u1.s.nr_pages  = size/PAGE_SIZE;	params->u1.s.flags     = FLAG_READONLY;		/* Copy over the bootargs */	for (j=0;j<128/4;j++) {		((unsigned long *) params->commandline)[j]=buffer[33+j];	}}typedef int (*ofw_handle_t)(void *);/* Everything below is called with a wrong MMU setting. * This means: no string constants, no initialization of * arrays, no global variables! This is ugly but I didn't * want to write this in assembler :-) */intof_decode_int(const unsigned char *p){	unsigned int i = *p++ << 8;	i = (i + *p++) << 8;	i = (i + *p++) << 8;	return (i + *p);}  intOF_finddevice(ofw_handle_t openfirmware, char *name){	unsigned int args[8];	char service[12];	service[0]='f';	service[1]='i';	service[2]='n';	service[3]='d';	service[4]='d';	service[5]='e';	service[6]='v';	service[7]='i';	service[8]='c';	service[9]='e';	service[10]='\0';	args[0]=(unsigned int)service;	args[1]=1;	args[2]=1;	args[3]=(unsigned int)name;	if (openfirmware(args) == -1)		return -1;	return args[4];}intOF_getproplen(ofw_handle_t openfirmware, int handle, char *prop){	unsigned int args[8];	char service[12];	service[0]='g';	service[1]='e';	service[2]='t';	service[3]='p';	service[4]='r';	service[5]='o';	service[6]='p';	service[7]='l';	service[8]='e';	service[9]='n';	service[10]='\0';	args[0] = (unsigned int)service;	args[1] = 2;	args[2] = 1;	args[3] = (unsigned int)handle;	args[4] = (unsigned int)prop;	if (openfirmware(args) == -1)		return -1;	return args[5];}  intOF_getprop(ofw_handle_t openfirmware, int handle, char *prop, void *buf, unsigned int buflen){	unsigned int args[8];	char service[8];	service[0]='g';	service[1]='e';	service[2]='t';	service[3]='p';	service[4]='r';	service[5]='o';	service[6]='p';	service[7]='\0';	args[0] = (unsigned int)service;	args[1] = 4;	args[2] = 1;	args[3] = (unsigned int)handle;	args[4] = (unsigned int)prop;	args[5] = (unsigned int)buf;	args[6] = buflen;	if (openfirmware(args) == -1)		return -1;	return args[7];}  asmlinkage void ofw_init(ofw_handle_t o, int *nomr, int *pointer){	int phandle,i,mem_len,buffer[32];	char temp[12];  	temp[0]='/';	temp[1]='m';	temp[2]='e';	temp[3]='m';	temp[4]='o';	temp[5]='r';	temp[6]='y';	temp[7]='\0';	phandle=OF_finddevice(o,temp);	temp[0]='r';	temp[1]='e';	temp[2]='g';	temp[3]='\0';	mem_len = OF_getproplen(o,phandle, temp);	OF_getprop(o,phandle, temp, buffer, mem_len);	*nomr=mem_len >> 3;	for (i=0; i<=mem_len/4; i++) pointer[i]=of_decode_int((const unsigned char *)&buffer[i]);	temp[0]='/';	temp[1]='c';	temp[2]='h';	temp[3]='o';	temp[4]='s';	temp[5]='e';	temp[6]='n';	temp[7]='\0';	phandle=OF_finddevice(o,temp);	temp[0]='b';	temp[1]='o';	temp[2]='o';	temp[3]='t';	temp[4]='a';	temp[5]='r';	temp[6]='g';	temp[7]='s';	temp[8]='\0';	mem_len = OF_getproplen(o,phandle, temp);	OF_getprop(o,phandle, temp, buffer, mem_len);	for (i=0; i<=mem_len/4; i++) pointer[i+32]=buffer[i];  }

⌨️ 快捷键说明

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