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