Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 24 additions & 7 deletions proxyclient/tools/linux.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,20 @@
parser.add_argument('-b', '--bootargs', type=str, metavar='"boot arguments"')
parser.add_argument('-t', '--tty', type=str)
parser.add_argument('-u', '--u-boot', type=pathlib.Path, help="load u-boot before linux")
parser.add_argument('-E', '--efi', action="store_true", help="payload is EFI stub (requires u-boot)")
parser.add_argument('-T', '--tso', action="store_true", help="enable TSO")
args = parser.parse_args()

from m1n1.setup import *

if args.efi and args.u_boot is None:
raise Exception("Booting EFI stubs requires u-boot.")

if args.compression == 'auto':
suffix = args.payload.suffix
if suffix == '.gz':
if args.efi:
args.compression = 'none'
elif suffix == '.gz':
args.compression = 'gz'
elif suffix == '.xz':
args.compression = 'xz'
Expand Down Expand Up @@ -81,20 +87,31 @@
uboot_addr = u.memalign(2*1024*1024, len(uboot))
print("Loading u-boot to 0x%x..." % uboot_addr)

bootenv_start = uboot.find(b"bootcmd=run distro_bootcmd")
bootenv_start = uboot.find(b"bootcmd=bootflow scan -b")
bootenv_len = uboot[bootenv_start:].find(b"\x00\x00")
bootenv_old = uboot[bootenv_start:bootenv_start+bootenv_len]
bootenv = str(bootenv_old, "ascii").split("\x00")
bootenv = list(filter(lambda x: not (x.startswith("baudrate") or x.startswith("boot_") or x.startswith("distro_bootcmd")), bootenv))

if initramfs is not None:
bootcmd = "distro_bootcmd=booti 0x%x 0x%x:0x%x $fdtcontroladdr" % (kernel_base, initramfs_base, initramfs_size)
bootenv = list(filter(lambda x: not (
x.startswith("baudrate") or
x.startswith("boot_") or
x.startswith("bootdelay=") or
x.startswith("preboot=") or
x.startswith("bootcmd")
), bootenv))

if args.efi and initramfs is not None:
bootcmd = "bootcmd=bootefi 0x%x:0x%x 0x%x:0x%x $fdtcontroladdr" % (kernel_base, kernel_size, initramfs_base, initramfs_size)
elif initramfs is not None:
bootcmd = "bootcmd=booti 0x%x 0x%x:0x%x $fdtcontroladdr" % (kernel_base, initramfs_base, initramfs_size)
elif args.efi:
bootcmd = "bootcmd=bootefi 0x%x:0x%x $fdtcontroladdr" % (kernel_base, kernel_size)
else:
bootcmd = "distro_bootcmd=booti 0x%x - $fdtcontroladdr" % (kernel_base)
bootcmd = "bootcmd=booti 0x%x - $fdtcontroladdr" % (kernel_base)

if tty_dev is not None:
bootenv.append("baudrate=%d" % tty_dev.baudrate)
bootenv.append(bootcmd)
bootenv.append("bootdelay=0")
if args.bootargs is not None:
bootenv.append("bootargs=" + args.bootargs)

Expand Down