forked from izaya/LuPPC
Some work here and there
This commit is contained in:
parent
65ea917720
commit
3619b03290
53
Makefile
53
Makefile
@ -35,6 +35,8 @@ OUTNAME = lupi
|
|||||||
debug: CFLAGS+= -g -DLOGGING -DDEBUG
|
debug: CFLAGS+= -g -DLOGGING -DDEBUG
|
||||||
debug: build
|
debug: build
|
||||||
|
|
||||||
|
####
|
||||||
|
|
||||||
winexe: $(BUILD)$(OUTNAME)
|
winexe: $(BUILD)$(OUTNAME)
|
||||||
cp $(BUILD)$(OUTNAME) $(BUILD)$(OUTNAME).exe
|
cp $(BUILD)$(OUTNAME) $(BUILD)$(OUTNAME).exe
|
||||||
|
|
||||||
@ -48,6 +50,55 @@ win-build: build winexe
|
|||||||
win-debug: LIBS+= -lws2_32 -lgdi32
|
win-debug: LIBS+= -lws2_32 -lgdi32
|
||||||
win-debug: debug winexe
|
win-debug: debug winexe
|
||||||
|
|
||||||
|
####
|
||||||
|
|
||||||
|
dependencies/v86:
|
||||||
|
cd dependencies; git clone https://github.com/magik6k/v86.git
|
||||||
|
|
||||||
|
dependencies/v86/build/libv86.js: dependencies/v86
|
||||||
|
cd dependencies/v86 && wget -P closure-compiler http://dl.google.com/closure-compiler/compiler-latest.zip
|
||||||
|
cd dependencies/v86 && unzip -d closure-compiler closure-compiler/compiler-latest.zip compiler.jar
|
||||||
|
cd dependencies/v86 && make build/libv86.js
|
||||||
|
|
||||||
|
$(BUILD)web: dependencies/v86/build/libv86.js
|
||||||
|
rm -rf bin/web; mkdir -p bin/web
|
||||||
|
|
||||||
|
web: iso bin/web
|
||||||
|
|
||||||
|
|
||||||
|
####
|
||||||
|
ISOKERNEL=linux-4.5.2
|
||||||
|
|
||||||
|
dependencies/$(ISOKERNEL).tar.xz:
|
||||||
|
cd dependencies && wget https://cdn.kernel.org/pub/linux/kernel/v4.x/$(ISOKERNEL).tar.xz
|
||||||
|
|
||||||
|
dependencies/$(ISOKERNEL)/arch/x86/boot/bzImage: $(BUILD)lupi.cpio dependencies/$(ISOKERNEL).tar.xz
|
||||||
|
rm -rf dependencies/$(ISOKERNEL)/
|
||||||
|
cd dependencies && tar xf $(ISOKERNEL).tar.xz
|
||||||
|
cp src/iso/linux.config dependencies/$(ISOKERNEL)/.config
|
||||||
|
cd dependencies/$(ISOKERNEL)/ && make -j8
|
||||||
|
|
||||||
|
$(BUILD)lupi.cpio: $(BUILDDIRECTORIES) $(BUILD)$(OUTNAME) build
|
||||||
|
rm -rf $(BUILD)iso.init; mkdir -p $(BUILD)iso.init
|
||||||
|
mkdir -p bin/iso.init/sbin bin/iso.init/proc bin/iso.init/sys bin/iso.init/dev bin/iso.init/tmp
|
||||||
|
cp bin/lupi bin/iso.init/sbin/init
|
||||||
|
(cd bin/iso.init; find . | fakeroot cpio -o -H newc) > $@
|
||||||
|
|
||||||
|
$(BUILD)lupi.iso: dependencies/$(ISOKERNEL)/arch/x86/boot/bzImage
|
||||||
|
rm -rf bin/iso.dir; mkdir -p bin/iso.dir bin/iso.dir/boot
|
||||||
|
cp $(BUILD)lupi.cpio bin/iso.dir/boot/lupi.img
|
||||||
|
cp dependencies/$(ISOKERNEL)/arch/x86/boot/bzImage bin/iso.dir/boot/vmlinuz
|
||||||
|
cp src/iso/isolinux.cfg bin/iso.dir/isolinux.cfg
|
||||||
|
mkdir -p bin/iso.dir/syslinux bin/iso.dir/sbin
|
||||||
|
cp bin/lupi bin/iso.dir/sbin/init
|
||||||
|
cp /usr/lib/syslinux/bios/{isolinux.bin,ldlinux.c32,isohdpfx.bin} bin/iso.dir/syslinux/
|
||||||
|
mkisofs -o bin/lupi.iso -b syslinux/isolinux.bin -c syslinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table bin/iso.dir
|
||||||
|
|
||||||
|
iso: PREFIX?=i486-linux-musl
|
||||||
|
iso: build $(BUILD)lupi.iso
|
||||||
|
|
||||||
|
####
|
||||||
|
|
||||||
$(BUILDDIRECTORIES):
|
$(BUILDDIRECTORIES):
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
|
|
||||||
@ -81,4 +132,4 @@ smallclean:
|
|||||||
|
|
||||||
# Other
|
# Other
|
||||||
|
|
||||||
.PHONY: debug clean cleanresourcues resources build smallclean all
|
.PHONY: web iso debug clean cleanresourcues resources build smallclean all
|
||||||
|
@ -34,6 +34,11 @@ int event_pull(int timeout);
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
void winapigpu_init(lua_State* L);
|
void winapigpu_init(lua_State* L);
|
||||||
|
#define WIN32
|
||||||
|
#include <event2/event.h>
|
||||||
|
#include <event2/event_struct.h>
|
||||||
|
void handleWinevent(evutil_socket_t fd, short what, void *eventc);
|
||||||
|
#undef WIN32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,46 +24,7 @@ struct event_base *base;
|
|||||||
struct event stdinEvent;
|
struct event stdinEvent;
|
||||||
int nevt = 0;
|
int nevt = 0;
|
||||||
|
|
||||||
#ifdef _WIN32
|
static void handleStdin(evutil_socket_t fd, short what, void *eventc) {
|
||||||
struct event winEvent;
|
|
||||||
evutil_socket_t pfd[2] = {0,0};
|
|
||||||
|
|
||||||
void pokeWinEvt(char ch) {
|
|
||||||
send(pfd[1], &ch, 1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handleWinevent(evutil_socket_t fd, short what, void *ptr) {
|
|
||||||
if(what != EV_READ) return;
|
|
||||||
|
|
||||||
char buf;
|
|
||||||
int r = recv(fd, &buf, 1, 0); /* TODO: Wide chars? */
|
|
||||||
if(r > 0) {
|
|
||||||
logi(buf);
|
|
||||||
logn(" < win char");
|
|
||||||
lua_State* L = getL();
|
|
||||||
|
|
||||||
lua_getglobal(L, "pushEvent");
|
|
||||||
lua_pushstring(L, "key_down");
|
|
||||||
lua_pushstring(L, "TODO:SetThisUuid");/* Also in textgpu.lua */
|
|
||||||
lua_pushnumber(L, buf);
|
|
||||||
lua_pushnumber(L, -1);
|
|
||||||
lua_pushstring(L, "root");
|
|
||||||
lua_call(L, 5, 0);
|
|
||||||
|
|
||||||
lua_getglobal(L, "pushEvent");
|
|
||||||
lua_pushstring(L, "key_up");
|
|
||||||
lua_pushstring(L, "TODO:SetThisUuid");
|
|
||||||
lua_pushnumber(L, buf);
|
|
||||||
lua_pushnumber(L, -1);
|
|
||||||
lua_pushstring(L, "root");
|
|
||||||
lua_call(L, 5, 0);
|
|
||||||
|
|
||||||
nevt += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void handleStdin(evutil_socket_t fd, short what, void *ptr) {
|
|
||||||
char buf;
|
char buf;
|
||||||
|
|
||||||
if(what != EV_READ) return;
|
if(what != EV_READ) return;
|
||||||
@ -88,11 +49,14 @@ static void handleStdin(evutil_socket_t fd, short what, void *ptr) {
|
|||||||
lua_pushstring(L, "root");
|
lua_pushstring(L, "root");
|
||||||
lua_call(L, 5, 0);
|
lua_call(L, 5, 0);
|
||||||
|
|
||||||
nevt += 2;
|
*((int*) eventc) += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
extern evutil_socket_t winInputPipe[2]; //TODO: make it nicer
|
||||||
|
struct event winEvent;
|
||||||
|
#endif
|
||||||
|
|
||||||
void event_prepare() {
|
void event_prepare() {
|
||||||
struct event_config* cfg = event_config_new();
|
struct event_config* cfg = event_config_new();
|
||||||
@ -100,12 +64,12 @@ void event_prepare() {
|
|||||||
base = event_base_new_with_config(cfg);
|
base = event_base_new_with_config(cfg);
|
||||||
|
|
||||||
evutil_make_socket_nonblocking(STDIN_FILENO);
|
evutil_make_socket_nonblocking(STDIN_FILENO);
|
||||||
event_assign(&stdinEvent, base, STDIN_FILENO, EV_READ, handleStdin, NULL);
|
event_assign(&stdinEvent, base, STDIN_FILENO, EV_READ, handleStdin, &nevt);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
evutil_socketpair(LOCAL_SOCKETPAIR_AF, SOCK_STREAM, 0, pfd);
|
evutil_socketpair(LOCAL_SOCKETPAIR_AF, SOCK_STREAM, 0, winInputPipe);
|
||||||
evutil_make_socket_nonblocking(pfd[0]);
|
evutil_make_socket_nonblocking(winInputPipe[0]);
|
||||||
event_assign(&winEvent, base, pfd[0], EV_READ, handleWinevent, NULL);
|
event_assign(&winEvent, base, winInputPipe[0], EV_READ, handleWinevent, &nevt);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
45
src/c/event/winevent.c
Normal file
45
src/c/event/winevent.c
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#include "lupi.h"
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define WIN32
|
||||||
|
|
||||||
|
#include <event2/event.h>
|
||||||
|
#include <event2/event_struct.h>
|
||||||
|
|
||||||
|
evutil_socket_t winInputPipe[2] = {0,0};
|
||||||
|
|
||||||
|
void pokeWinEvt(char ch) {
|
||||||
|
send(winInputPipe[1], &ch, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleWinevent(evutil_socket_t fd, short what, void *eventc) {
|
||||||
|
if(what != EV_READ) return;
|
||||||
|
|
||||||
|
char buf;
|
||||||
|
int r = recv(fd, &buf, 1, 0); /* TODO: Wide chars? */
|
||||||
|
if(r > 0) {
|
||||||
|
lua_State* L = getL();
|
||||||
|
|
||||||
|
lua_getglobal(L, "pushEvent");
|
||||||
|
lua_pushstring(L, "key_down");
|
||||||
|
lua_pushstring(L, "TODO:SetThisUuid");/* Also in textgpu.lua */
|
||||||
|
lua_pushnumber(L, buf);
|
||||||
|
lua_pushnumber(L, -1);
|
||||||
|
lua_pushstring(L, "root");
|
||||||
|
lua_call(L, 5, 0);
|
||||||
|
|
||||||
|
lua_getglobal(L, "pushEvent");
|
||||||
|
lua_pushstring(L, "key_up");
|
||||||
|
lua_pushstring(L, "TODO:SetThisUuid");
|
||||||
|
lua_pushnumber(L, buf);
|
||||||
|
lua_pushnumber(L, -1);
|
||||||
|
lua_pushstring(L, "root");
|
||||||
|
lua_call(L, 5, 0);
|
||||||
|
|
||||||
|
*((int*) eventc) += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
@ -448,6 +448,8 @@ void fb_start(lua_State *L) {
|
|||||||
{"getBackground", l_fb_getbg},
|
{"getBackground", l_fb_getbg},
|
||||||
{"getForeground", l_fb_getfg},
|
{"getForeground", l_fb_getfg},
|
||||||
{"get", l_fb_get},
|
{"get", l_fb_get},
|
||||||
|
{"getfg", l_fb_getfg},
|
||||||
|
{"getbg", l_fb_getbg},
|
||||||
{"getNearest", l_get_nearest},
|
{"getNearest", l_get_nearest},
|
||||||
#endif
|
#endif
|
||||||
{"isReady", l_fb_ready},
|
{"isReady", l_fb_ready},
|
||||||
@ -475,7 +477,7 @@ void fb_start(lua_State *L) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fb_vinfo.bits_per_pixel = 16;
|
fb_vinfo.bits_per_pixel = 32;
|
||||||
if (fb_rot == 1 || fb_rot == 3) {
|
if (fb_rot == 1 || fb_rot == 3) {
|
||||||
fb_cw = fb_vinfo.yres / 8;
|
fb_cw = fb_vinfo.yres / 8;
|
||||||
fb_ch = fb_vinfo.xres / 16;
|
fb_ch = fb_vinfo.xres / 16;
|
||||||
|
@ -89,11 +89,14 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WM_CHAR:
|
case WM_CHAR:
|
||||||
//case WM_UNICHAR:
|
case WM_UNICHAR:
|
||||||
//case WM_KEYUP:
|
//case WM_KEYUP:
|
||||||
//case WM_KEYDOWN:
|
case WM_KEYDOWN: {
|
||||||
|
logi(wParam);
|
||||||
|
logn("");
|
||||||
pokeWinEvt(wParam);
|
pokeWinEvt(wParam);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
logn("win: Create");
|
logn("win: Create");
|
||||||
screenbb = (uchar*) calloc(RES_X * RES_Y, BYPP);
|
screenbb = (uchar*) calloc(RES_X * RES_Y, BYPP);
|
||||||
@ -159,7 +162,7 @@ void* winapigpu_events(void* ign) {
|
|||||||
|
|
||||||
MSG Msg;
|
MSG Msg;
|
||||||
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
|
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
|
||||||
TranslateMessage(&Msg);
|
//TranslateMessage(&Msg);
|
||||||
DispatchMessage(&Msg);
|
DispatchMessage(&Msg);
|
||||||
}
|
}
|
||||||
logn("winapi quit!!");
|
logn("winapi quit!!");
|
||||||
|
@ -4,12 +4,18 @@
|
|||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
|
||||||
void lupi_init() {
|
void lupi_init() {
|
||||||
if(getpid() == 1) {
|
if(getpid() == 1) {
|
||||||
mount(NULL, "/sys", "sysfs", 0, NULL);
|
mount(NULL, "/sys", "sysfs", 0, NULL);
|
||||||
mount(NULL, "/proc", "procfs", 0, NULL);
|
mount(NULL, "/proc", "procfs", 0, NULL);
|
||||||
}
|
}
|
||||||
|
struct statvfs fsstat;
|
||||||
|
|
||||||
|
statvfs("/", &fsstat);
|
||||||
|
printf("Filesystem / RO status: %X\n",fsstat.f_flag & MS_RDONLY);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void lupi_init() {
|
void lupi_init() {
|
||||||
|
6
src/iso/isolinux.cfg
Normal file
6
src/iso/isolinux.cfg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
prompt 0
|
||||||
|
default 1
|
||||||
|
|
||||||
|
LABEL 1
|
||||||
|
LINUX boot/vmlinuz
|
||||||
|
INITRD boot/lupi.img
|
3911
src/iso/linux.config
Normal file
3911
src/iso/linux.config
Normal file
File diff suppressed because it is too large
Load Diff
@ -106,7 +106,7 @@ function fbgpu.start()
|
|||||||
function gpu.get(x, y)
|
function gpu.get(x, y)
|
||||||
checkArg(1, x, "number")
|
checkArg(1, x, "number")
|
||||||
checkArg(2, y, "number")
|
checkArg(2, y, "number")
|
||||||
return utf8.char(fb.get(x-1, y-1))
|
return utf8.char(fb.get(x-1, y-1)), mapping[fb.getfg(x-1, y-1)], mapping[fb.getbg(x-1, y-1)]
|
||||||
end
|
end
|
||||||
function gpu.set(x, y, value, vertical)
|
function gpu.set(x, y, value, vertical)
|
||||||
checkArg(1, x, "number")
|
checkArg(1, x, "number")
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
local gpudetect = {}
|
local gpudetect = {}
|
||||||
|
|
||||||
local function tryText()
|
local function tryText()
|
||||||
|
lprint("Trying text-mode gpu")
|
||||||
loadModule("textgpu")
|
loadModule("textgpu")
|
||||||
local textgpuAddr, tgfail = modules.textgpu.start()
|
local textgpuAddr, tgfail = modules.textgpu.start()
|
||||||
if not textgpuAddr then
|
if not textgpuAddr then
|
||||||
@ -11,6 +12,7 @@ local function tryText()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function tryFb()
|
local function tryFb()
|
||||||
|
lprint("Trying framebuffer-mode gpu")
|
||||||
if framebuffer.isReady() then
|
if framebuffer.isReady() then
|
||||||
loadModule("fbgpu")
|
loadModule("fbgpu")
|
||||||
modules.fbgpu.start()
|
modules.fbgpu.start()
|
||||||
|
@ -121,8 +121,8 @@ function textgpu.start()
|
|||||||
function gpu.get(x, y)
|
function gpu.get(x, y)
|
||||||
checkArg(1, x, "number")
|
checkArg(1, x, "number")
|
||||||
checkArg(2, y, "number")
|
checkArg(2, y, "number")
|
||||||
--FIXME: ASAP: Implement
|
|
||||||
return " "
|
return tbuffer[y]:sub(x,x), mapping[fbuffer[y]:sub(x,x)], mapping[bbuffer[y]:sub(x,x)]
|
||||||
end
|
end
|
||||||
function gpu.set(x, y, value, vertical)
|
function gpu.set(x, y, value, vertical)
|
||||||
checkArg(1, x, "number")
|
checkArg(1, x, "number")
|
||||||
|
30
src/web/index.html
Normal file
30
src/web/index.html
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<title>LuPI Web</title>
|
||||||
|
|
||||||
|
<script src="libv86.js"></script>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
window.onload = function()
|
||||||
|
{
|
||||||
|
var emulator = window.emulator = new V86Starter({
|
||||||
|
memory_size: 64 * 1024 * 1024,
|
||||||
|
vga_memory_size: 8 * 1024 * 1024,
|
||||||
|
screen_container: document.getElementById("screen_container"),
|
||||||
|
bios: {
|
||||||
|
url: "seabios.bin",
|
||||||
|
},
|
||||||
|
vga_bios: {
|
||||||
|
url: "bios/vgabios.bin",
|
||||||
|
},
|
||||||
|
cdrom: {
|
||||||
|
url: "lupi.iso",
|
||||||
|
},
|
||||||
|
autostart: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div id="screen_container">
|
||||||
|
<div style="white-space: pre; font: 14px monospace; line-height: 14px"></div>
|
||||||
|
<canvas style="display: none"></canvas>
|
||||||
|
</div>
|
Loading…
Reference in New Issue
Block a user