📄 proll.patch
字号:
+ {"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 + -