char *svga_rcall(uint64_t source, struct vfs_obj *file, const char *args) { char *rets = NULL; int x, y, d, w, h; int mode; if (!strcmp(args, "getmode")) { rets = malloc(16); sprintf(rets, "%d %d %d", svga.w, svga.h, svga.d); return rets; } if (!strcmp(args, "listmodes")) { return strdup(modesstr); } if (!strcmp(args, "unshare")) { mutex_spin(&file->mutex); page_free(buffer, msize(buffer)); free(buffer); buffer = valloc(svga.w * svga.h * 4); mutex_free(&file->mutex); return strdup("T"); } if (!strncmp(args, "setmode ", 8)) { if (sscanf(args + 8, "%i %i %i", &x, &y, &d) != 3) { return strdup(""); } mutex_spin(&file->mutex); mode = svga_find_mode(x, y, d); if (svga_set_mode(mode)) { return strdup(""); } page_free(buffer, msize(buffer)); free(buffer); buffer = valloc(svga.w * svga.h * 4); mutex_free(&file->mutex); return strdup("T"); } if (!strncmp(args, "syncrect ", 9)) { if (sscanf(args + 9, "%i %i %i %i", &x, &y, &w, &h) != 4) { return strdup(""); } mutex_spin(&file->mutex); svga_fliprect(buffer, x, y, w, h); mutex_free(&file->mutex); return strdup("T"); } return NULL; }
char *svga_rcall_syncrect(struct robject *self, rp_t source, int argc, char **argv) { int x, y, w, h; if (argc != 5) return NULL; x = atoi(argv[1]); y = atoi(argv[2]); w = atoi(argv[3]); h = atoi(argv[4]); mutex_spin(&self->driver_mutex); svga_fliprect(buffer, x, y, w, h); mutex_free(&self->driver_mutex); return strdup("T"); }