sha1 patch for ppcskel
authortheStack <sebastian.falbesoner@gmail.com>
Sun, 30 Aug 2009 21:49:57 +0000 (23:49 +0200)
committerBernhard Urban <lewurm@gmx.net>
Fri, 4 Sep 2009 19:39:31 +0000 (21:39 +0200)
Steve Reid's SHA-1 C implementation is used here and slighty modified
for the SHA-1 Controller in Hollywood.
Some simple testcases showed that it is a bit faster as it would be done
in software, especially on a huge amount of data.
However, there is room for improvement :)

Further this patch uses the AHBPROT issue recently found, so Broadway is
able to acces the SHA-1 Controller *directly*.

24 files changed:
.deps/console.d [deleted file]
.deps/diskio.d [deleted file]
.deps/exception.d [deleted file]
.deps/fat.d [deleted file]
.deps/ff.d [deleted file]
.deps/font.d [deleted file]
.deps/gecko.d [deleted file]
.deps/input.d [deleted file]
.deps/ipc.d [deleted file]
.deps/main.d [deleted file]
.deps/malloc.d [deleted file]
.deps/mini_ipc.d [deleted file]
.deps/nandfs.d [deleted file]
.deps/printf.d [deleted file]
.deps/string.d [deleted file]
.deps/sync.d [deleted file]
.deps/time.d [deleted file]
.deps/video_low.d [deleted file]
Makefile
gecko.c
hollywood.h [new file with mode: 0644]
main.c
sha1.c [new file with mode: 0644]
sha1.h [new file with mode: 0644]

diff --git a/.deps/console.d b/.deps/console.d
deleted file mode 100644 (file)
index ee6e69c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-console.o: console.c bootmii_ppc.h types.h printf.h video_low.h console.h \
- string.h malloc.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-video_low.h:
-
-console.h:
-
-string.h:
-
-malloc.h:
diff --git a/.deps/diskio.d b/.deps/diskio.d
deleted file mode 100644 (file)
index 91a9b0d..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-diskio.o: diskio.c bootmii_ppc.h types.h printf.h ipc.h mini_ipc.h \
- diskio.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-diskio.h:
-
-string.h:
diff --git a/.deps/exception.d b/.deps/exception.d
deleted file mode 100644 (file)
index 10580b9..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-exception.o: exception.c bootmii_ppc.h types.h printf.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-string.h:
diff --git a/.deps/fat.d b/.deps/fat.d
deleted file mode 100644 (file)
index 3e0d498..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-fat.o: fat.c fat.h ff.h types.h diskio.h
-
-fat.h:
-
-ff.h:
-
-types.h:
-
-diskio.h:
diff --git a/.deps/ff.d b/.deps/ff.d
deleted file mode 100644 (file)
index e1a6e7d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-ff.o: ff.c ff.h types.h diskio.h string.h
-
-ff.h:
-
-types.h:
-
-diskio.h:
-
-string.h:
diff --git a/.deps/font.d b/.deps/font.d
deleted file mode 100644 (file)
index 05386da..0000000
+++ /dev/null
@@ -1 +0,0 @@
-font.o: font.c
diff --git a/.deps/gecko.d b/.deps/gecko.d
deleted file mode 100644 (file)
index a4ffc09..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-gecko.o: gecko.c bootmii_ppc.h types.h printf.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
diff --git a/.deps/input.d b/.deps/input.d
deleted file mode 100644 (file)
index 106fd9d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-input.o: input.c bootmii_ppc.h types.h printf.h input.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-input.h:
-
-string.h:
diff --git a/.deps/ipc.d b/.deps/ipc.d
deleted file mode 100644 (file)
index 7b04dfe..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-ipc.o: ipc.c bootmii_ppc.h types.h printf.h ipc.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-string.h:
diff --git a/.deps/main.d b/.deps/main.d
deleted file mode 100644 (file)
index db1b5bb..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-main.o: main.c bootmii_ppc.h types.h printf.h string.h ipc.h mini_ipc.h \
- nandfs.h fat.h ff.h diskio.h malloc.h video_low.h input.h console.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-string.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-nandfs.h:
-
-fat.h:
-
-ff.h:
-
-diskio.h:
-
-malloc.h:
-
-video_low.h:
-
-input.h:
-
-console.h:
diff --git a/.deps/malloc.d b/.deps/malloc.d
deleted file mode 100644 (file)
index fc65e56..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-malloc.o: malloc.c bootmii_ppc.h types.h printf.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-string.h:
diff --git a/.deps/mini_ipc.d b/.deps/mini_ipc.d
deleted file mode 100644 (file)
index eec10fa..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-mini_ipc.o: mini_ipc.c bootmii_ppc.h types.h printf.h ipc.h mini_ipc.h \
- string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-string.h:
diff --git a/.deps/nandfs.d b/.deps/nandfs.d
deleted file mode 100644 (file)
index 872043a..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-nandfs.o: nandfs.c bootmii_ppc.h types.h printf.h ipc.h mini_ipc.h \
- nandfs.h string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-ipc.h:
-
-mini_ipc.h:
-
-nandfs.h:
-
-string.h:
diff --git a/.deps/printf.d b/.deps/printf.d
deleted file mode 100644 (file)
index f233a70..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-printf.o: printf.c types.h
-
-types.h:
diff --git a/.deps/string.d b/.deps/string.d
deleted file mode 100644 (file)
index 578b675..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-string.o: string.c string.h types.h
-
-string.h:
-
-types.h:
diff --git a/.deps/sync.d b/.deps/sync.d
deleted file mode 100644 (file)
index c2a75f6..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-sync.o: sync.c bootmii_ppc.h types.h printf.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
diff --git a/.deps/time.d b/.deps/time.d
deleted file mode 100644 (file)
index b78f1ea..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-time.o: time.c bootmii_ppc.h types.h printf.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
diff --git a/.deps/video_low.d b/.deps/video_low.d
deleted file mode 100644 (file)
index f1242fd..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-video_low.o: video_low.c bootmii_ppc.h types.h printf.h video_low.h \
- string.h
-
-bootmii_ppc.h:
-
-types.h:
-
-printf.h:
-
-video_low.h:
-
-string.h:
index 87ff1fc5a68371113cb463f71798ff738bc2be46..39a27fff227c54c5f16c3183b8ba11d32ee64475 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,8 @@ TARGET = ppcboot.elf
 
 OBJS = realmode.o crt0.o main.o string.o sync.o time.o printf.o input.o \
        exception.o exception_2200.o malloc.o gecko.o video_low.o \
-       ipc.o mini_ipc.o nandfs.o ff.o diskio.o fat.o font.o console.o
+       ipc.o mini_ipc.o nandfs.o ff.o diskio.o fat.o font.o console.o \
+       sha1.o
 
 include common.mk
 
diff --git a/gecko.c b/gecko.c
index 49f57cfec7387c84e55f846ce687873a6c93836d..1511fa5d491738cce9df5ab5d479ccf96e6d62bf 100644 (file)
--- a/gecko.c
+++ b/gecko.c
@@ -205,6 +205,8 @@ int printf(const char *fmt, ...) {
        if (!gecko_console_enabled)
                return 0;
 
+       udelay(100); // evil hack :)
+
        va_list args;
        char buffer[1024];
        int i;
diff --git a/hollywood.h b/hollywood.h
new file mode 100644 (file)
index 0000000..3f2dde4
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+       mini - a Free Software replacement for the Nintendo/BroadOn IOS.
+       Hollywood register definitions
+
+Copyright (C) 2008, 2009       Haxx Enterprises <bushing@gmail.com>
+Copyright (C) 2008, 2009       Sven Peter <svenpeter@gmail.com>
+Copyright (C) 2008, 2009       Hector Martin "marcan" <marcan@marcansoft.com>
+Copyright (C) 2008, 2009       John Kelley <wiidev@kelley.ca>
+
+# This code is licensed to you under the terms of the GNU GPL, version 2;
+# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+*/
+
+#ifndef __HOLLYWOOD_H__
+#define __HOLLYWOOD_H__
+
+/* Hollywood Registers */
+
+#define                HW_PPC_REG_BASE         0xd000000
+#define                HW_REG_BASE             0xd800000
+
+// The PPC can only see the first three IPC registers
+#define                HW_IPC_PPCMSG           (HW_REG_BASE + 0x000)
+#define                HW_IPC_PPCCTRL          (HW_REG_BASE + 0x004)
+#define                HW_IPC_ARMMSG           (HW_REG_BASE + 0x008)
+#define                HW_IPC_ARMCTRL          (HW_REG_BASE + 0x00c)
+
+#define                HW_TIMER                (HW_REG_BASE + 0x010)
+#define                HW_ALARM                (HW_REG_BASE + 0x014)
+
+#define                HW_PPCIRQFLAG           (HW_REG_BASE + 0x030)
+#define                HW_PPCIRQMASK           (HW_REG_BASE + 0x034)
+
+#define                HW_ARMIRQFLAG           (HW_REG_BASE + 0x038)
+#define                HW_ARMIRQMASK           (HW_REG_BASE + 0x03c)
+
+#define                HW_MEMMIRR              (HW_REG_BASE + 0x060)
+
+// something to do with PPCBOOT
+// and legacy DI it seems ?!?
+#define                HW_EXICTRL              (HW_REG_BASE + 0x070)
+#define                EXICTRL_ENABLE_EXI      1
+
+// PPC side of GPIO1 (Starlet can access this too)
+// Output state
+#define                HW_GPIO1BOUT            (HW_REG_BASE + 0x0c0)
+// Direction (1=output)
+#define                HW_GPIO1BDIR            (HW_REG_BASE + 0x0c4)
+// Input state
+#define                HW_GPIO1BIN             (HW_REG_BASE + 0x0c8)
+// Interrupt level
+#define                HW_GPIO1BINTLVL         (HW_REG_BASE + 0x0cc)
+// Interrupt flags (write 1 to clear)
+#define                HW_GPIO1BINTFLAG        (HW_REG_BASE + 0x0d0)
+// Interrupt propagation enable
+// Do these interrupts go anywhere???
+#define                HW_GPIO1BINTENABLE      (HW_REG_BASE + 0x0d4)
+//??? seems to be a mirror of inputs at some point... power-up state?
+#define                HW_GPIO1BINMIR          (HW_REG_BASE + 0x0d8)
+// 0xFFFFFF by default, if cleared disables respective outputs. Top bits non-settable.
+#define                HW_GPIO1ENABLE          (HW_REG_BASE + 0x0dc)
+
+#define                HW_GPIO1_SLOT           0x000020
+#define                HW_GPIO1_DEBUG          0xFF0000
+#define                HW_GPIO1_DEBUG_SH       16
+
+// Starlet side of GPIO1
+// Output state
+#define                HW_GPIO1OUT             (HW_REG_BASE + 0x0e0)
+// Direction (1=output)
+#define                HW_GPIO1DIR             (HW_REG_BASE + 0x0e4)
+// Input state
+#define                HW_GPIO1IN              (HW_REG_BASE + 0x0e8)
+// Interrupt level
+#define                HW_GPIO1INTLVL          (HW_REG_BASE + 0x0ec)
+// Interrupt flags (write 1 to clear)
+#define                HW_GPIO1INTFLAG         (HW_REG_BASE + 0x0f0)
+// Interrupt propagation enable (interrupts go to main interrupt 0x800)
+#define                HW_GPIO1INTENABLE       (HW_REG_BASE + 0x0f4)
+//??? seems to be a mirror of inputs at some point... power-up state?
+#define                HW_GPIO1INMIR           (HW_REG_BASE + 0x0f8)
+// Owner of each GPIO bit. If 1, GPIO1B registers assume control. If 0, GPIO1 registers assume control.
+#define                HW_GPIO1OWNER           (HW_REG_BASE + 0x0fc)
+
+// ????
+#define                HW_DIFLAGS              (HW_REG_BASE + 0x180)
+#define                DIFLAGS_BOOT_CODE       0x100000
+
+// maybe a GPIO???
+#define                HW_RESETS               (HW_REG_BASE + 0x194)
+
+#define                HW_CLOCKS               (HW_REG_BASE + 0x1b4)
+
+#define                HW_GPIO2OUT             (HW_REG_BASE + 0x1c8)
+#define                HW_GPIO2DIR             (HW_REG_BASE + 0x1cc)
+#define                HW_GPIO2IN              (HW_REG_BASE + 0x1d0)
+
+#define                HW_OTPCMD               (HW_REG_BASE + 0x1ec)
+#define                HW_OTPDATA              (HW_REG_BASE + 0x1f0)
+#define                HW_VERSION              (HW_REG_BASE + 0x214)
+
+/* NAND Registers */
+
+#define                NAND_REG_BASE           0xd010000
+
+#define                NAND_CMD                (NAND_REG_BASE + 0x000)
+#define                NAND_STATUS             NAND_CMD
+#define                NAND_CONF               (NAND_REG_BASE + 0x004)
+#define                NAND_ADDR0              (NAND_REG_BASE + 0x008)
+#define                NAND_ADDR1              (NAND_REG_BASE + 0x00c)
+#define                NAND_DATA               (NAND_REG_BASE + 0x010)
+#define                NAND_ECC                (NAND_REG_BASE + 0x014)
+#define                NAND_UNK1               (NAND_REG_BASE + 0x018)
+#define                NAND_UNK2               (NAND_REG_BASE + 0x01c)
+
+/* AES Registers */
+
+#define                AES_REG_BASE            0xd020000
+
+#define                AES_CMD                 (AES_REG_BASE + 0x000)
+#define                AES_SRC                 (AES_REG_BASE + 0x004)
+#define                AES_DEST                (AES_REG_BASE + 0x008)
+#define                AES_KEY                 (AES_REG_BASE + 0x00c)
+#define                AES_IV                  (AES_REG_BASE + 0x010)
+
+/* SHA-1 Registers */
+
+#define                SHA_REG_BASE            0xd030000
+
+#define                SHA_CMD                 (SHA_REG_BASE + 0x000)
+#define                SHA_SRC                 (SHA_REG_BASE + 0x004)
+#define                SHA_H0                  (SHA_REG_BASE + 0x008)
+#define                SHA_H1                  (SHA_REG_BASE + 0x00c)
+#define                SHA_H2                  (SHA_REG_BASE + 0x010)
+#define                SHA_H3                  (SHA_REG_BASE + 0x014)
+#define                SHA_H4                  (SHA_REG_BASE + 0x018)
+
+/* SD Host Controller Registers */
+
+#define                SDHC_REG_BASE           0xd070000
+
+/* OHCI0 Registers */
+
+#define        OHCI0_REG_BASE          0xd050000
+
+#define        OHCI0_HC_REVISION                       (OHCI0_REG_BASE + 0x00)
+#define        OHCI0_HC_CONTROL                        (OHCI0_REG_BASE + 0x04)
+#define        OHCI0_HC_COMMAND_STATUS         (OHCI0_REG_BASE + 0x08)
+#define        OHCI0_HC_INT_STATUS             (OHCI0_REG_BASE + 0x0C)
+
+#define        OHCI0_HC_INT_ENABLE             (OHCI0_REG_BASE + 0x10)
+#define        OHCI0_HC_INT_DISABLE            (OHCI0_REG_BASE + 0x14)
+#define        OHCI0_HC_HCCA                           (OHCI0_REG_BASE + 0x18)
+#define        OHCI0_HC_PERIOD_CURRENT_ED      (OHCI0_REG_BASE + 0x1C)
+
+#define        OHCI0_HC_CTRL_HEAD_ED           (OHCI0_REG_BASE + 0x20)
+#define        OHCI0_HC_CTRL_CURRENT_ED        (OHCI0_REG_BASE + 0x24)
+#define        OHCI0_HC_BULK_HEAD_ED           (OHCI0_REG_BASE + 0x28)
+#define        OHCI0_HC_BULK_CURRENT_ED        (OHCI0_REG_BASE + 0x2C)
+
+#define        OHCI0_HC_DONE_HEAD                      (OHCI0_REG_BASE + 0x30)
+#define        OHCI0_HC_FM_INTERVAL            (OHCI0_REG_BASE + 0x34)
+#define        OHCI0_HC_FM_REMAINING           (OHCI0_REG_BASE + 0x38)
+#define        OHCI0_HC_FM_NUMBER                      (OHCI0_REG_BASE + 0x3C)
+
+#define        OHCI0_HC_PERIODIC_START         (OHCI0_REG_BASE + 0x40)
+#define        OHCI0_HC_LS_THRESHOLD           (OHCI0_REG_BASE + 0x44)
+#define        OHCI0_HC_RH_DESCRIPTOR_A        (OHCI0_REG_BASE + 0x48)
+#define        OHCI0_HC_RH_DESCRIPTOR_B        (OHCI0_REG_BASE + 0x4C)
+
+#define        OHCI0_HC_RH_STATUS                      (OHCI0_REG_BASE + 0x50)
+
+/* OHCI1 Registers */
+
+#define        OHCI1_REG_BASE          0xd060000
+
+#define        OHCI1_HC_REVISION                       (OHCI1_REG_BASE + 0x00)
+#define        OHCI1_HC_CONTROL                        (OHCI1_REG_BASE + 0x04)
+#define        OHCI1_HC_COMMAND_STATUS         (OHCI1_REG_BASE + 0x08)
+#define        OHCI1_HC_INT_STATUS             (OHCI1_REG_BASE + 0x0C)
+
+#define        OHCI1_HC_INT_ENABLE             (OHCI1_REG_BASE + 0x10)
+#define        OHCI1_HC_INT_DISABLE            (OHCI1_REG_BASE + 0x14)
+#define        OHCI1_HC_HCCA                           (OHCI1_REG_BASE + 0x18)
+#define        OHCI1_HC_PERIOD_CURRENT_ED      (OHCI1_REG_BASE + 0x1C)
+
+#define        OHCI1_HC_CTRL_HEAD_ED           (OHCI1_REG_BASE + 0x20)
+#define        OHCI1_HC_CTRL_CURRENT_ED        (OHCI1_REG_BASE + 0x24)
+#define        OHCI1_HC_BULK_HEAD_ED           (OHCI1_REG_BASE + 0x28)
+#define        OHCI1_HC_BULK_CURRENT_ED        (OHCI1_REG_BASE + 0x2C)
+
+#define        OHCI1_HC_DONE_HEAD                      (OHCI1_REG_BASE + 0x30)
+#define        OHCI1_HC_FM_INTERVAL            (OHCI1_REG_BASE + 0x34)
+#define        OHCI1_HC_FM_REMAINING           (OHCI1_REG_BASE + 0x38)
+#define        OHCI1_HC_FM_NUMBER                      (OHCI1_REG_BASE + 0x3C)
+
+#define        OHCI1_HC_PERIODIC_START         (OHCI1_REG_BASE + 0x40)
+#define        OHCI1_HC_LS_THRESHOLD           (OHCI1_REG_BASE + 0x44)
+#define        OHCI1_HC_RH_DESCRIPTOR_A        (OHCI1_REG_BASE + 0x48)
+#define        OHCI1_HC_RH_DESCRIPTOR_B        (OHCI1_REG_BASE + 0x4C)
+
+#define        OHCI1_HC_RH_STATUS                      (OHCI1_REG_BASE + 0x50)
+
+/* EHCI Registers */
+#define        EHCI_REG_BASE           0xd040000
+
+/* stolen from mikep2 patched linux kernel: drivers/usb/host/ohci-mipc.c */
+#define                EHCI_CTL                        (EHCI_REG_BASE + 0xCC)
+#define                EHCI_CTL_OH0INTE                (1<<11) /* oh0 interrupt enable */
+#define                EHCI_CTL_OH1INTE                (1<<12) /* oh1 interrupt enable */
+
+/* EXI Registers */
+
+#define                EXI_REG_BASE            0xd806800
+#define                EXI0_REG_BASE           (EXI_REG_BASE+0x000)
+#define                EXI1_REG_BASE           (EXI_REG_BASE+0x014)
+#define                EXI2_REG_BASE           (EXI_REG_BASE+0x028)
+
+#define                EXI0_CSR                (EXI0_REG_BASE+0x000)
+#define                EXI0_MAR                (EXI0_REG_BASE+0x004)
+#define                EXI0_LENGTH             (EXI0_REG_BASE+0x008)
+#define                EXI0_CR                 (EXI0_REG_BASE+0x00c)
+#define                EXI0_DATA               (EXI0_REG_BASE+0x010)
+
+#define                EXI1_CSR                (EXI1_REG_BASE+0x000)
+#define                EXI1_MAR                (EXI1_REG_BASE+0x004)
+#define                EXI1_LENGTH             (EXI1_REG_BASE+0x008)
+#define                EXI1_CR                 (EXI1_REG_BASE+0x00c)
+#define                EXI1_DATA               (EXI1_REG_BASE+0x010)
+
+#define                EXI2_CSR                (EXI2_REG_BASE+0x000)
+#define                EXI2_MAR                (EXI2_REG_BASE+0x004)
+#define                EXI2_LENGTH             (EXI2_REG_BASE+0x008)
+#define                EXI2_CR                 (EXI2_REG_BASE+0x00c)
+#define                EXI2_DATA               (EXI2_REG_BASE+0x010)
+
+#define                EXI_BOOT_BASE           (EXI_REG_BASE+0x040)
+
+/* MEMORY CONTROLLER Registers */
+
+#define                MEM_REG_BASE            0xd8b4000
+#define                MEM_PROT                (MEM_REG_BASE+0x20a)
+#define                MEM_PROT_START          (MEM_REG_BASE+0x20c)
+#define                MEM_PROT_END            (MEM_REG_BASE+0x20e)
+#define                MEM_FLUSHREQ            (MEM_REG_BASE+0x228)
+#define                MEM_FLUSHACK            (MEM_REG_BASE+0x22a)
+
+#endif
diff --git a/main.c b/main.c
index acd97174cd0e328a07f8d60d821cfb1022430db7..3e186f3f13505102362c6a0baa1af280907f7792 100644 (file)
--- a/main.c
+++ b/main.c
@@ -24,6 +24,8 @@ Copyright (C) 2009              John Kelley <wiidev@kelley.ca>
 #include "video_low.h"
 #include "input.h"
 #include "console.h"
+#include "sha1.h"
+#include "hollywood.h"
 
 #define MINIMUM_MINI_VERSION 0x00010001
 
@@ -109,9 +111,9 @@ int main(void)
                        ; // better ideas welcome!
        }
 
-    print_str_noscroll(112, 112, "ohai, world!\n");
+       printf("===============================\n");
 
-       testOTP();
+       SHA1TestCases();
 
        printf("bye, world!\n");
 
diff --git a/sha1.c b/sha1.c
new file mode 100644 (file)
index 0000000..9201920
--- /dev/null
+++ b/sha1.c
@@ -0,0 +1,216 @@
+/*
+SHA-1 in C
+By Steve Reid <steve@edmweb.com>
+100% Public Domain
+
+Test Vectors (from FIPS PUB 180-1)
+"abc"
+  A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
+"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+  84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
+A million repetitions of "a"
+  34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
+*/
+
+#define SHA1HANDSOFF
+
+#include "string.h"
+#include "sha1.h"
+#include "bootmii_ppc.h"
+#include "hollywood.h"
+#include "malloc.h"
+#include "types.h"
+
+//should be divisibly by four
+#define BLOCKSIZE 32
+
+#define SHA_CMD_FLAG_EXEC (1<<31)
+#define SHA_CMD_FLAG_IRQ  (1<<30)
+#define SHA_CMD_FLAG_ERR  (1<<29)
+#define SHA_CMD_AREA_BLOCK ((1<<10) - 1)
+
+typedef struct {
+       unsigned long state[5];
+       unsigned long count[2];
+       unsigned char buffer[64];
+} SHA1_CTX;
+
+typedef u32 sha1[5];
+
+static void SHA1Transform(unsigned long state[5], unsigned char buffer[64]);
+static void SHA1Transforml(unsigned long state[5], unsigned char buffer[64], u32 len);
+static void SHA1Init(SHA1_CTX* context);
+static void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len);
+static void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
+
+static void SHA1Transform(unsigned long state[5], unsigned char buffer[64]) {
+       SHA1Transforml(state, buffer, 1);
+}
+
+/* Hash a single 512-bit block. This is the core of the algorithm. */
+
+static void SHA1Transforml(unsigned long state[5], unsigned char buffer[64], u32 len)
+{
+       /* Copy context->state[] to working vars */
+       write32(SHA_H0, state[0]);
+       write32(SHA_H1, state[1]);
+       write32(SHA_H2, state[2]);
+       write32(SHA_H3, state[3]);
+       write32(SHA_H4, state[4]);
+
+       static u32 num_blocks;
+       num_blocks = len;
+
+       // assign block to local copy which is 64-byte aligned
+       static u8 block[64*BLOCKSIZE] ALIGNED(64);
+       // for further improvments!
+       // u8 *block = memalign(64, 64*num_blocks);
+       memcpy(block, buffer, 64*num_blocks);
+
+       // royal flush :)
+       sync_after_write(block, 64*num_blocks);
+
+       // tell sha1 controller the block source address
+       write32(SHA_SRC, virt_to_phys(block));
+       
+       // tell sha1 controller number of blocks
+       if (num_blocks != 0)
+               num_blocks--;
+       write32(SHA_CMD, (read32(SHA_CMD) & ~(SHA_CMD_AREA_BLOCK)) | num_blocks);
+
+       // fire up hashing and wait till its finished
+       write32(SHA_CMD, read32(SHA_CMD) | SHA_CMD_FLAG_EXEC);
+       while (read32(SHA_CMD) & SHA_CMD_FLAG_EXEC);
+
+       // free the aligned data
+       // free(block);
+
+       /* Add the working vars back into context.state[] */
+       state[0] = read32(SHA_H0);
+       state[1] = read32(SHA_H1);
+       state[2] = read32(SHA_H2);
+       state[3] = read32(SHA_H3);
+       state[4] = read32(SHA_H4);
+}
+
+
+/* SHA1Init - Initialize new context */
+
+static void SHA1Init(SHA1_CTX* context)
+{
+       // reset sha-1 engine
+       write32(SHA_CMD, read32(SHA_CMD) & ~(SHA_CMD_FLAG_EXEC));
+       while ((read32(SHA_CMD) & SHA_CMD_FLAG_EXEC) != 0);
+
+       /* SHA1 initialization constants */
+       context->state[0] = 0x67452301;
+       context->state[1] = 0xEFCDAB89;
+       context->state[2] = 0x98BADCFE;
+       context->state[3] = 0x10325476;
+       context->state[4] = 0xC3D2E1F0;
+       context->count[0] = context->count[1] = 0;
+}
+
+
+/* Run your data through this. */
+
+static void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len)
+{
+       unsigned int i, j;
+
+       j = (context->count[0] >> 3) & 63;
+       if ((context->count[0] += len << 3) < (len << 3)) 
+               context->count[1]++;
+       context->count[1] += (len >> 29);
+       if ((j + len) > 63) {
+               memcpy(&context->buffer[j], data, (i = 64-j));
+               SHA1Transform(context->state, context->buffer);
+               // try bigger blocks at once
+               for ( ; i + 63 + ((BLOCKSIZE-1)*64) < len; i += (64 + (BLOCKSIZE-1)*64)) {
+                       SHA1Transforml(context->state, &data[i], BLOCKSIZE);
+               }
+               for ( ; i + 63 + (((BLOCKSIZE/2)-1)*64) < len; i += (64 + ((BLOCKSIZE/2)-1)*64)) {
+                       SHA1Transforml(context->state, &data[i], BLOCKSIZE/2);
+               }
+               for ( ; i + 63 + (((BLOCKSIZE/4)-1)*64) < len; i += (64 + ((BLOCKSIZE/4)-1)*64)) {
+                       SHA1Transforml(context->state, &data[i], BLOCKSIZE/4);
+               }
+               for ( ; i + 63 < len; i += 64) {
+                       SHA1Transform(context->state, &data[i]);
+               }
+               j = 0;
+       }
+       else i = 0;
+       memcpy(&context->buffer[j], &data[i], len - i);
+}
+
+
+/* Add padding and return the message digest. */
+
+static void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
+{
+       unsigned long i, j;
+       unsigned char finalcount[8];
+
+       for (i = 0; i < 8; i++) {
+               finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
+               >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
+       }
+
+       SHA1Update(context, (unsigned char *)"\200", 1);
+       while ((context->count[0] & 504) != 448) {
+               SHA1Update(context, (unsigned char *)"\0", 1);
+       }
+       SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform() */
+       for (i = 0; i < 20; i++) {
+               digest[i] = (unsigned char)
+               ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
+       }
+       /* Wipe variables */
+       i = j = 0;
+       memset(context->buffer, 0, 64);
+       memset(context->state, 0, 20);
+       memset(context->count, 0, 8);
+       memset(&finalcount, 0, 8);
+#ifdef SHA1HANDSOFF  /* make SHA1Transform overwrite it's own static vars */
+       SHA1Transform(context->state, context->buffer);
+#endif
+}
+
+void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf) 
+{
+       SHA1_CTX ctx;
+  
+       SHA1Init(&ctx);
+       SHA1Update(&ctx, ptr, size);
+       SHA1Final(outbuf, &ctx);
+}
+
+static void SHA1TestIt(const char *str, u32 len)
+{
+       u8 *in = malloc(len*sizeof(u8));
+       sha1 out;
+       strlcpy((char*)in, str, len+1);
+
+       u32 diff = read32(HW_TIMER);
+       SHA1(in, len, (u8*) out);
+       diff = read32(HW_TIMER)-diff;
+
+       printf("SHA-1 (in hardware) says (H0|H1|H2|H3|H4): %08X|%08X|%08X|%08X|%08X this was calculatet in %02d (hollywood-)cycles\n", out[0], out[1], out[2], out[3], out[4], diff);
+}
+
+
+void SHA1TestCases(void)
+{
+       // expected sha1 hash of string "lasasdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5" (len = 3811)
+       // 33ad104c4fd0de2e90edd6f6103de8304043ab20
+       SHA1TestIt("lasasdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5asdfasghasfghahadghadghadfghasdgfasdgfafghasdfgasdfasdfasdfasdfasdfahadhjaer5yq35635uyjzgzdghad56q346aw456w46aw5", 3811);
+       // expected sha1 hash of string "asdf" (len = 4)
+       // 3da541559918a808c2402bba5012f6c60b27661c
+       SHA1TestIt("asdf", 4);
+
+       // expected sha1 hash of string "asdfasdfjalsdfjklasdkjflaksdjflaksdjflkasjdfklajsdfkljasldkfjlaskdjflkajsdfakljsdfklasjddflkjalskdjfasldfjlasdkjflaskjdflaksdf" (len = 126)
+       // 74e1e9e5489d08dc65108aff3a21756e8fc269d2
+       SHA1TestIt("asdfasdfjalsdfjklasdkjflaksdjflaksdjflkasjdfklajsdfkljasldkfjlaskdjflkajsdfakljsdfklasjddflkjalskdjfasldfjlasdkjflaskjdflaksdf", 126);
+}
+
diff --git a/sha1.h b/sha1.h
new file mode 100644 (file)
index 0000000..a4a01b5
--- /dev/null
+++ b/sha1.h
@@ -0,0 +1,8 @@
+#ifndef __SHA1_H__
+#define __SHA1_H__
+
+void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf);
+
+void SHA1TestCases(void);
+
+#endif