From a161e6f3ef31004e47a5b94b85c2e84b764f8637 Mon Sep 17 00:00:00 2001 From: Yan <892930505@qq.com> Date: Fri, 30 Oct 2020 05:27:39 +0800 Subject: Disable device tree filter when load a dts from file (#217) * add device tree in elf, using --with-dts to add the absolute path of device tree * Disable device tree filter --- Makefile.in | 4 ++++ bbl/bbl.c | 2 ++ bbl/bbl.lds | 1 + configure | 26 +++++++++++++++++++++++++- machine/machine.ac | 4 ++++ machine/machine.mk.in | 5 +++++ machine/mentry.S | 13 +++++++++++++ 7 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 5c2687d..3e3872b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -116,6 +116,10 @@ ifneq (@BBL_PAYLOAD@,no) CFLAGS := $(CFLAGS) -DBBL_PAYLOAD=\"bbl_payload\" endif BBL_PAYLOAD := @BBL_PAYLOAD@ +ifneq (@MACHINE_DTS@,no) +CFLAGS := $(CFLAGS) -DMACHINE_DTS=\"machine_dts\" +endif +MACHINE_DTS := @MACHINE_DTS@ COMPILE := $(CC) -MMD -MP $(CFLAGS) \ $(sprojs_include) # Linker diff --git a/bbl/bbl.c b/bbl/bbl.c index 3b92fc1..8e29801 100644 --- a/bbl/bbl.c +++ b/bbl/bbl.c @@ -41,11 +41,13 @@ static void filter_dtb(uintptr_t source) uint32_t size = fdt_size(source); memcpy((void*)dest, (void*)source, size); +#ifndef MACHINE_DTS // Remove information from the chained FDT filter_harts(dest, &disabled_hart_mask); filter_plic(dest); filter_compat(dest, "riscv,clint0"); filter_compat(dest, "riscv,debug-013"); +#endif } static void protect_memory(void) diff --git a/bbl/bbl.lds b/bbl/bbl.lds index 624f691..9d51f1d 100644 --- a/bbl/bbl.lds +++ b/bbl/bbl.lds @@ -67,6 +67,7 @@ SECTIONS *(.srodata*) *(.gnu.linkonce.d.*) *(.comment) + *(.dtb) } /* End of initialized data segment */ diff --git a/configure b/configure index 9d2c146..c51e865 100755 --- a/configure +++ b/configure @@ -590,6 +590,7 @@ ac_subst_vars='LTLIBOBJS LIBOBJS subprojects_enabled subprojects +MACHINE_DTS BBL_LOGO_FILE BBL_PAYLOAD BBL_ENABLE_LOGO @@ -648,6 +649,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -683,6 +685,7 @@ with_payload with_logo enable_boot_machine enable_fp_emulation +with_dts ' ac_precious_vars='build_alias host_alias @@ -737,6 +740,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -989,6 +993,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1126,7 +1139,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1279,6 +1292,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1331,6 +1345,7 @@ Optional Packages: --with-mem-start Set physical memory start address --with-payload Set ELF payload for bbl --with-logo Specify a better logo + --with-dts Support a machine dts Some influential environment variables: CC C compiler command @@ -4469,6 +4484,15 @@ $as_echo "#define PK_ENABLE_FP_EMULATION /**/" >>confdefs.h fi +# Check whether --with-dts was given. +if test "${with_dts+set}" = set; then : + withval=$with_dts; MACHINE_DTS=$with_dts + + +fi + + + diff --git a/machine/machine.ac b/machine/machine.ac index a787113..e3033b2 100644 --- a/machine/machine.ac +++ b/machine/machine.ac @@ -4,3 +4,7 @@ AC_ARG_ENABLE([fp-emulation], AS_HELP_STRING([--disable-fp-emulation], [Disable AS_IF([test "x$enable_fp_emulation" != "xno"], [ AC_DEFINE([PK_ENABLE_FP_EMULATION],,[Define if floating-point emulation is enabled]) ]) + +AC_ARG_WITH([dts], AS_HELP_STRING([--with-dts], [Support a machine dts]), + [AC_SUBST([MACHINE_DTS], $with_dts, [machine dts])] +) diff --git a/machine/machine.mk.in b/machine/machine.mk.in index dcecb7a..c7075fb 100644 --- a/machine/machine.mk.in +++ b/machine/machine.mk.in @@ -37,3 +37,8 @@ machine_c_srcs = \ machine_asm_srcs = \ mentry.S \ fp_asm.S \ + +mentry.o: machine.dtb + +machine.dtb: $(MACHINE_DTS) + dtc -O dtb $^ -o $@ \ No newline at end of file diff --git a/machine/mentry.S b/machine/mentry.S index 9ec9916..e619812 100644 --- a/machine/mentry.S +++ b/machine/mentry.S @@ -281,6 +281,10 @@ do_reset: #endif # Boot on the first hart +#ifdef MACHINE_DTS + csrr a0, mhartid + la a1, dtb_start +#endif j init_first_hart .LmultiHartInit: @@ -313,6 +317,15 @@ do_reset: wfi j .LmultiHart +#ifdef MACHINE_DTS +.section .dtb +.align 3 +.global dtb_start, dtb_end +dtb_start: +.incbin "machine.dtb" +dtb_end: +#endif + .bss .align RISCV_PGSHIFT stacks: -- cgit v1.1