# Linux Kernel Module Cheat

### 14.3. gem5 graphic mode

gem5 does not have a "text mode", since it cannot redirect the Linux terminal to same host terminal where the executable is running: you are always forced to connect to the terminal with `gem-shell`.

TODO could not get it working on `x86_64`, only ARM.

Overview: https://stackoverflow.com/questions/50364863/how-to-get-graphical-gui-output-and-user-touch-keyboard-mouse-input-in-a-ful/50364864#50364864

More concretely, first build the kernel with the gem5 arm Linux kernel patches, and then run:

    ./build-linux \
      --arch arm \
      --custom-config-file-gem5 \
      --linux-build-id gem5-v4.15 \
    ;
    ./run --arch arm --emulator gem5 --linux-build-id gem5-v4.15

and then on another shell:

    vinagre localhost:5900

The CONFIG_LOGO penguin only appears after several seconds, together with kernel messages of type:

    [    0.152755] [drm] found ARM HDLCD version r0p0
    [    0.152790] hdlcd 2b000000.hdlcd: bound virt-encoder (ops 0x80935f94)
    [    0.152795] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
    [    0.152799] [drm] No driver support for vblank timestamp query.
    [    0.215179] Console: switching to colour frame buffer device 240x67
    [    0.230389] hdlcd 2b000000.hdlcd: fb0:  frame buffer device
    [    0.230509] [drm] Initialized hdlcd 1.0.0 20151021 for 2b000000.hdlcd on minor 0

The port `5900` is incremented by one if you already have something running on that port, `gem5` stdout tells us the right port on stdout as:

    system.vncserver: Listening for connections on port 5900

and when we connect it shows a message:

    info: VNC client attached

Alternatively, you can also dump each new frame to an image file with `--frame-capture`:

    ./run \
      --arch arm \
      --emulator gem5 \
      --linux-build-id gem5-v4.15 \
      -- --frame-capture \
    ;

This creates on compressed PNG whenever the screen image changes inside the m5out directory with filename of type:

    frames_system.vncserver/fb.<frame-index>.<timestamp>.png.gz

It is fun to see how we get one new frame whenever the white underscore cursor appears and reappears under the penguin!

The last frame is always available uncompressed at: `system.framebuffer.png`.

TODO kmscube failed on `aarch64` with:

    kmscube[706]: unhandled level 2 translation fault (11) at 0x00000000, esr 0x92000006, in libgbm.so.1.0.0[7fbf6a6000+e000]

Tested on: 38fd6153d965ba20145f53dc1bb3ba34b336bde9

- Graphic mode gem5 aarch64

- gem5 graphic mode DP650

- gem5 graphic mode internals