From 3c40f50fb6d8fca6e8c655b44ee4b537fa9142cf Mon Sep 17 00:00:00 2001 From: aramya <22577625+thamugadi@users.noreply.github.com> Date: Sat, 1 Jul 2023 12:07:36 +0100 Subject: [PATCH] device tree methods --- Makefile | 2 +- entry/boot.c | 4 +- entry/ofw.c | 283 ++++++++++++++++++++++++++++++++++ entry/boot.h => include/ofw.h | 4 +- 4 files changed, 288 insertions(+), 5 deletions(-) rename entry/boot.h => include/ofw.h (57%) diff --git a/Makefile b/Makefile index 71b8dc7..c8e9a09 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ kernel.elf: $(OBJECTS) $(PPC)-ld -Ttext=0x200000 -Tdata=0x300100 $^ -o $@ %.elf: %.c - $(PPC)-gcc -c $< -o $@ + $(PPC)-gcc -I include -c $< -o $@ %.elf: %.s $(PPC)-as -c $< -o $@ diff --git a/entry/boot.c b/entry/boot.c index d3d6d6e..f5013fe 100644 --- a/entry/boot.c +++ b/entry/boot.c @@ -1,4 +1,6 @@ -#include "boot.h" +void (*ofw)(); +void __eabi(); + void __stack_chk_fail_local(void) { } diff --git a/entry/ofw.c b/entry/ofw.c index aa135fc..4315333 100644 --- a/entry/ofw.c +++ b/entry/ofw.c @@ -1,3 +1,5 @@ +#include + extern void (*ofw)(); int ofw_test(char* name) @@ -22,3 +24,284 @@ int ofw_test(char* name) return ofw_arg.ret; } + +phandle child(phandle _child) +{ + struct + { + char* service; + int n_args; + int n_rets; + phandle arg; + phandle ret; + } ofw_arg; + + char _service[6] = "child"; + ofw_arg.service = _service; + + ofw_arg.n_args = 1; + ofw_arg.n_rets = 1; + ofw_arg.arg = _child; + + ofw(&ofw_arg); + + return ofw_arg.ret; +} + +phandle parent(phandle _parent) +{ + struct + { + char* service; + int n_args; + int n_rets; + phandle arg; + phandle ret; + } ofw_arg; + + char _service[7] = "parent"; + ofw_arg.service = _service; + + ofw_arg.n_args = 1; + ofw_arg.n_rets = 1; + ofw_arg.arg = _parent; + + ofw(&ofw_arg); + + return ofw_arg.ret; +} + +phandle instance_to_package(ihandle _instance) +{ + struct + { + char* service; + int n_args; + int n_rets; + ihandle arg; + phandle ret; + } ofw_arg; + + char _service[20] = "instance-to-package"; + ofw_arg.service = _service; + + ofw_arg.n_args = 1; + ofw_arg.n_rets = 1; + ofw_arg.arg = _instance; + + ofw(&ofw_arg); + + return ofw_arg.ret; +} + +int getproplen(phandle node, char* name) +{ + struct + { + char* service; + int n_args; + int n_rets; + phandle arg1; + char* arg2; + int ret; + } ofw_arg; + + char _service[11] = "getproplen"; + ofw_arg.service = _service; + + ofw_arg.n_args = 2; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = node; + ofw_arg.arg2 = name; + + ofw(&ofw_arg); + return ofw_arg.ret; +} + +int getprop(phandle node, char* name, uint8_t* buf, int buflen) +{ + struct + { + char* service; + int n_args; + int n_rets; + phandle arg1; + char* arg2; + uint8_t* arg3; + int arg4; + int ret; + } ofw_arg; + + char _service[8] = "getprop"; + ofw_arg.service = _service; + + ofw_arg.n_args = 4; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = node; + ofw_arg.arg2 = name; + ofw_arg.arg3 = buf; + ofw_arg.arg4 = buflen; + + ofw(&ofw_arg); + return ofw_arg.ret; +} + +int nextprop(phandle node, char* previous, uint8_t* buf) +{ + struct + { + char* service; + int n_args; + int n_rets; + phandle arg1; + char* arg2; + uint8_t* arg3; + int ret; + } ofw_arg; + + char _service[9] = "nextprop"; + ofw_arg.service = _service; + + ofw_arg.n_args = 3; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = node; + ofw_arg.arg2 = previous; + ofw_arg.arg3 = buf; + + ofw(&ofw_arg); + return ofw_arg.ret; +} + +int setprop(phandle node, char* name, uint8_t* buf, int len) +{ + struct + { + char* service; + int n_args; + int n_rets; + phandle arg1; + char* arg2; + uint8_t* arg3; + int arg4; + int ret; + } ofw_arg; + + char _service[8] = "setprop"; + ofw_arg.service = _service; + + ofw_arg.n_args = 4; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = node; + ofw_arg.arg2 = name; + ofw_arg.arg3 = buf; + ofw_arg.arg4 = len; + + ofw(&ofw_arg); + return ofw_arg.ret; +} + +int canon(char* device, uint8_t* buf, int buflen) +{ + struct + { + char* service; + int n_args; + int n_rets; + char* arg1; + uint8_t* arg2; + int arg3; + int ret; + } ofw_arg; + + char _service[6] = "canon"; + ofw_arg.service = _service; + + ofw_arg.n_args = 3; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = device; + ofw_arg.arg2 = buf; + ofw_arg.arg3 = buflen; + + ofw(&ofw_arg); + return ofw_arg.ret; +} + +phandle finddevice(char* device) +{ + struct + { + char* service; + int n_args; + int n_rets; + char* arg1; + int ret; + } ofw_arg; + + char _service[11] = "finddevice"; + ofw_arg.service = _service; + + ofw_arg.n_args = 1; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = device; + + ofw(&ofw_arg); + return ofw_arg.ret; +} + +int instance_to_path(ihandle instance, uint8_t* buf, int buflen) +{ + struct + { + char* service; + int n_args; + int n_rets; + ihandle arg1; + uint8_t* arg2; + int arg3; + int ret; + } ofw_arg; + + char _service[17] = "instance-to-path"; + ofw_arg.service = _service; + + ofw_arg.n_args = 3; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = instance; + ofw_arg.arg2 = buf; + ofw_arg.arg3 = buflen; + + ofw(&ofw_arg); + return ofw_arg.ret; + +} + +int package_to_path(phandle package, uint8_t* buf, int buflen) +{ + struct + { + char* service; + int n_args; + int n_rets; + ihandle arg1; + uint8_t* arg2; + int arg3; + int ret; + } ofw_arg; + + char _service[16] = "package-to-path"; + ofw_arg.service = _service; + + ofw_arg.n_args = 3; + ofw_arg.n_rets = 1; + ofw_arg.arg1 = package; + ofw_arg.arg2 = buf; + ofw_arg.arg3 = buflen; + + ofw(&ofw_arg); + return ofw_arg.ret; + +} + +void* call_method(char* method, ihandle instance, ...) +{ +} diff --git a/entry/boot.h b/include/ofw.h similarity index 57% rename from entry/boot.h rename to include/ofw.h index d5345a5..6102f12 100644 --- a/entry/boot.h +++ b/include/ofw.h @@ -1,5 +1,3 @@ -void (*ofw)(); -void __eabi(); - +#include typedef int phandle; typedef int ihandle;