cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qemu-edid.c (3681B)


      1/*
      2 * QEMU EDID test tool.
      3 *
      4 * This work is licensed under the terms of the GNU GPL, version 2 or later.
      5 * See the COPYING file in the top-level directory.
      6 */
      7#include "qemu/osdep.h"
      8#include "qemu/bswap.h"
      9#include "qemu/cutils.h"
     10#include "hw/display/edid.h"
     11
     12static qemu_edid_info info = {
     13    .prefx = 1024,
     14    .prefy = 768,
     15};
     16
     17static void usage(FILE *out)
     18{
     19    fprintf(out,
     20            "\n"
     21            "This is a test tool for the qemu edid generator.\n"
     22            "\n"
     23            "Typically you'll pipe the output into edid-decode\n"
     24            "to check if the generator works correctly.\n"
     25            "\n"
     26            "usage: qemu-edid <options>\n"
     27            "options:\n"
     28            "    -h             print this text\n"
     29            "    -o <file>      set output file (stdout by default)\n"
     30            "    -v <vendor>    set monitor vendor (three letters)\n"
     31            "    -n <name>      set monitor name\n"
     32            "    -s <serial>    set monitor serial\n"
     33            "    -d <dpi>       set display resolution\n"
     34            "    -x <prefx>     set preferred width\n"
     35            "    -y <prefy>     set preferred height\n"
     36            "    -X <maxx>      set maximum width\n"
     37            "    -Y <maxy>      set maximum height\n"
     38            "\n");
     39}
     40
     41int main(int argc, char *argv[])
     42{
     43    FILE *outfile = NULL;
     44    uint8_t blob[512];
     45    size_t size;
     46    uint32_t dpi = 100;
     47    int rc;
     48
     49    for (;;) {
     50        rc = getopt(argc, argv, "ho:x:y:X:Y:d:v:n:s:");
     51        if (rc == -1) {
     52            break;
     53        }
     54        switch (rc) {
     55        case 'o':
     56            if (outfile) {
     57                fprintf(stderr, "outfile specified twice\n");
     58                exit(1);
     59            }
     60            outfile = fopen(optarg, "w");
     61            if (outfile == NULL) {
     62                fprintf(stderr, "open %s: %s\n", optarg, strerror(errno));
     63                exit(1);
     64            }
     65            break;
     66        case 'x':
     67            if (qemu_strtoui(optarg, NULL, 10, &info.prefx) < 0) {
     68                fprintf(stderr, "not a number: %s\n", optarg);
     69                exit(1);
     70            }
     71            break;
     72        case 'y':
     73            if (qemu_strtoui(optarg, NULL, 10, &info.prefy) < 0) {
     74                fprintf(stderr, "not a number: %s\n", optarg);
     75                exit(1);
     76            }
     77            break;
     78        case 'X':
     79            if (qemu_strtoui(optarg, NULL, 10, &info.maxx) < 0) {
     80                fprintf(stderr, "not a number: %s\n", optarg);
     81                exit(1);
     82            }
     83            break;
     84        case 'Y':
     85            if (qemu_strtoui(optarg, NULL, 10, &info.maxy) < 0) {
     86                fprintf(stderr, "not a number: %s\n", optarg);
     87                exit(1);
     88            }
     89            break;
     90        case 'd':
     91            if (qemu_strtoui(optarg, NULL, 10, &dpi) < 0) {
     92                fprintf(stderr, "not a number: %s\n", optarg);
     93                exit(1);
     94            }
     95            break;
     96        case 'v':
     97            info.vendor = optarg;
     98            break;
     99        case 'n':
    100            info.name = optarg;
    101            break;
    102        case 's':
    103            info.serial = optarg;
    104            break;
    105        case 'h':
    106            usage(stdout);
    107            exit(0);
    108        default:
    109            usage(stderr);
    110            exit(1);
    111        }
    112    }
    113
    114    if (outfile == NULL) {
    115        outfile = stdout;
    116    }
    117
    118    info.width_mm = qemu_edid_dpi_to_mm(dpi, info.prefx);
    119    info.height_mm = qemu_edid_dpi_to_mm(dpi, info.prefy);
    120
    121    memset(blob, 0, sizeof(blob));
    122    qemu_edid_generate(blob, sizeof(blob), &info);
    123    size = qemu_edid_size(blob);
    124    fwrite(blob, size, 1, outfile);
    125    fflush(outfile);
    126
    127    exit(0);
    128}