static void mmap_msync(void) { u32 *map; int i; int fd = eopen(Option.file, O_RDWR | O_CREAT | O_TRUNC); epwrite(fd, "", 1, FILE_SIZE - 1); map = emmap(0, FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); for (i = 0; i < NUM_INTS; i++) map[i] = 2 * i; emsync(map, FILE_SIZE, MS_SYNC); crash(); }
void fb_init(struct framebuffer *fb) { char *path; struct fb_fix_screeninfo finfo; struct fb_var_screeninfo vinfo; if ((path = getenv("FRAMEBUFFER")) != NULL) fb->fd = eopen(path, O_RDWR); else fb->fd = eopen(fb_path, O_RDWR); if (ioctl(fb->fd, FBIOGET_FSCREENINFO, &finfo) < 0) fatal("ioctl: FBIOGET_FSCREENINFO failed"); if (ioctl(fb->fd, FBIOGET_VSCREENINFO, &vinfo) < 0) fatal("ioctl: FBIOGET_VSCREENINFO failed"); /* check screen offset and initialize because linux console change this */ /* if (vinfo.xoffset != 0 || vinfo.yoffset != 0) { vinfo.xoffset = vinfo.yoffset = 0; ioctl(fb->fd, FBIOPUT_VSCREENINFO, &vinfo); } */ fb->width = vinfo.xres; fb->height = vinfo.yres; fb->screen_size = finfo.smem_len; fb->line_length = finfo.line_length; if ((finfo.visual == FB_VISUAL_TRUECOLOR || finfo.visual == FB_VISUAL_DIRECTCOLOR) && (vinfo.bits_per_pixel == 15 || vinfo.bits_per_pixel == 16 || vinfo.bits_per_pixel == 24 || vinfo.bits_per_pixel == 32)) { fb->cmap = fb->cmap_org = NULL; fb->bpp = my_ceil(vinfo.bits_per_pixel, BITS_PER_BYTE); } else if (finfo.visual == FB_VISUAL_PSEUDOCOLOR && vinfo.bits_per_pixel == 8) { cmap_create(&fb->cmap_org); if (ioctl(fb->fd, FBIOGETCMAP, fb->cmap_org) < 0) fatal("ioctl: FBIOGETCMAP failed"); fb->cmap = NULL; fb->bpp = 1; } else /* non packed pixel, mono color, grayscale: not implimented */ fatal("unsupported framebuffer type"); fb->fp = (unsigned char *) emmap(0, fb->screen_size, PROT_WRITE | PROT_READ, MAP_SHARED, fb->fd, 0); fb->buf = (unsigned char *) ecalloc(1, fb->screen_size); fb->vinfo = vinfo; }