summaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/files/rtkload/read_fd.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/realtek/files/rtkload/read_fd.c')
-rw-r--r--target/linux/realtek/files/rtkload/read_fd.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/target/linux/realtek/files/rtkload/read_fd.c b/target/linux/realtek/files/rtkload/read_fd.c
new file mode 100644
index 000000000..bf40fb30e
--- /dev/null
+++ b/target/linux/realtek/files/rtkload/read_fd.c
@@ -0,0 +1,69 @@
+/* This file has not been tested for ages. */
+
+#include "hfload.h"
+
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+void
+read_struct(void *s, ssize_t size)
+{
+ ssize_t real;
+
+ real = read(0, s, size);
+ if (size != real) {
+ printf("trying to read %d, got %d; dying.\n", size, real);
+ exit(1);
+ }
+ file_offset += real;
+}
+
+void
+seek_forward(int offset) {
+ int dummy, i;
+ ssize_t real;
+
+ if (offset % 4 != 0) {
+ printf("Can't seek by a non-word aligned amount\n");
+ exit(1);
+ }
+
+ if (offset < file_offset) {
+ printf("can't seek backwards\n");
+ exit(1);
+ }
+
+ for (; offset < file_offset; file_offset += 4) {
+ real = read(0, &dummy, 4);
+ if (real != 4) {
+ printf("error seeking forward at offset %d\n", file_offset);
+ exit(1);
+ }
+ }
+}
+
+void
+copy_to_region(int *addr, ssize_t size) {
+ int i, dummy, real;
+
+ printf("copying %x bytes from file offset %x to address %08x\n",
+ size, file_offset, addr);
+
+#ifdef FAKE_COPYING
+ for (i = 0; i < size; i += 4) {
+ read_struct(&dummy, sizeof(int));
+ }
+#else
+ real = read(0, addr, size);
+ if (real != size) {
+ printf("failed to read %d bytes, exiting\n");
+ exit(1);
+ }
+ file_offset += real;
+#endif
+}
+
+void
+init_read() {
+}