On Thu, 2009-01-22 at 18:14 +0800, Liu Yu wrote: > All MPC85xx boards use E500v1/v2 core. > This patch add emulation of a virtual MPC85xx board, > so that any MPC85xx host could run this emulation. > > Only tested it on MPC8544DS and MPC8572DS hosts, > but it should work on other MPC85xx boards. > > Signed-off-by: Liu Yu <yu....@freescale.com> ...
> +struct board { > + const char *model; > + const char *compatible; > +}; > + > +#define BOARD_DEF(_model, _compatible) \ > + { \ > + .model = _model, \ > + .compatible = _compatible, \ > + } > + > +/* Supported host boards */ > +static const struct board mpc85xx_table[] = { > + BOARD_DEF("MPC8544DS", "MPC8544DS"), /* MPC8544DS */ > + BOARD_DEF("fsl,MPC8572DS", "fsl,MPC8572DS"), /* MPC8572DS */ > + BOARD_DEF("fsl,mpc8536ds", "fsl,mpc8536ds"), /* MPC8536DS */ > + BOARD_DEF("MPC8548CDS", "MPC8548CDS"), /* MPC8548CDS */ > + BOARD_DEF("MPC8555CDS", "MPC8555CDS"), /* MPC8555CDS */ > + BOARD_DEF("MPC8541CDS", "MPC8541CDS"), /* MPC8541CDS */ > + BOARD_DEF("MPC8540ADS", "MPC8540ADS"), /* MPC8540ADS */ > + BOARD_DEF("MPC8560ADS", "MPC8560ADS"), /* MPC8560ADS */ > + BOARD_DEF("MPC8568EMDS", "MPC8568EMDS"), /* MPC8568EMDS */ > +}; > + > +#define BOARDS_NUM (sizeof(mpc85xx_table)/sizeof(struct board)) ... > +static void *mpc85xx_load_device_tree(void *addr, > + uint32_t ramsize, > + target_phys_addr_t initrd_base, > + target_phys_addr_t initrd_size, > + const char *kernel_cmdline) > +{ ... > + if (kvm_enabled()) { > + FILE *fp; > + char *model; > + char const *compatible = NULL; > + struct dirent *dirp; > + DIR *dp; > + int i; > + char buf[128]; > + > + if ((fp = fopen("/proc/cpuinfo", "r")) == NULL) { > + printf("Can't open file /proc/cpuinfo\n"); > + goto out; > + } > + while (fgets(buf, 128, fp) != NULL) { > + if (strncmp(buf, "model", 5) == 0) { > + model = buf + 9; > + break; > + } > + } > + fclose(fp); > + > + for (i = 0; i < BOARDS_NUM; i++) { > + if (strncmp(model, mpc85xx_table[i].model, > + strlen(mpc85xx_table[i].model)) == 0) { > + compatible = mpc85xx_table[i].compatible; > + } > + } > + > + if (compatible == NULL) { > + printf("Unknow host board!\n"); > + goto out; > + } > + > + ret = qemu_devtree_setprop_string(fdt, "/", "compatible", compatible); > + if (ret < 0) > + fprintf(stderr, "couldn't set /compatible = %s\n", compatible); > + > + if ((dp = opendir("/proc/device-tree/cpus/")) == NULL) { > + printf("Can't open directory /proc/device-tree/cpus/\n"); > + goto out; > + } > + > + buf[0] = '\0'; > + while ((dirp = readdir(dp)) != NULL) { > + if (strncmp(dirp->d_name, "PowerPC", 7) == 0) { > + sprintf(buf, "/proc/device-tree/cpus/%s", dirp->d_name); > + break; > + } > + } > + closedir(dp); > + if (buf[0] == '\0') { > + printf("Unknow host!\n"); > + goto out; > + } > + path = buf + 17; I don't think you should do this at all. As long as the core is "known", it doesn't matter what the host board is. You *always* emulate the MPC8544DS board (that's what your device tree says). You should be able to emulate a MPC8544DS on *any* e500v2 host board or chip. For comparison, on 440 we have tested with Sequoia (440EPx) and Bamboo (440EP) hosts, but qemu always emulates a Bamboo guest. The chips aren't the same, but that's irrelevant because the core is (440 x5). The rest of this patch looks good. -- Hollis Blanchard IBM Linux Technology Center -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html