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

📄 proll.patch

📁 qemu虚拟机代码
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+	{"ttyb-rts-dtr-off",	0, -1},+	{NULL, NULL, -1}+};++static int prop_mem_reg[3];+static int prop_mem_avail[3];++static const struct property propv_memory[] = {+	{"name",	"memory", sizeof("memory")},+	{"reg",		(char*)&prop_mem_reg[0], sizeof(prop_mem_reg) },+	{"available",	(char*)&prop_mem_avail[0], sizeof(prop_mem_avail) },+	{NULL, NULL, -1}+};++static int prop_vmem_avail[6];++static const struct property propv_vmemory[] = {+	{"name",	"virtual-memory", sizeof("virtual-memory")},+	{"available",	(char*)&prop_vmem_avail[0], sizeof(prop_vmem_avail) },+	{NULL, NULL, -1}+};++static const struct node nodes[] = {+	{ &null_properties,	 1,  0 }, /* 0 = big brother of root */+	{ propv_root,		 0,  2 }, /*  1 "/" */+	{ propv_iommu,		12,  3 }, /*  2 "/iommu" */+	{ propv_sbus,		 0,  4 }, /*  3 "/iommu/sbus" */+	{ propv_sbus_tcx,	 5,  0 }, /*  4 "/iommu/sbus/SUNW,tcx" */+	{ propv_sbus_ledma,	 7,  6 }, /*  5 "/iommu/sbus/ledma" */+	{ propv_sbus_ledma_le,	 0,  0 }, /*  6 "/iommu/sbus/ledma/le" */+	{ propv_sbus_cs4231,	 8,  0 }, /*  7 "/iommu/sbus/SUNW,CS4231 */+	{ propv_sbus_bpp,	 9,  0 }, /*  8 "/iommu/sbus/SUNW,bpp */+	{ propv_sbus_espdma,	11, 10 }, /*  9 "/iommu/sbus/espdma" */+	{ propv_sbus_espdma_esp, 0,  0 }, /* 10 "/iommu/sbus/espdma/esp" */+	{ propv_sbus_apc,	 0,  0 }, /* 11 "/iommu/sbus/power-management */+	{ propv_cpu,		13,  0 }, /* 12 "/STP1012PGA" */+	{ propv_obio,		23, 14 }, /* 13 "/obio" */+	{ propv_obio_int,	15,  0 }, /* 14 "/obio/interrupt" */+	{ propv_obio_cnt,	16,  0 }, /* 15 "/obio/counter" */+	{ propv_obio_eep,	17,  0 }, /* 16 "/obio/eeprom" */+	{ propv_obio_auxio,	18,  0 }, /* 17 "/obio/auxio" */+	{ propv_obio_zs1,	19,  0 }, /* 18 "/obio/zs@0,100000"+					     Must be before zs@0,0! */+	{ propv_obio_zs,	20,  0 }, /* 19 "/obio/zs@0,0" */+	{ propv_obio_fd,	21,  0 }, /* 20 "/obio/SUNW,fdtwo" */+	{ propv_obio_pw,	22,  0 }, /* 21 "/obio/power" */+	{ propv_obio_cf,	 0,  0 }, /* 22 "/obio/slavioconfig@0,800000" */+	{ propv_options,	24,  0 }, /* 23 "/options" */+	{ propv_memory,		25,  0 }, /* 24 "/memory" */+	{ propv_vmemory,	 0,  0 }, /* 25 "/virtual-memory" */+};++static struct linux_mlist_v0 totphys[MAX_BANKS];+static struct linux_mlist_v0 totmap[1];+static struct linux_mlist_v0 totavail[MAX_BANKS];++static struct linux_mlist_v0 *ptphys;+static struct linux_mlist_v0 *ptmap;+static struct linux_mlist_v0 *ptavail;++static const struct linux_nodeops nodeops0 = {+        obp_nextnode,	/* int (*no_nextnode)(int node); */+        obp_child,	/* int (*no_child)(int node); */+        obp_proplen,	/* int (*no_proplen)(int node, char *name); */+        obp_getprop,	/* int (*no_getprop)(int node,char *name,char *val); */+        obp_setprop,	/* int (*no_setprop)(int node, char *name,+				 char *val, int len); */+        obp_nextprop	/* char * (*no_nextprop)(int node, char *name); */+};++static struct linux_arguments_v0 obp_arg;+static const struct linux_arguments_v0 * const obp_argp = &obp_arg;++static void (*synch_hook)(void);+static char obp_stdin, obp_stdout;+static int obp_fd_stdin, obp_fd_stdout;++static int obp_nbgetchar(void);+static int obp_nbputchar(int ch);+static void obp_reboot(char *);+static void obp_abort(void);+static void obp_halt(void);+static int obp_devopen(char *str);+static int obp_devclose(int dev_desc);+static int obp_devread(int dev_desc, char *buf, int nbytes);+static int obp_devwrite(int dev_desc, char *buf, int nbytes);+static int obp_devseek(int dev_desc, int hi, int lo);+static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf);+static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size);+static void obp_dumb_munmap(char *va, unsigned int size);+static int obp_inst2pkg(int dev_desc);++static void doublewalk(unsigned ptab1, unsigned va)+{+unsigned int proc_tablewalk(int ctx, unsigned int va);+unsigned int mem_tablewalk(unsigned int pa, unsigned int va);++	proc_tablewalk(0, va);+	if (ptab1 != 0) mem_tablewalk(ptab1, va);+}++static struct linux_romvec romvec0;++struct fd {+    int unit, part;+    int offset;+    int (*pread)(int dev_desc, int offset, char *buf, unsigned int nbytes);+    int (*pwrite)(int dev_desc, int offset, char *buf, unsigned int nbytes);+} fd_table[16];++static int fd_index;+static int con_pread(int dev_desc, int offset, char *buf, unsigned int nbytes);+static int con_pwrite(int dev_desc, int offset, char *buf, unsigned int nbytes);++void *+init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas,+		   const char *cmdline, char boot_device, int nographic)+{+	int i;++	/*+	 * Avoid data segment allocations+	 */+	ptphys = totphys;+	ptmap = totmap;+	ptavail = totavail;+	/*+	 * Form memory descriptors.+	 */+	for (i = 0; i < bankc; i++) {+		totphys[i].theres_more = &totphys[i+1];+		totphys[i].start_adr = (char*) bankv[i].start;+		totphys[i].num_bytes = bankv[i].length;+	}+	totphys[i-1].theres_more = 0;++	/*+	 * XXX Merged in normal PROM when full banks touch.+	 */+	for (i = 0; i < bankc; i++) {+		unsigned bankbase = bankv[i].start;+		unsigned banksize = bankv[i].length;+		if (hiphybas > bankbase &&+		    hiphybas < bankbase + banksize) {+			banksize = hiphybas - bankbase;+		}+		totavail[i].theres_more = &totavail[i+1];+		totavail[i].start_adr = (char*) bankbase;+		totavail[i].num_bytes = banksize;+	}+	totavail[i-1].theres_more = 0;++	totmap[0].theres_more = 0;+	totmap[0].start_adr = (char*) PROLBASE;+	totmap[0].num_bytes = PROLSIZE;+	prop_mem_reg[0] = 0;+	prop_mem_reg[1] = 0;+	prop_mem_reg[2] = bankv[0].length;+	prop_mem_avail[0] = 0;+	prop_mem_avail[1] = 0;+	prop_mem_avail[2] = hiphybas;+	prop_vmem_avail[0] = 0;+	prop_vmem_avail[1] = 0;+	prop_vmem_avail[2] = PROLBASE-1;+	prop_vmem_avail[3] = 0;+	prop_vmem_avail[4] = 0xffe00000;+	prop_vmem_avail[5] = 0x00200000;++	/*+	 * idprom+	 */+	bcopy(idprom, obp_idprom, IDPROM_SIZE);++	// Linux wants a R/W romvec table+	romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC;+	romvec0.pv_romvers = 3;+	romvec0.pv_plugin_revision = 77;+	romvec0.pv_printrev = 0x10203;+	romvec0.pv_v0mem.v0_totphys = &ptphys;+	romvec0.pv_v0mem.v0_prommap = &ptmap;+	romvec0.pv_v0mem.v0_available = &ptavail;+	romvec0.pv_nodeops = &nodeops0;+	romvec0.pv_bootstr = (void *)doublewalk;+	romvec0.pv_v0devops.v0_devopen = &obp_devopen;+	romvec0.pv_v0devops.v0_devclose = &obp_devclose;+	romvec0.pv_v0devops.v0_rdblkdev = &obp_rdblkdev;+	romvec0.pv_stdin = &obp_stdin;+	romvec0.pv_stdout = &obp_stdout;+	romvec0.pv_getchar = obp_nbgetchar;+	romvec0.pv_putchar = (void (*)(int))obp_nbputchar;+	romvec0.pv_nbgetchar = obp_nbgetchar;+	romvec0.pv_nbputchar = obp_nbputchar;+	romvec0.pv_reboot = obp_reboot;+	romvec0.pv_printf = (void (*)(const char *fmt, ...))printk;+	romvec0.pv_abort = obp_abort;+	romvec0.pv_halt = obp_halt;+	romvec0.pv_synchook = &synch_hook;+	romvec0.pv_v0bootargs = &obp_argp;+	romvec0.pv_v2devops.v2_inst2pkg = obp_inst2pkg;+	romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap;+	romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap;+	romvec0.pv_v2devops.v2_dev_open = obp_devopen;+	romvec0.pv_v2devops.v2_dev_close = (void (*)(int))obp_devclose;+	romvec0.pv_v2devops.v2_dev_read = obp_devread;+	romvec0.pv_v2devops.v2_dev_write = obp_devwrite;+	romvec0.pv_v2devops.v2_dev_seek = obp_devseek;+	obp_arg.boot_dev_ctrl = 0;+	obp_arg.boot_dev_unit = '0';+	obp_arg.argv[0] = "sd(0,0,0):d";+	switch(boot_device) {+	default:+	case 'a':+	    obp_arg.argv[0] = "fd()";+	    obp_arg.boot_dev[0] = 'f';+	    obp_arg.boot_dev[1] = 'd';+	    break;+	case 'd':+	    obp_arg.boot_dev_unit = '2';+	    obp_arg.argv[0] = "sd(0,2,0):d";+	    // Fall through+	case 'c':+	    obp_arg.boot_dev[0] = 's';+	    obp_arg.boot_dev[1] = 'd';+	    break;+	case 'n':+	    obp_arg.argv[0] = "le()";+	    obp_arg.boot_dev[0] = 'l';+	    obp_arg.boot_dev[1] = 'e';+	    break;+	}+	obp_arg.argv[1] = cmdline;+	romvec0.pv_v2bootargs.bootpath = &obp_arg.argv[0];+	romvec0.pv_v2bootargs.bootargs = &cmdline;+	romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin;+	romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout;++	bcopy(propv_root_templ, propv_root, sizeof(propv_root_templ));+	propv_root[4].name = "stdin-path";+	propv_root[5].name = "stdout-path";+	obp_fd_stdin = 0;+	obp_fd_stdout = 1;+	fd_table[0].pread = con_pread;+	fd_table[0].pwrite = con_pwrite;+	fd_table[1].pread = con_pread;+	fd_table[1].pwrite = con_pwrite;+	fd_index = 2;+	if (nographic) {+	    obp_stdin = PROMDEV_TTYA;+	    propv_root[4].value = "/obio/zs@0,100000:a";+	    propv_root[4].length = sizeof("/obio/zs@0,100000:a");+	    fd_table[0].unit = 18;+	    obp_stdout = PROMDEV_TTYA;+	    propv_root[5].value = "/obio/zs@0,100000:a";+	    propv_root[5].length = sizeof("/obio/zs@0,100000:a");+	    fd_table[1].unit = 18;+	} else {+	    obp_stdin = PROMDEV_KBD;+	    propv_root[4].value = "/obio/zs@0,0";+	    propv_root[4].length = sizeof("/obio/zs@0,0");+	    fd_table[0].unit = 19;+	    obp_stdout = PROMDEV_SCREEN;+	    propv_root[5].value = "/iommu/sbus/SUNW,tcx";+	    propv_root[5].length = sizeof("/iommu/sbus/SUNW,tcx");+	    fd_table[1].unit = 4;+	}+	prop_zs_addr = map_io(0x71000000, 8);+	prop_zs1_addr = map_io(0x71100000, 8);+	return &romvec0;+}++static const struct property *find_property(int node,char *name)+{+	const struct property *prop = &nodes[node].properties[0];+	while (prop && prop->name) {+		if (bcmp(prop->name, name, 128) == 0) return prop;+		prop++;+	}+	return NULL;+}++static int obp_nextnode(int node)+{+#ifdef DEBUG_OBP+        printk("obp_nextnode(%d) = %d\n", node, nodes[node].sibling);+#endif+	return nodes[node].sibling;+}++static int obp_child(int node)+{+#ifdef DEBUG_OBP+        printk("obp_child(%d) = %d\n", node, nodes[node].child);+#endif+	return nodes[node].child;+}++static int obp_proplen(int node, char *name)+{+	const struct property *prop = find_property(node,name);+	if (prop) {+#ifdef DEBUG_OBP+	    printk("obp_proplen(%d, %s) = %d\n", node, name, prop->length);+#endif+	    return prop->length;+	}+#ifdef DEBUG_OBP+	printk("obp_proplen(%d, %s) (no prop)\n", node, name);+#endif+	return -1;+}++static int obp_getprop(int node, char *name, char *value)+{+	const struct property *prop;++	if (!name) {+	    // NULL name means get first property+#ifdef DEBUG_OBP+	    printk("obp_getprop(%d, %x (NULL)) = %s\n", node, name,+		   nodes[node].properties[0].name);+#endif+	    return (int)nodes[node].properties[0].name;+	}+	prop = find_property(node,name);+	if (prop) {+		memcpy(value,prop->value,prop->length);+#ifdef DEBUG_OBP+		printk("obp_getprop(%d, %s) = %s\n", node, name, value);+#endif+		return prop->length;+	}+#ifdef DEBUG_OBP+        printk("obp_getprop(%d, %s): not found\n", node, name);+#endif+	return -1;+}++static int obp_setprop(__attribute__((unused)) int node,+		       __attribute__((unused)) char *name,+		       __attribute__((unused)) char *value,+		       __attribute__((unused)) int len)+{+#ifdef DEBUG_OBP+        printk("obp_setprop(%d, %s) = %s (%d)\n", node, name, value, len);+#endif+	return -1;+}++static const char *obp_nextprop(int node,char *name)+{+	const struct property *prop;+	+	if (!name || *name == '\0') {+	    // NULL name means get first property+#ifdef DEBUG_OBP+	    printk("obp_nextprop(%d, NULL) = %s\n", node,+		   nodes[node].properties[0].name);+#endif+	    return nodes[node].properties[0].name;+	}+	prop = find_property(node,name);+	if (prop && prop[1].name) {+#ifdef DEBUG_OBP+	    printk("obp_nextprop(%d, %s) = %s\n", node, name, prop[1].name);+#endif+	    return prop[1].name;+	}+#ifdef DEBUG_OBP+        printk("obp_nextprop(%d, %s): not found\n", node, name);+#endif+	return "";+}++extern int (*getch_fn)(struct vconterm *v);++static int obp_nbgetchar(void) {+	extern struct vconterm dp0;+	return getch_fn(&dp0);+}++static int obp_nbputchar(int ch) {+	printk("%c", ch);+	return 0;+}++static void obp_reboot(char *str) {+	printk("rebooting (%s)\n", str);+	stb_bypass(0x71f00000, 1);+	for (;;) {}+}++static void obp_abort() {+	printk("abort, power off\n");+	stb_bypass(0x71910000, 1);+	for (;;) {}+}++static void obp_halt() {+	printk("halt, power off\n");+	stb_bypass(0x71910000, 1);+	for (;;) {}+}++extern void *esp_read(int unit, int part, int offset, short len);++static int esp_pread(int dev_desc, int offset, char *buf, unsigned int nbytes)+{+    unsigned int i;+    void *src;++    for(i = 0; i < nbytes; i += 512) {+	src = esp_read(fd_table[dev_desc].unit, fd_table[dev_desc].part, (offset + i) / 512, 512);+	memcpy(&buf[i], src, 512);+    }+    return nbytes;

⌨️ 快捷键说明

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