Change the kernel dev_t, representing a pointer to a specinfo structure,
[dragonfly.git] / sys / dev / video / fb / vga.c
index 405ba7a..e40fd36 100644 (file)
@@ -27,7 +27,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fb/vga.c,v 1.9.2.1 2001/08/11 02:58:44 yokota Exp $
- * $DragonFly: src/sys/dev/video/fb/vga.c,v 1.8 2004/08/13 02:45:37 dillon Exp $
+ * $DragonFly: src/sys/dev/video/fb/vga.c,v 1.18 2006/09/10 01:26:37 dillon Exp $
  */
 
 #include "opt_vga.h"
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/conf.h>
-#include <sys/proc.h>
 #include <sys/fcntl.h>
 #include <sys/malloc.h>
 #include <sys/fbio.h>
+#include <sys/thread2.h>
 
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -96,44 +96,46 @@ vga_attach_unit(int unit, vga_softc_t *sc, int flags)
 
 #ifdef FB_INSTALL_CDEV
 
+struct ucred;
+
 int
-vga_open(dev_t dev, vga_softc_t *sc, int flag, int mode, struct thread *td)
+vga_open(cdev_t dev, vga_softc_t *sc, int flag, int mode, struct ucred *cred)
 {
        if (sc == NULL)
                return ENXIO;
        if (mode & (O_CREAT | O_APPEND | O_TRUNC))
                return ENODEV;
 
-       return genfbopen(&sc->gensc, sc->adp, flag, mode, td);
+       return genfbopen(&sc->gensc, sc->adp, flag, mode, cred);
 }
 
 int
-vga_close(dev_t dev, vga_softc_t *sc, int flag, int mode, struct thread *td)
+vga_close(cdev_t dev, vga_softc_t *sc, int flag, int mode)
 {
-       return genfbclose(&sc->gensc, sc->adp, flag, mode, td);
+       return genfbclose(&sc->gensc, sc->adp, flag, mode);
 }
 
 int
-vga_read(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag)
+vga_read(cdev_t dev, vga_softc_t *sc, struct uio *uio, int flag)
 {
        return genfbread(&sc->gensc, sc->adp, uio, flag);
 }
 
 int
-vga_write(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag)
+vga_write(cdev_t dev, vga_softc_t *sc, struct uio *uio, int flag)
 {
        return genfbread(&sc->gensc, sc->adp, uio, flag);
 }
 
 int
-vga_ioctl(dev_t dev, vga_softc_t *sc, u_long cmd, caddr_t arg, int flag,
-         struct thread *td)
+vga_ioctl(cdev_t dev, vga_softc_t *sc, u_long cmd, caddr_t arg, int flag,
+         struct ucred *cred)
 {
-       return genfbioctl(&sc->gensc, sc->adp, cmd, arg, flag, td);
+       return genfbioctl(&sc->gensc, sc->adp, cmd, arg, flag, cred);
 }
 
 int
-vga_mmap(dev_t dev, vga_softc_t *sc, vm_offset_t offset, int prot)
+vga_mmap(cdev_t dev, vga_softc_t *sc, vm_offset_t offset, int prot)
 {
        return genfbmmap(&sc->gensc, sc->adp, offset, prot);
 }
@@ -162,11 +164,6 @@ vga_mmap(dev_t dev, vga_softc_t *sc, vm_offset_t offset, int prot)
 #define VGA_SLOW_IOACCESS      1
 #endif
 
-/* architecture dependent option */
-#ifdef __alpha__
-#define VGA_NO_BIOS            1
-#endif
-
 /* this should really be in `rtc.h' */
 #define RTC_EQUIPMENT           0x14
 
@@ -432,66 +429,57 @@ static int                rows_offset = 1;
 #define BIOS_SADDRTOLADDR(p) ((((p) & 0xffff0000) >> 12) + ((p) & 0x0000ffff))
 
 #if !defined(VGA_NO_BIOS) && !defined(VGA_NO_MODE_CHANGE)
-static void map_mode_table(u_char *map[], u_char *table, int max);
+static void map_mode_table(u_char **, u_char *, int);
 #endif
-static void clear_mode_map(video_adapter_t *adp, u_char *map[], int max,
-                          int color);
+static void clear_mode_map(video_adapter_t *, u_char **, int, int);
 #if !defined(VGA_NO_BIOS) && !defined(VGA_NO_MODE_CHANGE)
-static int map_mode_num(int mode);
+static int map_mode_num(int);
 #endif
-static int map_gen_mode_num(int type, int color, int mode);
-static int map_bios_mode_num(int type, int color, int bios_mode);
-static u_char *get_mode_param(int mode);
+static int map_gen_mode_num(int, int, int);
+static int map_bios_mode_num(int, int, int);
+static u_char *get_mode_param(int);
 #ifndef VGA_NO_BIOS
-static void fill_adapter_param(int code, video_adapter_t *adp);
+static void fill_adapter_param(int, video_adapter_t *);
 #endif
-static int verify_adapter(video_adapter_t *adp);
-static void update_adapter_info(video_adapter_t *adp, video_info_t *info);
+static int verify_adapter(video_adapter_t *);
+static void update_adapter_info(video_adapter_t *, video_info_t *);
 #if !defined(VGA_NO_BIOS) && !defined(VGA_NO_MODE_CHANGE)
 #define COMP_IDENTICAL 0
 #define COMP_SIMILAR   1
 #define COMP_DIFFERENT 2
-static int comp_adpregs(u_char *buf1, u_char *buf2);
+static int comp_adpregs(u_char *, u_char *);
 #endif
 static int probe_adapters(void);
-static int set_line_length(video_adapter_t *adp, int pixel);
-static int set_display_start(video_adapter_t *adp, int x, int y);
-
-#ifndef VGA_NO_MODE_CHANGE
-static void filll_io(int val, vm_offset_t d, size_t size);
-#endif
+static int set_line_length(video_adapter_t *, int);
+static int set_display_start(video_adapter_t *, int, int);
 
 #ifndef VGA_NO_MODE_CHANGE
 #ifdef VGA_WIDTH90
-static void set_width90(adp_state_t *params);
+static void set_width90(adp_state_t *);
 #endif
 #endif /* !VGA_NO_MODE_CHANGE */
 
 #ifndef VGA_NO_FONT_LOADING
 #define PARAM_BUFSIZE  6
-static void set_font_mode(video_adapter_t *adp, u_char *buf);
-static void set_normal_mode(video_adapter_t *adp, u_char *buf);
+static void set_font_mode(video_adapter_t *, u_char *);
+static void set_normal_mode(video_adapter_t *, u_char *);
 #endif
 
 #ifndef VGA_NO_MODE_CHANGE
-static void planar_fill(video_adapter_t *adp, int val);
-static void packed_fill(video_adapter_t *adp, int val);
-static void direct_fill(video_adapter_t *adp, int val);
+static void filll_io(int, vm_offset_t, size_t);
+static void planar_fill(video_adapter_t *, int);
+static void packed_fill(video_adapter_t *, int);
+static void direct_fill(video_adapter_t *, int);
 #ifdef notyet
-static void planar_fill_rect(video_adapter_t *adp, int val, int x, int y,
-                            int cx, int cy);
-static void packed_fill_rect(video_adapter_t *adp, int val, int x, int y,
-                            int cx, int cy);
-static void direct_fill_rect16(video_adapter_t *adp, int val, int x, int y,
-                              int cx, int cy);
-static void direct_fill_rect24(video_adapter_t *adp, int val, int x, int y,
-                              int cx, int cy);
-static void direct_fill_rect32(video_adapter_t *adp, int val, int x, int y,
-                              int cx, int cy);
+static void planar_fill_rect(video_adapter_t *, int, int, int, int, int);
+static void packed_fill_rect(video_adapter_t *, int, int, int, int, int);
+static void direct_fill_rect16(video_adapter_t *, int, int, int, int, int);
+static void direct_fill_rect24(video_adapter_t *, int, int, int, int, int);
+static void direct_fill_rect32(video_adapter_t *, int, int, int, int, int);
 #endif /* notyet */
 #endif /* !VGA_NO_MODE_CHANGE */
 
-static void dump_buffer(u_char *buf, size_t len);
+static void dump_buffer(u_char *, size_t);
 
 #define        ISMAPPED(pa, width)                             \
        (((pa) <= (u_long)0x1000 - (width))             \
@@ -726,8 +714,8 @@ map_bios_mode_num(int type, int color, int bios_mode)
 }
 
 /* look up a parameter table entry */
-static u_char 
-*get_mode_param(int mode)
+static u_char *
+get_mode_param(int mode)
 {
 #if !defined(VGA_NO_BIOS) && !defined(VGA_NO_MODE_CHANGE)
     if (mode >= V_MODE_MAP_SIZE)
@@ -1081,6 +1069,8 @@ probe_adapters(void)
     if (adp != NULL) {
        if (adp->va_type == KD_VGA) {
            vga_save_state(adp, &adpstate, sizeof(adpstate));
+           for(i = 0; i < 16; i++)
+               adp->va_palette_regs[i] = adpstate.regs[35 + i];
 #if defined(VGA_NO_BIOS) || defined(VGA_NO_MODE_CHANGE)
            mode_map[adp->va_initial_mode] = adpstate.regs;
            rows_offset = 1;
@@ -1339,7 +1329,7 @@ filll_io(int val, vm_offset_t d, size_t size)
        d += sizeof(u_int32_t);
     }
 }
-#endif /* VGA_NO_MODE_CHANGE */
+#endif /* !VGA_NO_MODE_CHANGE */
 
 /* entry points */
 
@@ -1544,7 +1534,7 @@ vga_set_mode(video_adapter_t *adp, int mode)
 #ifdef VGA_WIDTH90
     case M_VGA_C90x60: case M_VGA_M90x60:
        set_width90(&params);
-       /* FALL THROUGH */
+       /* FALLTHROUGH */
 #endif
     case M_VGA_C80x60: case M_VGA_M80x60:
        params.regs[2]  = 0x08;
@@ -1554,7 +1544,7 @@ vga_set_mode(video_adapter_t *adp, int mode)
 #ifdef VGA_WIDTH90
     case M_VGA_C90x30: case M_VGA_M90x30:
        set_width90(&params);
-       /* FALL THROUGH */
+       /* FALLTHROUGH */
 #endif
     case M_VGA_C80x30: case M_VGA_M80x30:
        params.regs[19] = 0x4f;
@@ -1571,7 +1561,7 @@ special_480l:
 #ifdef VGA_WIDTH90
     case M_VGA_C90x43: case M_VGA_M90x43:
        set_width90(&params);
-       /* FALL THROUGH */
+       /* FALLTHROUGH */
 #endif
     case M_ENH_C80x43: case M_ENH_B80x43:
        params.regs[28] = 87;
@@ -1580,7 +1570,7 @@ special_480l:
 #ifdef VGA_WIDTH90
     case M_VGA_C90x50: case M_VGA_M90x50:
        set_width90(&params);
-       /* FALL THROUGH */
+       /* FALLTHROUGH */
 #endif
     case M_VGA_C80x50: case M_VGA_M80x50:
 special_80x50:
@@ -1591,7 +1581,7 @@ special_80x50:
 #ifdef VGA_WIDTH90
     case M_VGA_C90x25: case M_VGA_M90x25:
        set_width90(&params);
-       /* FALL THROUGH */
+       /* FALLTHROUGH */
 #endif
     case M_VGA_C40x25: case M_VGA_C80x25:
     case M_VGA_M80x25:
@@ -1611,7 +1601,7 @@ setup_mode:
        params.regs[5-1+0x04] |= 0x04;
        /* turn off doubleword mode */
        params.regs[10+0x14] &= 0xbf;
-       /* turn off word adressing */
+       /* turn off word addressing */
        params.regs[10+0x17] |= 0x40;
        /* set logical screen width */
        params.regs[10+0x13] = 80;
@@ -1660,9 +1650,8 @@ static void
 set_font_mode(video_adapter_t *adp, u_char *buf)
 {
     u_char *mp;
-    int s;
 
-    s = splhigh();
+    crit_enter();
 
     /* save register values */
     if (adp->va_type == KD_VGA) {
@@ -1719,15 +1708,13 @@ set_font_mode(video_adapter_t *adp, u_char *buf)
     outw(GDCIDX, 0x0406);               /* addr = a0000, 64kb */
 #endif /* VGA_SLOW_IOACCESS */
 
-    splx(s);
+    crit_exit();
 }
 
 static void
 set_normal_mode(video_adapter_t *adp, u_char *buf)
 {
-    int s;
-
-    s = splhigh();
+    crit_enter();
 
     /* setup vga for normal operation mode again */
     inb(adp->va_crtc_addr + 6);                        /* reset flip-flop */
@@ -1768,7 +1755,7 @@ set_normal_mode(video_adapter_t *adp, u_char *buf)
         outw(GDCIDX, 0x0006 | (((buf[4] & 0x03) | 0x0c)<<8));
 #endif /* VGA_SLOW_IOACCESS */
 
-    splx(s);
+    crit_exit();
 }
 
 #endif /* VGA_NO_FONT_LOADING */
@@ -1788,7 +1775,6 @@ vga_save_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
     u_int32_t segment;
     int c;
 #ifdef VGA_ALT_SEQACCESS
-    int s;
     u_char val = 0;
 #endif
 
@@ -1815,12 +1801,12 @@ vga_save_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
 
 #ifdef VGA_ALT_SEQACCESS
     if (adp->va_type == KD_VGA) {      /* what about EGA? XXX */
-       s = splhigh();
+       crit_enter();
        outb(TSIDX, 0x00); outb(TSREG, 0x01);
        outb(TSIDX, 0x01); val = inb(TSREG);    /* disable screen */
        outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
        outb(TSIDX, 0x00); outb(TSREG, 0x03);
-       splx(s);
+       crit_exit();
     }
 #endif
 
@@ -1837,11 +1823,11 @@ vga_save_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
 
 #ifdef VGA_ALT_SEQACCESS
     if (adp->va_type == KD_VGA) {
-       s = splhigh();
+       crit_enter();
        outb(TSIDX, 0x00); outb(TSREG, 0x01);
        outb(TSIDX, 0x01); outb(TSREG, val & 0xdf);     /* enable screen */
        outb(TSIDX, 0x00); outb(TSREG, 0x03);
-       splx(s);
+       crit_exit();
     }
 #endif
 
@@ -1868,7 +1854,6 @@ vga_load_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
     u_int32_t segment;
     int c;
 #ifdef VGA_ALT_SEQACCESS
-    int s;
     u_char val = 0;
 #endif
 
@@ -1895,12 +1880,12 @@ vga_load_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
 
 #ifdef VGA_ALT_SEQACCESS
     if (adp->va_type == KD_VGA) {      /* what about EGA? XXX */
-       s = splhigh();
+       crit_enter();
        outb(TSIDX, 0x00); outb(TSREG, 0x01);
        outb(TSIDX, 0x01); val = inb(TSREG);    /* disable screen */
        outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
        outb(TSIDX, 0x00); outb(TSREG, 0x03);
-       splx(s);
+       crit_exit();
     }
 #endif
 
@@ -1917,11 +1902,11 @@ vga_load_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
 
 #ifdef VGA_ALT_SEQACCESS
     if (adp->va_type == KD_VGA) {
-       s = splhigh();
+       crit_enter();
        outb(TSIDX, 0x00); outb(TSREG, 0x01);
        outb(TSIDX, 0x01); outb(TSREG, val & 0xdf);     /* enable screen */
        outb(TSIDX, 0x00); outb(TSREG, 0x03);
-       splx(s);
+       crit_exit();
     }
 #endif
 
@@ -1944,15 +1929,14 @@ vga_show_font(video_adapter_t *adp, int page)
 {
 #ifndef VGA_NO_FONT_LOADING
     static u_char cg[] = { 0x00, 0x05, 0x0a, 0x0f, 0x30, 0x35, 0x3a, 0x3f };
-    int s;
 
     prologue(adp, V_ADP_FONT, ENODEV);
     if (page < 0 || page >= 8)
        return EINVAL;
 
-    s = splhigh();
+    crit_enter();
     outb(TSIDX, 0x03); outb(TSREG, cg[page]);
-    splx(s);
+    crit_exit();
 
     return 0;
 #else /* VGA_NO_FONT_LOADING */
@@ -2009,7 +1993,7 @@ vga_save_palette2(video_adapter_t *adp, int base, int count,
  * VGA
  */
 static int
-vga_load_palette(video_adapter_t *adp, u_char *palette)
+vga_load_palette(video_adapter_t *adp, const u_char *palette)
 {
     int i;
 
@@ -2087,7 +2071,6 @@ vga_save_state(video_adapter_t *adp, void *p, size_t size)
     u_char *buf;
     int crtc_addr;
     int i, j;
-    int s;
 
     if (size == 0) {
        /* return the required buffer size */
@@ -2104,7 +2087,7 @@ vga_save_state(video_adapter_t *adp, void *p, size_t size)
     bzero(buf, V_MODE_PARAM_SIZE);
     crtc_addr = adp->va_crtc_addr;
 
-    s = splhigh();
+    crit_enter();
 
     outb(TSIDX, 0x00); outb(TSREG, 0x01);      /* stop sequencer */
     for (i = 0, j = 5; i < 4; i++) {           
@@ -2130,7 +2113,7 @@ vga_save_state(video_adapter_t *adp, void *p, size_t size)
     inb(crtc_addr + 6);                                /* reset flip-flop */
     outb(ATC, 0x20);                           /* enable palette */
 
-    splx(s);
+    crit_exit();
 
 #if 1
     if (vga_get_info(adp, adp->va_mode, &info) == 0) {
@@ -2171,7 +2154,6 @@ vga_load_state(video_adapter_t *adp, void *p)
 {
     u_char *buf;
     int crtc_addr;
-    int s;
     int i;
 
     prologue(adp, V_ADP_STATELOAD, ENODEV);
@@ -2185,7 +2167,7 @@ vga_load_state(video_adapter_t *adp, void *p)
     dump_buffer(buf, V_MODE_PARAM_SIZE);
 #endif
 
-    s = splhigh();
+    crit_enter();
 
     outb(TSIDX, 0x00); outb(TSREG, 0x01);      /* stop sequencer */
     for (i = 0; i < 4; ++i) {                  /* program sequencer */
@@ -2226,7 +2208,7 @@ vga_load_state(video_adapter_t *adp, void *p)
 #endif /* VGA_NO_BIOS */
 #endif /* notyet */
 
-    splx(s);
+    crit_exit();
     return 0;
 }
 
@@ -2254,7 +2236,6 @@ static int
 vga_read_hw_cursor(video_adapter_t *adp, int *col, int *row)
 {
     u_int16_t off;
-    int s;
 
     if (!vga_init_done)
        return ENXIO;
@@ -2262,12 +2243,12 @@ vga_read_hw_cursor(video_adapter_t *adp, int *col, int *row)
     if (adp->va_info.vi_flags & V_INFO_GRAPHICS)
        return ENODEV;
 
-    s = spltty();
+    crit_enter();
     outb(adp->va_crtc_addr, 14);
     off = inb(adp->va_crtc_addr + 1);
     outb(adp->va_crtc_addr, 15);
     off = (off << 8) | inb(adp->va_crtc_addr + 1);
-    splx(s);
+    crit_exit();
 
     *row = off / adp->va_info.vi_width;
     *col = off % adp->va_info.vi_width;
@@ -2286,7 +2267,6 @@ static int
 vga_set_hw_cursor(video_adapter_t *adp, int col, int row)
 {
     u_int16_t off;
-    int s;
 
     if (!vga_init_done)
        return ENXIO;
@@ -2299,12 +2279,12 @@ vga_set_hw_cursor(video_adapter_t *adp, int col, int row)
        off = row*adp->va_info.vi_width + col;
     }
 
-    s = spltty();
+    crit_enter();
     outb(adp->va_crtc_addr, 14);
     outb(adp->va_crtc_addr + 1, off >> 8);
     outb(adp->va_crtc_addr, 15);
     outb(adp->va_crtc_addr + 1, off & 0x00ff);
-    splx(s);
+    crit_exit();
 
     return 0;
 }
@@ -2320,12 +2300,10 @@ static int
 vga_set_hw_cursor_shape(video_adapter_t *adp, int base, int height,
                        int celsize, int blink)
 {
-    int s;
-
     if (!vga_init_done)
        return ENXIO;
 
-    s = spltty();
+    crit_enter();
     switch (adp->va_type) {
     case KD_VGA:
     case KD_CGA:
@@ -2360,7 +2338,7 @@ vga_set_hw_cursor_shape(video_adapter_t *adp, int base, int height,
        }
        break;
     }
-    splx(s);
+    crit_exit();
 
     return 0;
 }
@@ -2375,9 +2353,8 @@ static int
 vga_blank_display(video_adapter_t *adp, int mode)
 {
     u_char val;
-    int s;
 
-    s = splhigh();
+    crit_enter();
     switch (adp->va_type) {
     case KD_VGA:
        switch (mode) {
@@ -2411,7 +2388,7 @@ vga_blank_display(video_adapter_t *adp, int mode)
 
     case KD_EGA:
        /* no support yet */
-       splx(s);
+       crit_exit();
        return ENODEV;
 
     case KD_CGA:
@@ -2443,7 +2420,7 @@ vga_blank_display(video_adapter_t *adp, int mode)
     default:
        break;
     }
-    splx(s);
+    crit_exit();
 
     return 0;
 }
@@ -2472,9 +2449,6 @@ vga_mmap_buf(video_adapter_t *adp, vm_offset_t offset, int prot)
 #ifdef __i386__
     return i386_btop(adp->va_info.vi_window + offset);
 #endif
-#ifdef __alpha__
-    return alpha_btop(adp->va_info.vi_window + offset);
-#endif
 }
 
 #ifndef VGA_NO_MODE_CHANGE
@@ -2848,14 +2822,17 @@ get_palette(video_adapter_t *adp, int base, int count,
     u_char *g;
     u_char *b;
 
-    if (base < 0 || base >= 256 || count < 0 || (u_int)(base + count) > 256)
+    if (count < 0 || base < 0 || count > 256 || base > 256 ||
+       base + count > 256)
        return EINVAL;
 
-    r = malloc(count*3, M_DEVBUF, M_WAITOK);
+    r = kmalloc(count*3, M_DEVBUF, M_WAITOK);
     g = r + count;
     b = g + count;
-    if (vga_save_palette2(adp, base, count, r, g, b))
+    if (vga_save_palette2(adp, base, count, r, g, b)) {
+       kfree(r, M_DEVBUF);
        return ENODEV;
+    }
     copyout(r, red, count);
     copyout(g, green, count);
     copyout(b, blue, count);
@@ -2863,7 +2840,7 @@ get_palette(video_adapter_t *adp, int base, int count,
        bzero(r, count);
        copyout(r, trans, count);
     }
-    free(r, M_DEVBUF);
+    kfree(r, M_DEVBUF);
 
     return 0;
 }
@@ -2877,17 +2854,21 @@ set_palette(video_adapter_t *adp, int base, int count,
     u_char *b;
     int err;
 
-    if (base < 0 || base >= 256 || count < 0 || (u_int)(base + count) > 256)
+    if (count < 0 || base < 0 || count > 256 || base > 256 ||
+       base + count > 256)
        return EINVAL;
 
-    r = malloc(count*3, M_DEVBUF, M_WAITOK);
+    r = kmalloc(count*3, M_DEVBUF, M_WAITOK);
     g = r + count;
     b = g + count;
-    copyin(red, r, count);
-    copyin(green, g, count);
-    copyin(blue, b, count);
-    err = vga_load_palette2(adp, base, count, r, g, b);
-    free(r, M_DEVBUF);
+    err = copyin(red, r, count);
+    if (!err)
+       err = copyin(green, g, count);
+    if (!err)
+       err = copyin(blue, b, count);
+    if (!err)
+       err = vga_load_palette2(adp, base, count, r, g, b);
+    kfree(r, M_DEVBUF);
 
     return (err ? ENODEV : 0);
 }