#include #include #include #include #include #include #include #include #define xs_write(a,b,c,d) printf("write %s <- %s : %d\n", b,c,xs_write(a,b,c,d)); #define xs_transaction_end(a,b) printf("end : %d\n", xs_transaction_end(a,b)); int main(int argc,char** argv) { int xc = xc_interface_open(); struct xs_handle *xs = xs_daemon_open(); char kernel[] = "/vmlinux"; char ramdisk[] = "/domUinitrd"; char cmdline[] = "init=/linuxrc root=/dev/ram"; char pdev[] = "0x301"; char vdev[] = "0x301"; int vcpus = 1; char home[256]; unsigned long memory = 64*1024*1024; int domid = 0; xc_domain_create(xc, ACM_DEFAULT_SSID, &domid); xc_domain_setmaxmem(xc,domid, memory >> 10); xc_domain_memory_increase_reservation(xc,domid, memory >> 12, 0,0,0); // 2) Build domain int lconsole = 0; int rconsole = 0; int lstore = 0; int rstore = 0; unsigned long mfn_store, mfn_console; xc_evtchn_bind_interdomain(xc, 0, domid, &lconsole, &rconsole); xc_evtchn_bind_interdomain(xc, DOMID_SELF, domid, &lstore, &rstore); xc_linux_build(xc, domid, kernel, ramdisk, cmdline, 0, vcpus, rstore, &mfn_store, rconsole, &mfn_console); sprintf(home,"/local/domain/%d",domid); xs_introduce_domain(xs, domid, mfn_store, lstore, home); char s[256]; char s2[256]; sprintf(s,"%s/console/ring-ref",home); sprintf(s2,"%lu",mfn_console); xs_write(xs, s, s2, strlen(s2)); sprintf(s,"%s/console/port",home); sprintf(s2,"%d",lconsole); xs_write(xs, s, s2, strlen(s2)); // 3) Create block device (pdev, vdev); int uuid = 1000 + domid; char* dom0_home = xs_get_domain_path(xs,0); printf("dom0_home is %s\n",dom0_home); char backend[256]; char frontend[256]; sprintf(backend,"%s/backend/vbd/%d/%d",dom0_home,uuid,domid); sprintf(frontend, "%s/device/vbd/%d",home,uuid); xs_transaction_start(xs); sprintf(s,"%s/frontend",backend); xs_write(xs, s, frontend, strlen(frontend)); sprintf(s,"%s/frontend-id",backend); sprintf(s2,"%d",domid); xs_write(xs, s, s2, strlen(s2)); xs_transaction_end(xs,0); xs_transaction_start(xs); sprintf(s,"%s/backend",frontend); xs_write(xs, s, backend, strlen(backend)); sprintf(s, "%s/backend-id", frontend); xs_write(xs, s, "0",1); sprintf(s, "%s/virtual-device", frontend); xs_write(xs, s, vdev, strlen(vdev)); xs_transaction_end(xs,0); sprintf(s, "%s/physical-device",backend); xs_write(xs, s, pdev, strlen(pdev)); xc_domain_unpause(xc,domid); return 0; }