mirror of
https://github.com/ps5-linux/ps5-linux-loader.git
synced 2026-05-12 01:31:59 +00:00
Merge branch 'main' into dev-wifi-fw
This commit is contained in:
2
Makefile
2
Makefile
@@ -24,6 +24,8 @@ $(SC_HV_H):
|
||||
$(SC_K_H):
|
||||
$(MAKE) -C shellcode_kernel
|
||||
|
||||
source/firmware.o: scripts/ubuntu/initramfs-tools scripts/ubuntu/ps5-wifi-fw
|
||||
|
||||
$(OBJS): %.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
|
||||
19
include/cpio.h
Normal file
19
include/cpio.h
Normal file
@@ -0,0 +1,19 @@
|
||||
#ifndef CPIO_H
|
||||
#define CPIO_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define CPIO_MODE_DIR 0040755
|
||||
#define CPIO_MODE_FILE 0100644
|
||||
|
||||
size_t cpio_newc_entry_size(const char *name, size_t data_size);
|
||||
size_t cpio_newc_parent_dirs_size(const char *path);
|
||||
uint8_t *cpio_newc_data(uint8_t *entry, const char *name);
|
||||
uint8_t *cpio_newc_write_entry(uint8_t *out, const char *name, uint32_t mode,
|
||||
const void *data, size_t data_size,
|
||||
uint32_t ino);
|
||||
uint8_t *cpio_newc_write_parent_dirs(uint8_t *out, const char *path,
|
||||
uint32_t *ino);
|
||||
|
||||
#endif
|
||||
@@ -1,6 +1,12 @@
|
||||
#ifndef FIRMWARE_H
|
||||
#define FIRMWARE_H
|
||||
|
||||
<<<<<<< dev-wifi-fw
|
||||
int dump_device_firmwares(const char *boot_file_path);
|
||||
=======
|
||||
#include <stddef.h>
|
||||
|
||||
int resolve_device_firmwares(void **initrd, size_t *initrd_size);
|
||||
>>>>>>> main
|
||||
|
||||
#endif
|
||||
|
||||
14
scripts/ubuntu/initramfs-tools
Normal file
14
scripts/ubuntu/initramfs-tools
Normal file
@@ -0,0 +1,14 @@
|
||||
if [ "${PS5_FW_INSTALL_DONE:-}" != y ] &&
|
||||
[ -f /scripts/functions ] &&
|
||||
[ -d /scripts/local-bottom ] &&
|
||||
[ -n "$rootmnt" ] &&
|
||||
[ -e "${rootmnt}/etc/os-release" ]; then
|
||||
ID=
|
||||
ID_LIKE=
|
||||
. "${rootmnt}/etc/os-release"
|
||||
case " ${ID} ${ID_LIKE} " in
|
||||
*" ubuntu "*)
|
||||
[ -e /scripts/ubuntu/ps5-wifi-fw ] && . /scripts/ubuntu/ps5-wifi-fw
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
13
scripts/ubuntu/ps5-wifi-fw
Normal file
13
scripts/ubuntu/ps5-wifi-fw
Normal file
@@ -0,0 +1,13 @@
|
||||
if [ "${PS5_FW_INSTALL_DONE:-}" != y ]; then
|
||||
FW_PATH="usr/lib/firmware/nxp/pcieuartiw620_combo_v1.bin"
|
||||
FW_SRC="/${FW_PATH}"
|
||||
FW_DST="${rootmnt}/${FW_PATH}"
|
||||
if [ -n "$rootmnt" ] && [ -f "$FW_SRC" ]; then
|
||||
mkdir -p "${FW_DST%/*}"
|
||||
cp "$FW_SRC" "$FW_DST"
|
||||
chmod 0644 "$FW_DST"
|
||||
PS5_FW_INSTALL_DONE=y
|
||||
export PS5_FW_INSTALL_DONE
|
||||
[ -e /dev/kmsg ] && printf 'ps5-fw-install: installed %s\n' "$FW_DST" > /dev/kmsg || true
|
||||
fi
|
||||
fi
|
||||
74
source/cpio.c
Normal file
74
source/cpio.c
Normal file
@@ -0,0 +1,74 @@
|
||||
#include "cpio.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define CPIO_NEWC_HEADER_LEN 110
|
||||
|
||||
static size_t cpio_newc_align4(size_t n) { return (n + 3) & ~3ULL; }
|
||||
|
||||
size_t cpio_newc_entry_size(const char *name, size_t data_size) {
|
||||
return cpio_newc_align4(CPIO_NEWC_HEADER_LEN + strlen(name) + 1) +
|
||||
cpio_newc_align4(data_size);
|
||||
}
|
||||
|
||||
uint8_t *cpio_newc_data(uint8_t *entry, const char *name) {
|
||||
return (uint8_t *)cpio_newc_align4((uintptr_t)entry + CPIO_NEWC_HEADER_LEN +
|
||||
strlen(name) + 1);
|
||||
}
|
||||
|
||||
uint8_t *cpio_newc_write_entry(uint8_t *out, const char *name, uint32_t mode,
|
||||
const void *data, size_t data_size,
|
||||
uint32_t ino) {
|
||||
size_t name_size = strlen(name) + 1;
|
||||
|
||||
out = (uint8_t *)cpio_newc_align4((uintptr_t)out);
|
||||
|
||||
sprintf((char *)out,
|
||||
"070701%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X",
|
||||
ino, mode, 0, 0, 1, 0, (uint32_t)data_size, 0, 0, 0, 0,
|
||||
(uint32_t)name_size, 0);
|
||||
out += CPIO_NEWC_HEADER_LEN;
|
||||
|
||||
memcpy(out, name, name_size);
|
||||
out += name_size;
|
||||
out = (uint8_t *)cpio_newc_align4((uintptr_t)out);
|
||||
|
||||
if (data_size != 0 && data != out) {
|
||||
memcpy(out, data, data_size);
|
||||
}
|
||||
out += data_size;
|
||||
out = (uint8_t *)cpio_newc_align4((uintptr_t)out);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
size_t cpio_newc_parent_dirs_size(const char *path) {
|
||||
char tmp[256];
|
||||
size_t total = 0;
|
||||
|
||||
snprintf(tmp, sizeof(tmp), "%s", path);
|
||||
for (char *p = strchr(tmp, '/'); p != NULL; p = strchr(p + 1, '/')) {
|
||||
*p = '\0';
|
||||
if (tmp[0] != '\0')
|
||||
total += cpio_newc_entry_size(tmp, 0);
|
||||
*p = '/';
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
uint8_t *cpio_newc_write_parent_dirs(uint8_t *out, const char *path,
|
||||
uint32_t *ino) {
|
||||
char tmp[256];
|
||||
|
||||
snprintf(tmp, sizeof(tmp), "%s", path);
|
||||
for (char *p = strchr(tmp, '/'); p != NULL; p = strchr(p + 1, '/')) {
|
||||
*p = '\0';
|
||||
if (tmp[0] != '\0') {
|
||||
out = cpio_newc_write_entry(out, tmp, CPIO_MODE_DIR, NULL, 0, (*ino)++);
|
||||
}
|
||||
*p = '/';
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
Reference in New Issue
Block a user