My phase 2, GSoC objectives includes Backporting the current(rev: d6756a3ac8 ) MMCCAM framework to FreeBSD head 642b174dadd and then importing it to RTEMS. This post mainly concerns with intricacies and workarounds during the backporting process.
Backporting is a process that enables old kernels run a latest driver. MMCCAM framework is one such enhancement in the past few months that enables FreeBSD to talk to devices behind the SDIO bus. It’s a major architectural change, that enables further driver development for devices on SDIO bus.
So, first step during backporting is to finalize the revisions from which driver will be imported(d6756a3ac8 in my case) and to the one it will be applied(642b174dadd). It’s really important to select these versions wisely, only after substantial testing to ensure bug free working of the driver.
Next step is to make a list of commits that we are concerned with i.e those which are used to introduce driver into the kernel. In my case, github’s web interface was used to view all the commits like: https://github.com/freebsd/freebsd/commits/master/sys/cam .
Now, among these , commits are selected based on the following criteria:
- Either it’s a small bug fix in CAM framework or the one that has no functional changes like: changes in comments/license etc.
- These commits should only affect the CAM core files or applies directly to MMCCAM/SDIO stack. Major changes in CAM core files aren’t appreciated as they require updating CAM’s dependencies too, along with other CAM based frameworks like NVME,ATA etc. However, there were situations when updating dependencies becomes a necessity. For that, we have to first find all the dependencies on which CAM depends on and the ones which are dependent on CAM.
Finding dependencies
#include dependencies can be found by following methods:
- Use GCC/clang’s -M and -MM option. -M option will output the dependency list and -MM option will output the dependency list, after excluding system headers. Here’s the documentation:
- Another method is to use cscope, see here: http://cscope.sourceforge.net/cscope_vim_tutorial.html
- Other 3rd party options are: https://include-what-you-use.org/ , https://github.com/NavicoOS/dep-matrix
View https://stackoverflow.com/questions/42308/tool-to-track-include-dependencies for other option. I used clangs -MM option to find all CAM dependencies. Dependencies, in my case mainly includes user space tools like camcontrol etc and CAM based frameworks(ATA,NVME,SCSI). Look at my patch used to import MMCCAM stack here, changes in sys/cam/ata/* , sys/cam/nvme/* , sys/cam/scsi/*, sys/dev/aic7xxx/* , sys/dev/drm/*, usr.bin/sdiotool/* are all minor changes in dependencies.
Now, we have the commits we want to apply. We can now apply them one by one and build kernel (With -MM option, if you are using that) to see any error/unmet dependency. I used git cherry-pick (here) to selectively apply commits.
Few workarounds:
While backporting MMCCAM stack, there were few workarounds which have to be taken care of when upgrading rtems-libbsd:
-
- See commit e437fbd6d8c09cab8d2dcdcddd75834370e08e02 which is an CAM core API change and further require changes in all it’s dependencies, so i havn’t applied it. In short. due to this commit cam_periph_acquire returns 0(earlier it was returning CAM_REQ_CMP) on successful device acquire. Since this was skipped, new code added into MMCCAM stack needs some changes like look at line 423 of: https://github.com/freebsd/freebsd/commit/acc25b4abd2f47032d0235deb0259097f48c30e9#diff-23780dec68cbcc506469c42e8c73f93eR423 here cam_periph_acquire(periph) != 0 has to be replaced with cam_periph_acquire(periph) != CAM_REQ_CMP . Similarly other occurrences of this function has to be changes.
- All changes in user space tools like camcontrol are not applied, mainly the ones which further require change in other modules, so it might not work properly. However, ‘camcontrol devlist’ is working correctly to scan and list cards. This is a bit irrelevant for the end purpose of porting it to RTEMS. similarly other userspace tools like sdiotool,mmcnull controller may not work as expected.
Building the kernel with backported MMCCAM stack
To build kernel with backported MMCCAM stack:
- Grab the Freebsd-current repository and checkout to tree 642b174dadd
- Grab the patch(here) and apply it to the repository.
- Build the kernel with GENERIC-MMCCAM config file
- Test the image and it will probably stop abruptly at mountroot> prompt, enter ufs:ufs/eMMCroota
- This will scan eMMC partitions and will then export each partition as a separate disk. These can be viewed by entering ? in mountprompt.
Actually, with latest changes in SDIO stack, naming is a bit altered. Now the partitions are named as eMMCroot, sdda0s2a etc while by default it should be mmcsd0s2a. It was just a small tweak in fstab which solved this issue. But my fstab solution isn’t universally true, it will vary with the development board too. So, it’s always better to scan for available partitions by typing ‘?’ in mountprompt and then enter the root partition to boot from.
- Here’s the log:
ARM Debug Architecture not supported KDB: debugger backends: ddb KDB: current backend: ddb Copyright (c) 1992-2017 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 12.0-CURRENT #0 642b174dadd(HEAD)-dirty: Mon Jul 2 09:53:42 IST 2018 udit2@root:/BBB_old/obj/arm.armv6/BBB/sys/GENERIC-MMCCAM arm FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on LLVM 4.0.) WARNING: WITNESS option enabled, expect reduced performance. VT: init without driver. CPU: ARM Cortex-A8 r3p2 (ECO: 0x00000000) CPU Features: Thumb2, Security, VMSAv7 Optional instructions: UMULL, SMULL, SIMD(ext) LoUU:2 LoC:3 LoUIS:1 Cache level 1: 32KB/64B 4-way data cache WT WB Read-Alloc 32KB/64B 4-way instruction cache Read-Alloc Cache level 2: 256KB/64B 8-way unified cache WT WB Read-Alloc Write-Alloc real memory = 536870912 (512 MB) avail memory = 507879424 (484 MB) Texas Instruments AM335x Processor, Revision ES2.1 random: entropy device external interface kbd0 at kbdmux0 ofwbus0: <Open Firmware Device Tree> simplebus0: <Flattened device tree simple bus> on ofwbus0 simplebus1: <Flattened device tree simple bus> on simplebus0 simplebus2: <Flattened device tree simple bus> mem 0x210000-0x211fff on simpleb1 ti_scm0: <TI Control Module> mem 0-0x7ff on simplebus2 regfix0: <Fixed Regulator> on ofwbus0 clk_fixed0: <Fixed clock> on ofwbus0 ti_aintc0: <TI AINTC Interrupt Controller> mem 0x48200000-0x48200fff on simpleb0 ti_aintc0: Revision 5.0 cpulist0: <Open Firmware CPU Group> on ofwbus0 cpu0: <Open Firmware CPU> on cpulist0 pmu0: <Performance Monitoring Unit> irq 0 on ofwbus0 am335x_prcm0: <AM335x Power and Clock Management> mem 0x200000-0x203fff on simp1 am335x_prcm0: Clocks: System 24.0 MHz, CPU 1000 MHz ti_pinmux0: <TI Pinmux Module> mem 0x800-0xa37 on simplebus2 am335x_scm0: <AM335x Control Module Extension> on ti_scm0 gpio0: <TI AM335x General Purpose I/O (GPIO)> mem 0x44e07000-0x44e07fff irq 7 o0 gpiobus0: <OFW GPIO bus> on gpio0 gpioc0: <GPIO controller> on gpio0 gpio1: <TI AM335x General Purpose I/O (GPIO)> mem 0x4804c000-0x4804cfff irq 8 o0 gpiobus1: <OFW GPIO bus> on gpio1 gpioc1: <GPIO controller> on gpio1 gpio2: <TI AM335x General Purpose I/O (GPIO)> mem 0x481ac000-0x481acfff irq 9 o0 gpiobus2: <OFW GPIO bus> on gpio2 gpioc2: <GPIO controller> on gpio2 gpio3: <TI AM335x General Purpose I/O (GPIO)> mem 0x481ae000-0x481aefff irq 10 0 gpiobus3: <OFW GPIO bus> on gpio3 gpioc3: <GPIO controller> on gpio3 ��uart0: <TI UART (16550 compatible)> mem 0x44e09000-0x44e0afff irq 11 on simpl0 uart0: console (115384,n,8,1) iichb0: <TI I2C Controller> mem 0x44e0b000-0x44e0bfff irq 17 on simplebus0 iichb0: I2C revision 4.0 FIFO size: 32 bytes iicbus0: <OFW I2C bus> on iichb0 iic0: <I2C generic I/O> on iicbus0 am335x_pmic0: <TI TPS65217 Power Management IC> at addr 0x48 irq 54 on iicbus0 iicbus0: <unknown card> at addr 0xa0 tda0 at addr 0xe0 on iicbus0 iichb1: <TI I2C Controller> mem 0x4819c000-0x4819cfff irq 19 on simplebus0 iichb1: I2C revision 4.0 FIFO size: 32 bytes iicbus1: <OFW I2C bus> on iichb1 iic1: <I2C generic I/O> on iicbus1 iicbus1: <unknown card> at addr 0xa8 iicbus1: <unknown card> at addr 0xaa iicbus1: <unknown card> at addr 0xac iicbus1: <unknown card> at addr 0xae sdhci_ti0: <TI MMCHS (SDHCI 2.0)> mem 0x48060000-0x48060fff irq 20 on simplebus0 sdhci_ti0: Custom-disabling 8-bit bus sdhci_ti1: <TI MMCHS (SDHCI 2.0)> mem 0x481d8000-0x481d8fff irq 21 on simplebus0 sdhci_ti1: Custom-disabling 8-bit bus mmc_alloc_device() ti_wdt0: <TI Watchdog Timer> mem 0x44e35000-0x44e35fff irq 23 on simplebus0 ti_mbox0: <TI System Mailbox> mem 0x480c8000-0x480c81ff irq 26 on simplebus0 ti_mbox0: revision 4.0 am335x_dmtimer0: <AM335x DMTimer2> mem 0x48040000-0x480403ff irq 28 on simplebu0 Event timer "DMTimer2" frequency 24000000 Hz quality 500 am335x_dmtimer1: <AM335x DMTimer3> mem 0x48042000-0x480423ff irq 29 on simplebu0 Timecounter "DMTimer3" frequency 24000000 Hz quality 500 am335x_rtc0: <AM335x RTC (power management mode)> mem 0x44e3e000-0x44e3efff irq0 am335x_rtc0: AM335X RTC v1.0.6 usbss0: <TI AM33xx integrated USB OTG controller> mem 0x47400000-0x47400fff on 0 usbss0: TI AM335X USBSS v0.0.13 musbotg0: <TI AM33xx integrated USB OTG controller> mem 0x47401400-0x474017ff,00 usbus0: Dynamic FIFO sizing detected, assuming 16Kbytes of FIFO RAM usbus0 on musbotg0 musbotg1: <TI AM33xx integrated USB OTG controller> mem 0x47401c00-0x47401fff,00 usbus1: Dynamic FIFO sizing detected, assuming 16Kbytes of FIFO RAM usbus1 on musbotg1 cpswss0: <3-port Switch Ethernet Subsystem> mem 0x4a100000-0x4a1007ff,0x4a101200 cpswss0: CPSW SS Version 1.12 (0) cpswss0: Initial queue size TX=128 RX=384 cpsw0: <Ethernet Switch Port> on cpswss0 miibus0: <MII bus> on cpsw0 smscphy0: <SMC LAN8710A 10/100 interface> PHY 0 on miibus0 smscphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto cpsw0: Ethernet address: 68:9e:19:6f:38:cd fb0: <AM335x LCD controller> mem 0x4830e000-0x4830efff irq 43 on simplebus0 ti_adc0: <TI ADC controller> mem 0x44e0d000-0x44e0dfff irq 44 disabled on simpl0 ti_adc0: scheme: 0x1 func: 0x730 rtl: 0 rev: 0.1 custom rev: 0 gpioled0: <GPIO LEDs> on ofwbus0 cryptosoft0: <software crypto> Timecounters tick every 1.000 msec mmc_dev_async(async_code=0x20, path_id=0, target_id=ffffffff, lun_id=ffffffff mmc_dev_async(async_code=0x20, path_id=1, target_id=0, lun_id=0 Got AC_PATH_REGISTERED -- whatever... mmc_dev_async(async_code=0x20, path_id=1, target_id=ffffffff, lun_id=ffffffff usbus0: 480Mbps High Speed USB v2.0 usbus1: 480Mbps High Speed USB v2.0 (noperiph:sdhci_slot0:0:-1:ffffffff): XPT_SCAN_{BUS,TGT,LUN} (noperiph:sdhci_slot1:0:-1:ffffffff): XPT_SCAN_{BUS,TGT,LUN} (noperiph:sdhci_slot1:0:0:0): XPT_SCAN_{BUS,TGT,LUN} (noperiph:sdhci_slot1:0:0:0): Set up the mmcprobe device... (mmcprobe0:sdhci_slot1:0:0:0): Periph created (mmcprobe0:sdhci_slot1:0:0:0): Probe started (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_INVALID to PROBE_RESET (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_RESET sdhci_ti1-slot0: Clock => 0 sdhci_ti1-slot0: VDD => 18 sdhci_ti1-slot0: CS => 0 sdhci_ti1-slot0: Bus width => 0 sdhci_ti1-slot0: Power mode => 1 sdhci_ti1-slot0: Bus mode => 1 sdhci_ti1-slot0: sdhci_cam_update_ios: power_mode=1, clk=0, bus_width=0, timing0 sdhci_ti1: Custom-disabling 8-bit bus am335x_pmic0: TPS65217C ver 1.2 powered by USB tda0: TDA19988 sdhci_ti1-slot0: Clock => 375000 sdhci_ti1-slot0: Power mode => 2 sdhci_ti1-slot0: Timing => 0 sdhci_ti1-slot0: sdhci_cam_update_ios: power_mode=2, clk=375000, bus_width=0, t0 sdhci_ti1: Custom-disabling 8-bit bus tda0: failed to read EDID sdhci_ti1-slot0: CS => 1 sdhci_ti1-slot0: sdhci_cam_update_ios: power_mode=2, clk=375000, bus_width=0, t0 uhub0: 1 port with 1 removable, self powered sdhci_ti1: uhub1: 1 port with 1 removable, self powered Custom-disabling 8-bit bus (mmcprobe0:sdhci_slot1:0:0:0): Send first XPT_MMC_IO (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done Starting completion of PROBE_RESET (mmcprobe0:sdhci_slot1:0:0:0): done with PROBE_RESET (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_RESET to PROBE_SEND_IF_COND (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_SEND_IF_COND mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): IF_COND: error 1, pattern 00000000 (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_SEND_IF_COND to PROBE_SDIO_RESET (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_SDIO_RESET mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): SDIO_RESET: error 1, CCCR CTL register: 00000000 (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_SDIO_RESET to PROBE_SDIO_INIT (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_SDIO_INIT mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): SDIO_INIT: error 1, 00000000 00000000 00000000 00 (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_SDIO_INIT to PROBE_SEND_APP_OP_COND (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): APP_OP_COND: error 1, resp 00000000 (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_SEND_APP_OP_COND to PROBE_MMC_INIT (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_MMC_INIT mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done ugen0.2: <FreeBSD foundation USB Memory Stick> at usbus0 (mmcprobe0:sdhci_slot1:0:0:0): MMC card, OCR 00ff8080 (mmcprobe0:sdhci_slot1:0:0:0): -> sending OCR to card (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_MMC_INIT mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): MMC card, OCR 00ff8080 (mmcprobe0:sdhci_slot1:0:0:0): Card is still powering up (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_MMC_INIT mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): MMC card, OCR c0ff8080 (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_MMC_INIT to PROBE_GET_CID (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): CID fe014e4d4d43303447428900535f6129 (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_GET_CID to PROBE_MMC_SET_RELATIVE_ADR (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): ugen0.2: <FreeBSD foundation USB Memory Stick> a) ugen0.2: <FreeBSD foundation USB Memory Stick> at usbus0 Probe PROBE_MMC_SET_RELATIVE_ADDR to PROBE_GET_CSD (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): CSD d04f01320f5913ffffffffe78a40008f (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_GET_CSD to PROBE_SELECT_CARD (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start mmc_probedone: remaining freezecnt 1 (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_done (mmcprobe0:sdhci_slot1:0:0:0): Probe PROBE_SELECT_CARD to PROBE_DONE (mmcprobe0:sdhci_slot1:0:0:0): mmcprobe_start (mmcprobe0:sdhci_slot1:0:0:0): Start with PROBE_DONE sdhci_ti1-slot0: Bus mode => 2 sdhci_ti1-slot0: sdhci_cam_update_ios: power_mode=2, clk=375000, bus_width=0, t0 sdhci_ti1: Custom-disabling 8-bit bus mmc_probedone: remaining freezecnt 0 (mmcprobe0:sdhci_slot1:0:0:0): Periph invalidated (mmcprobe0:sdhci_slot1:0:0:0): Periph destroyed (noperiph:sdhci_slot1:0:0:0): xpt_async(AC_FOUND_DEVICE) mmc_dev_async(async_code=0x80, path_id=1, target_id=0, lun_id=0 Got AC_FOUND_DEVICE -- whatever... (pass0:sdhci_slot1:0:0:0): Periph created (sdda0:sdhci_slot1:0:0:0): Periph created WARNING: WITNESS option enabled, expect reduced performance. Loader variables: Manual root filesystem specification: <fstype>:<device> [options] Mount <device> using filesystem <fstype> and with the specified (optional) option list. eg. ufs:/dev/da0s1a zfs:tank cd9660:/dev/cd0 ro (which is equivalent to: mount -t cd9660 -o ro /dev/cd0 /) ? List valid disk boot devices . Yield 1 second (for background tasks) <empty line> Abort manual input mountroot> ufs:ufs/eMMCroota Trying to mount root from ufs:ufs/eMMCroota []... mountroot: waiting for device ufs/eMMCroota... (sdda0:sdhci_slot1:0:0:0): Capacity: 3925868544, sectors: 7667712 (sdda0:sdhci_slot1:0:0:0): Set SD freq to 52 MHz (min out of host f=96 MHz and ) sdhci_ti1-slot0: Timing => 1 sdhci_ti1-slot0: sdhci_cam_update_ios: power_mode=2, clk=375000, bus_width=0, t1 sdhci_ti1: Custom-disabling 8-bit bus sdhci_ti1-slot0: Clock => 48000000 sdhci_ti1-slot0: sdhci_cam_update_ios: power_mode=2, clk=48000000, bus_width=0,1 sdhci_ti1: Custom-disabling 8-bit bus (sdda0:sdhci_slot1:0:0:0): Set bus width to 8-bit (min of host 8-bit and card 8) sdhci_ti1-slot0: Bus width => 3 sdhci_ti1-slot0: sdhci_cam_update_ios: power_mode=2, clk=48000000, bus_width=3,1 sdhci_ti1: Custom-enabling 8-bit bus (sdda0:sdhci_slot1:0:0:0): Partition type 'default', size 3925868544 uma_zalloc_arg: zone "128" with the following non-sleepable locks held: exclusive sleep mutex CAM device lock (CAM device lock) r = 0 (0xc2df6c64) lock3 stack backtrace: (sdda0:sdhci_slot1:0:0:0): Partition type 'boot0', size 1048576 uma_zalloc_arg: zone "128" with the following non-sleepable locks held: exclusive sleep mutex CAM device lock (CAM device lock) r = 0 (0xc2df6c64) lock7 stack backtrace: (sdda0:sdhci_slot1:0:0:0): Partition type 'boot1', size 1048576 uma_zalloc_arg: zone "128" with the following non-sleepable locks held: exclusive sleep mutex CAM device lock (CAM device lock) r = 0 (0xc2df6c64) lock7 stack backtrace: (sdda0:sdhci_slot1:0:0:0): Partition type 'RPMB', size 131072 uma_zalloc_arg: zone "128" with the following non-sleepable locks held: exclusive sleep mutex CAM device lock (CAM device lock) r = 0 (0xc2df6c64) lock7 stack backtrace: (sdda0:sdhci_slot1:0:0:0): Don't know what to do with RPMB partitions yet sdda0 at sdhci_slot1 bus 0 scbus1 target 0 lun 0 sdda0: Relative addr: 00000002 Card features: <MMC Memory High-Capacity > Card memory OCR: 00ff8080 sdda0: Serial Number 8900535 (sdda0:sdhci_slot1:0:0:0): mmc_announce_periph: called XPT info: CLK 2DC6C00, ... sdda0: MMCHC MMC04G 4.2 SN 8900535F MFG 06/1998 by 254 0x004e (sdda0:sdhci_slot1:0:0:0): Partition 0 -> 1 (sdda0:sdhci_slot1:0:0:0): Partition 1 -> 2 (sdda0:sdhci_slot1:0:0:0): Partition 2 -> 0 WARNING: /: TRIM flag on fs but disk does not support TRIM warning: no time-of-day clock registered, system time will not be set accurately Setting hostuuid: 102abfaa-5d2a-11e8-b2af-689e196f38cd. Setting hostid: 0xa7ba3792. eval: cannot open /etc/fstab: No such file or directory No suitable dump device was found. eval: cannot open /etc/fstab: No such file or directory fstab: /etc/fstab:0: No such file or directory Warning! No /etc/fstab: skipping disk checks. fstab: /etc/fstab:0: No such file or directory mount: ufs/eMMCroota: No such file or directory Mounting root filesystem rw failed, startup aborted ERROR: ABORTING BOOT (sending SIGTERM to parent)! 2018-07-02T04:37:56.896833+00:00 init 1 - - /bin/sh on /etc/rc terminated abnoe Enter full pathname of shell or RETURN for /bin/sh: # cd /dev # ls