int restore_vga (struct vgastate *state) { if (state->vidstate == NULL) return 1; if (state->flags & VGA_SAVE_MODE) restore_vga_mode(state); if (state->flags & VGA_SAVE_FONTS) { caddr_t fbbase = ioremap(state->membase, state->memsize); if (!fbbase) { vga_cleanup(state); return 1; } restore_vga_text(state, fbbase); iounmap(fbbase); } if (state->flags & VGA_SAVE_CMAP) restore_vga_cmap(state); vga_cleanup(state); return 0; }
int save_vga(struct vgastate *state) { struct regstate *saved; saved = kmalloc(sizeof(struct regstate), GFP_KERNEL); if (saved == NULL) return 1; memset (saved, 0, sizeof(struct regstate)); state->vidstate = (void *)saved; if (state->flags & VGA_SAVE_CMAP) { saved->vga_cmap = vmalloc(768); if (!saved->vga_cmap) { vga_cleanup(state); return 1; } save_vga_cmap(state); } if (state->flags & VGA_SAVE_MODE) { int total; if (state->num_attr < 21) state->num_attr = 21; if (state->num_crtc < 25) state->num_crtc = 25; if (state->num_gfx < 9) state->num_gfx = 9; if (state->num_seq < 5) state->num_seq = 5; total = state->num_attr + state->num_crtc + state->num_gfx + state->num_seq; saved->attr = vmalloc(total); if (!saved->attr) { vga_cleanup(state); return 1; } saved->crtc = saved->attr + state->num_attr; saved->gfx = saved->crtc + state->num_crtc; saved->seq = saved->gfx + state->num_gfx; save_vga_mode(state); } if (state->flags & VGA_SAVE_FONTS) { caddr_t fbbase; /* exit if window is less than 32K */ if (state->memsize && state->memsize < 4 * 8192) { vga_cleanup(state); return 1; } if (!state->memsize) state->memsize = 8 * 8192; if (!state->membase) state->membase = 0xA0000; fbbase = ioremap(state->membase, state->memsize); if (!fbbase) { vga_cleanup(state); return 1; } /* * save only first 32K used by vgacon */ if (state->flags & VGA_SAVE_FONT0) { saved->vga_font0 = vmalloc(4 * 8192); if (!saved->vga_font0) { iounmap(fbbase); vga_cleanup(state); return 1; } } /* * largely unused, but if required by the caller * we'll just save everything. */ if (state->flags & VGA_SAVE_FONT1) { saved->vga_font1 = vmalloc(state->memsize); if (!saved->vga_font1) { iounmap(fbbase); vga_cleanup(state); return 1; } } /* * Save 8K at plane0[0], and 8K at plane1[16K] */ if (state->flags & VGA_SAVE_TEXT) { saved->vga_text = vmalloc(8192 * 2); if (!saved->vga_text) { iounmap(fbbase); vga_cleanup(state); return 1; } } save_vga_text(state, fbbase); iounmap(fbbase); } return 0; }
int save_vga(struct vgastate *state) { struct regstate *saved; saved = kzalloc(sizeof(struct regstate), GFP_KERNEL); if (saved == NULL) return 1; state->vidstate = (void *)saved; if (state->flags & VGA_SAVE_CMAP) { saved->vga_cmap = vmalloc(768); if (!saved->vga_cmap) { vga_cleanup(state); return 1; } save_vga_cmap(state); } if (state->flags & VGA_SAVE_MODE) { int total; if (state->num_attr < 21) state->num_attr = 21; if (state->num_crtc < 25) state->num_crtc = 25; if (state->num_gfx < 9) state->num_gfx = 9; if (state->num_seq < 5) state->num_seq = 5; total = state->num_attr + state->num_crtc + state->num_gfx + state->num_seq; saved->attr = vmalloc(total); if (!saved->attr) { vga_cleanup(state); return 1; } saved->crtc = saved->attr + state->num_attr; saved->gfx = saved->crtc + state->num_crtc; saved->seq = saved->gfx + state->num_gfx; save_vga_mode(state); } if (state->flags & VGA_SAVE_FONTS) { void __iomem *fbbase; if (state->memsize && state->memsize < 4 * 8192) { vga_cleanup(state); return 1; } if (!state->memsize) state->memsize = 8 * 8192; if (!state->membase) state->membase = 0xA0000; fbbase = ioremap(state->membase, state->memsize); if (!fbbase) { vga_cleanup(state); return 1; } if (state->flags & VGA_SAVE_FONT0) { saved->vga_font0 = vmalloc(4 * 8192); if (!saved->vga_font0) { iounmap(fbbase); vga_cleanup(state); return 1; } } if (state->flags & VGA_SAVE_FONT1) { saved->vga_font1 = vmalloc(state->memsize); if (!saved->vga_font1) { iounmap(fbbase); vga_cleanup(state); return 1; } } if (state->flags & VGA_SAVE_TEXT) { saved->vga_text = vmalloc(8192 * 2); if (!saved->vga_text) { iounmap(fbbase); vga_cleanup(state); return 1; } } save_vga_text(state, fbbase); iounmap(fbbase); } return 0; }