⬢ DragonFlyBSD Kernel Audit
DF-4644 / fb_dispatch_probe.c
← back to finding ↓ download raw
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/fbio.h>

static void dump_adpinfo(int fd) {
    video_adapter_info_t ai;
    memset(&ai, 0x41, sizeof(ai));
    if (ioctl(fd, FBIO_ADPINFO, &ai) < 0) { perror("FBIO_ADPINFO"); return; }
    printf("sizeof(video_adapter_info_t)=%zu\n", sizeof(ai));
    printf("index=%d type=%d name=%s unit=%d flags=%x\n",
           ai.va_index, ai.va_type, ai.va_name, ai.va_unit, ai.va_flags);
    printf("io=%x/%x mem=%x/%x window=%#x wsize=%zu gran=%zu orig=%u\n",
           ai.va_io_base, ai.va_io_size, ai.va_mem_base, ai.va_mem_size,
           ai.va_window, ai.va_window_size, ai.va_window_gran, ai.va_window_orig);
    printf("unused0=%#x bufsize=%zu mode=%d initmode=%d biosmode=%d lw=%d ds=%d,%d\n",
           ai.va_unused0, ai.va_buffer_size, ai.va_mode, ai.va_initial_mode,
           ai.va_initial_bios_mode, ai.va_line_width,
           ai.va_disp_start.x, ai.va_disp_start.y);
    int i, n = 0;
    for (i = 0; i < (int)sizeof(ai.va_reserved); i++)
        if (((unsigned char *)ai.va_reserved)[i] == 0x41) n++;
    printf("va_reserved bytes NOT touched by kernel: %d/%zu (0 => fully zeroed by ioctl layer)\n",
           n, sizeof(ai.va_reserved));
}

static void modeinfo(int fd, int mode) {
    video_info_t vi;
    memset(&vi, 0, sizeof(vi));
    vi.vi_mode = mode;
    int r = ioctl(fd, FBIO_MODEINFO, &vi);
    printf("FBIO_MODEINFO vi_mode=%d (0x%x) -> rc=%d", mode, mode, r);
    if (r == 0)
        printf(" w=%d h=%d depth=%d window=%#lx\n", vi.vi_width, vi.vi_height, vi.vi_depth, (unsigned long)vi.vi_window);
    else
        printf(" errno=%d (%s)\n", errno, strerror(errno));
}

int main(void) {
    int fd = open("/dev/ttyv0", O_RDWR);
    if (fd < 0) { perror("open /dev/ttyv0"); return 1; }
    int v = -1;
    printf("FBIO_ADAPTER -> %d", ioctl(fd, FBIO_ADAPTER, &v));
    printf(" index=%d\n", v);
    dump_adpinfo(fd);
    modeinfo(fd, 0); modeinfo(fd, 2); modeinfo(fd, 999);
    modeinfo(fd, -5); modeinfo(fd, 0x7fffffff);
    video_info_t f; memset(&f, 0, sizeof(f));
    f.vi_width = 80; f.vi_height = 25;
    printf("FBIO_FINDMODE -> %d errno=%d\n", ioctl(fd, FBIO_FINDMODE, &f), errno);
    if (f.vi_mode >= 0) printf("  found mode %d %dx%d\n", f.vi_mode, f.vi_width, f.vi_height);
    close(fd);
    return 0;
}