Merge tools/lfbview to umka_monitor
This commit is contained in:
parent
94ebe02739
commit
dc48e267d6
1
.gitignore
vendored
1
.gitignore
vendored
@ -8,6 +8,7 @@
|
|||||||
umka_shell
|
umka_shell
|
||||||
umka_fuse
|
umka_fuse
|
||||||
umka_os
|
umka_os
|
||||||
|
umka_monitor
|
||||||
umka_ping
|
umka_ping
|
||||||
umka_gen_devices_dat
|
umka_gen_devices_dat
|
||||||
tools/mkdirrange
|
tools/mkdirrange
|
||||||
|
4
README
4
README
@ -57,8 +57,6 @@ mkdirrange - make directories with names in range
|
|||||||
|
|
||||||
mkfilepattern - make a file with contents of specific pattern
|
mkfilepattern - make a file with contents of specific pattern
|
||||||
|
|
||||||
lfbviewx - framebuffer viewer for X
|
|
||||||
|
|
||||||
|
|
||||||
BUILD
|
BUILD
|
||||||
-----
|
-----
|
||||||
@ -105,7 +103,7 @@ Testing
|
|||||||
Troubleshooting
|
Troubleshooting
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
# lfbviewx
|
# umka_monitor
|
||||||
|
|
||||||
Allow reading process_vm_readv syscall.
|
Allow reading process_vm_readv syscall.
|
||||||
|
|
||||||
|
@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
UMKa - User-Mode KolibriOS developer tools
|
|
||||||
lfbview - KolibriOS framebuffer viewer via SDL2
|
|
||||||
|
|
||||||
Copyright (C) 2023 Ivan Baravy <dunkaist@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <SDL2/SDL.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[]) {
|
|
||||||
const char *usage = "usage: lfbview <pid> <address> <width> <height>";
|
|
||||||
if (argc != 5) {
|
|
||||||
puts(usage);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
int depth = 32;
|
|
||||||
int umka_pid = strtol(argv[1], NULL, 0);
|
|
||||||
uintptr_t umka_lfb_addr = strtol(argv[2], NULL, 0);
|
|
||||||
size_t lfb_width = strtoul(argv[3], NULL, 0);
|
|
||||||
size_t lfb_height = strtoul(argv[4], NULL, 0);
|
|
||||||
|
|
||||||
if(SDL_Init(SDL_INIT_VIDEO) < 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to initialize the SDL2 library\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Window *window = SDL_CreateWindow("LFB Viewer SDL2",
|
|
||||||
SDL_WINDOWPOS_CENTERED,
|
|
||||||
SDL_WINDOWPOS_CENTERED,
|
|
||||||
400, 300,
|
|
||||||
0);
|
|
||||||
|
|
||||||
if(!window)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to create window\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface *window_surface = SDL_GetWindowSurface(window);
|
|
||||||
|
|
||||||
if(!window_surface)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to get the surface from the window\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t *lfb = (uint32_t*)malloc(lfb_width*lfb_height*sizeof(uint32_t));
|
|
||||||
|
|
||||||
struct iovec remote = {.iov_base = (void*)umka_lfb_addr,
|
|
||||||
.iov_len = lfb_width*lfb_height*4};
|
|
||||||
struct iovec local = {.iov_base = lfb,
|
|
||||||
.iov_len = lfb_width*lfb_height*4};
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t *p = window_surface->pixels;
|
|
||||||
while (1) {
|
|
||||||
process_vm_readv(umka_pid, &local, 1, &remote, 1, 0);
|
|
||||||
memcpy(window_surface->pixels, lfb, 400*300*4);
|
|
||||||
SDL_LockSurface(window_surface);
|
|
||||||
for (size_t y = 0; y < window_surface->h; y++) {
|
|
||||||
for (size_t x = 0; x < window_surface->w; x++) {
|
|
||||||
p[y*window_surface->pitch/4+x] = lfb[y*400+x];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SDL_UnlockSurface(window_surface);
|
|
||||||
SDL_UpdateWindowSurface(window);
|
|
||||||
sleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
UMKa - User-Mode KolibriOS developer tools
|
|
||||||
lfbviewx - framebuffer viewer for X
|
|
||||||
|
|
||||||
Copyright (C) 2020 Ivan Baravy <dunkaist@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
#include <X11/XKBlib.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
if (argc != 5) {
|
|
||||||
printf("usage: lfbviewx <pid> <address> <width> <height>\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
int depth = 32;
|
|
||||||
int umka_pid = strtol(argv[1], NULL, 0);
|
|
||||||
uintptr_t umka_lfb_addr = strtol(argv[2], NULL, 0);
|
|
||||||
size_t lfb_width = strtoul(argv[3], NULL, 0);
|
|
||||||
size_t lfb_height = strtoul(argv[4], NULL, 0);
|
|
||||||
|
|
||||||
Display *display = XOpenDisplay(NULL);
|
|
||||||
int screen_num = XDefaultScreen(display);
|
|
||||||
Window root = XDefaultRootWindow(display);
|
|
||||||
|
|
||||||
XVisualInfo vis_info;
|
|
||||||
if(!XMatchVisualInfo(display, screen_num, depth, TrueColor, &vis_info)) {
|
|
||||||
fprintf(stderr, "ERR: %d-bit depth is not supported\n", depth);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Visual *visual = vis_info.visual;
|
|
||||||
XSetWindowAttributes win_attr = {
|
|
||||||
.colormap = XCreateColormap(display, root, visual, AllocNone),
|
|
||||||
.background_pixel = 0,
|
|
||||||
.border_pixel = 0};
|
|
||||||
unsigned long win_mask = CWBackPixel | CWColormap | CWBorderPixel;
|
|
||||||
Window window = XCreateWindow(display, root, 0, 0, lfb_width, lfb_height, 0, depth, InputOutput, visual, win_mask, &win_attr);
|
|
||||||
GC gc = XCreateGC(display, window, 0, 0);
|
|
||||||
|
|
||||||
uint32_t *lfb = (uint32_t*)malloc(lfb_width*lfb_height*sizeof(uint32_t));
|
|
||||||
XImage *image = XCreateImage(display, visual, depth, ZPixmap, 0, (char*)lfb, lfb_width, lfb_height, 32, 0);
|
|
||||||
|
|
||||||
XSelectInput(display, window, ExposureMask | KeyPressMask);
|
|
||||||
XStoreName(display, window, "KolibriOS LFB Viewer for X");
|
|
||||||
XMapWindow(display, window);
|
|
||||||
|
|
||||||
|
|
||||||
struct iovec remote = {.iov_base = (void*)umka_lfb_addr,
|
|
||||||
.iov_len = lfb_width*lfb_height*4};
|
|
||||||
struct iovec local = {.iov_base = lfb,
|
|
||||||
.iov_len = lfb_width*lfb_height*4};
|
|
||||||
/*
|
|
||||||
XEvent event;
|
|
||||||
while (true) {
|
|
||||||
XNextEvent(display, &event);
|
|
||||||
if (event.type == Expose) {
|
|
||||||
process_vm_readv(umka_pid, &local, 1, &remote, 1, 0);
|
|
||||||
XPutImage(display, window, gc, image, 0, 0, 0, 0, lfb_width, lfb_height);
|
|
||||||
} else if (event.type == KeyPress) {
|
|
||||||
int keysym = XkbKeycodeToKeysym(display, event. xkey.keycode, 0, 0);
|
|
||||||
|
|
||||||
if (keysym == XK_Escape) break;
|
|
||||||
switch (keysym) {
|
|
||||||
case XK_Left: {break;}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
XEvent event;
|
|
||||||
while (true) {
|
|
||||||
while (XCheckMaskEvent(display, (long)-1, &event)) { /* skip */ }
|
|
||||||
process_vm_readv(umka_pid, &local, 1, &remote, 1, 0);
|
|
||||||
XPutImage(display, window, gc, image, 0, 0, 0, 0, lfb_width, lfb_height);
|
|
||||||
sleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
XCloseDisplay(display);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -7,8 +7,8 @@ CFLAGS=$(WARNINGS) $(NOWARNINGS) -std=c11 -O2 \
|
|||||||
-DNDEBUG -D_POSIX_C_SOURCE=200809L -fno-pie
|
-DNDEBUG -D_POSIX_C_SOURCE=200809L -fno-pie
|
||||||
LDFLAGS=-no-pie
|
LDFLAGS=-no-pie
|
||||||
|
|
||||||
all: mkdirrange mkfilepattern lfbviewx randdir covpreproc mkdoubledirs \
|
all: mkdirrange mkfilepattern randdir covpreproc mkdoubledirs gensamehash \
|
||||||
gensamehash mksamehash lfbview
|
mksamehash
|
||||||
|
|
||||||
gensamehash: gensamehash.c
|
gensamehash: gensamehash.c
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
||||||
@ -25,11 +25,6 @@ mkdirrange: mkdirrange.c
|
|||||||
mkfilepattern: mkfilepattern.c
|
mkfilepattern: mkfilepattern.c
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
||||||
|
|
||||||
lfbviewx: lfbviewx.c
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ -lX11 -lXext -D_GNU_SOURCE
|
|
||||||
|
|
||||||
lfbview: lfbview.c
|
|
||||||
$(CC) `sdl2-config --cflags --libs` -o $@ $< -D_GNU_SOURCE
|
|
||||||
randdir: randdir.c
|
randdir: randdir.c
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
||||||
|
|
||||||
@ -39,5 +34,5 @@ covpreproc: covpreproc.c
|
|||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o mkdirrange mkfilepattern lfbviewx randdir covpreproc \
|
rm -f *.o mkdirrange mkfilepattern randdir covpreproc mkdoubledirs \
|
||||||
mkdoubledirs gensamehash mksamehash lfbview
|
gensamehash mksamehash
|
||||||
|
156
umka_monitor.c
Normal file
156
umka_monitor.c
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
/*
|
||||||
|
SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
UMKa - User-Mode KolibriOS developer tools
|
||||||
|
umka_monitor - a program to monitor and control umka_os
|
||||||
|
|
||||||
|
Copyright (C) 2023 Ivan Baravy <dunkaist@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <threads.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include "umka_os.h"
|
||||||
|
#include "bestline.h"
|
||||||
|
#include "optparse.h"
|
||||||
|
|
||||||
|
struct shared_info sinfo;
|
||||||
|
|
||||||
|
int
|
||||||
|
sdlthr(void *arg) {
|
||||||
|
(void)arg;
|
||||||
|
if(SDL_Init(SDL_INIT_VIDEO) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize the SDL2 library\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Window *window = SDL_CreateWindow("LFB Viewer SDL2",
|
||||||
|
SDL_WINDOWPOS_CENTERED,
|
||||||
|
SDL_WINDOWPOS_CENTERED,
|
||||||
|
sinfo.lfb_width, sinfo.lfb_height,
|
||||||
|
0);
|
||||||
|
|
||||||
|
if(!window)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to create window\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Surface *window_surface = SDL_GetWindowSurface(window);
|
||||||
|
|
||||||
|
if(!window_surface)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to get the surface from the window\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t *lfb = (uint32_t*)malloc(sinfo.lfb_width*sinfo.lfb_height*sizeof(uint32_t));
|
||||||
|
|
||||||
|
struct iovec remote = {.iov_base = (void*)(uintptr_t)sinfo.lfb_base,
|
||||||
|
.iov_len = sinfo.lfb_width*sinfo.lfb_height*4};
|
||||||
|
struct iovec local = {.iov_base = lfb,
|
||||||
|
.iov_len = sinfo.lfb_width*sinfo.lfb_height*4};
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t *p = window_surface->pixels;
|
||||||
|
while (1) {
|
||||||
|
process_vm_readv(sinfo.pid, &local, 1, &remote, 1, 0);
|
||||||
|
memcpy(window_surface->pixels, lfb, 400*300*4);
|
||||||
|
SDL_LockSurface(window_surface);
|
||||||
|
for (ssize_t y = 0; y < window_surface->h; y++) {
|
||||||
|
for (ssize_t x = 0; x < window_surface->w; x++) {
|
||||||
|
p[y*window_surface->pitch/4+x] = lfb[y*400+x];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_UnlockSurface(window_surface);
|
||||||
|
SDL_UpdateWindowSurface(window);
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[]) {
|
||||||
|
(void)argc;
|
||||||
|
const char *usage = "umka_monitor [-i <infile>] [-o <outfile>] [-s <shname>]\n";
|
||||||
|
const char *shname = "/umka";
|
||||||
|
int shfd = 0;
|
||||||
|
const char *infile = NULL, *outfile = NULL;
|
||||||
|
|
||||||
|
struct optparse options;
|
||||||
|
int opt;
|
||||||
|
optparse_init(&options, argv);
|
||||||
|
|
||||||
|
while ((opt = optparse(&options, "i:o:s:")) != -1) {
|
||||||
|
switch (opt) {
|
||||||
|
case 'i':
|
||||||
|
infile = options.optarg;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
outfile = options.optarg;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
shname = options.optarg;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "bad option: %c\n", opt);
|
||||||
|
fputs(usage, stderr);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (infile && !freopen(infile, "r", stdin)) {
|
||||||
|
fprintf(stderr, "[!] can't open file for reading: %s\n", infile);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (outfile && !freopen(outfile, "w", stdout)) {
|
||||||
|
fprintf(stderr, "[!] can't open file for writing: %s\n", outfile);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shname) {
|
||||||
|
shfd = shm_open(shname, O_RDONLY, S_IRUSR | S_IWUSR);
|
||||||
|
if (!shfd) {
|
||||||
|
perror("[!] can't open shared memory");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ssize_t nread = read(shfd, &sinfo, sizeof(sinfo));
|
||||||
|
if (nread != sizeof(sinfo)) {
|
||||||
|
perror("can't read from shared memory");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
printf("read umka_os configuration:\n"
|
||||||
|
" pid: %d\n"
|
||||||
|
" lfb_base: %p\n"
|
||||||
|
" lfb_bpp: %u"
|
||||||
|
" lfb_width: %u"
|
||||||
|
" lfb_height: %u"
|
||||||
|
" cmd: %p\n",
|
||||||
|
(pid_t)sinfo.pid, (void*)(uintptr_t)sinfo.lfb_base, sinfo.lfb_bpp,
|
||||||
|
sinfo.lfb_width, sinfo.lfb_height, (void*)(uintptr_t)sinfo.cmd_buf);
|
||||||
|
shm_unlink(shname);
|
||||||
|
|
||||||
|
union sigval sval = (union sigval){.sival_int = 14};
|
||||||
|
|
||||||
|
thrd_t st;
|
||||||
|
thrd_create(&st, sdlthr, NULL);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
getchar();
|
||||||
|
sigqueue(sinfo.pid, SIGUSR2, sval);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
24
umka_os.h
Normal file
24
umka_os.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
UMKa - User-Mode KolibriOS developer tools
|
||||||
|
umka_os - kind of KolibriOS anykernel
|
||||||
|
|
||||||
|
Copyright (C) 2023 Ivan Baravy <dunkaist@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct shared_info {
|
||||||
|
uint64_t pid;
|
||||||
|
uint32_t lfb_base;
|
||||||
|
uint32_t lfb_bpp;
|
||||||
|
uint32_t lfb_width;
|
||||||
|
uint32_t lfb_height;
|
||||||
|
uint32_t cmd_buf;
|
||||||
|
uint32_t pad;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CMD_BUF_LEN 0x10000
|
||||||
|
|
||||||
|
uint8_t cmd_buf[CMD_BUF_LEN];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user