summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/llfw/nvramlog.S
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/SLOF/llfw/nvramlog.S')
-rw-r--r--qemu/roms/SLOF/llfw/nvramlog.S350
1 files changed, 0 insertions, 350 deletions
diff --git a/qemu/roms/SLOF/llfw/nvramlog.S b/qemu/roms/SLOF/llfw/nvramlog.S
deleted file mode 100644
index 3ad2de754..000000000
--- a/qemu/roms/SLOF/llfw/nvramlog.S
+++ /dev/null
@@ -1,350 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation
- * All rights reserved.
- * This program and the accompanying materials
- * are made available under the terms of the BSD License
- * which accompanies this distribution, and is available at
- * http://www.opensource.org/licenses/bsd-license.php
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *****************************************************************************/
-#include <macros.h>
-#include <nvramlog.h>
-#include <southbridge.h>
-#include <calculatecrc.h>
-
-#if !defined(DISABLE_NVRAM) && !defined(RTAS_NVRAM)
-
-// detect overflow: if(a<b) return a else return 0
-#define NVRAM_LOG_DATA_OVERFLOW( a, b) \
- cmpd 7, a, b; \
- blt+ 7, 0f; \
- li a, 0; \
- 0:
-
-// get Pointer(pointer) to next byte in NVRAM data section
-// and size of this data sechtion (modulo)
-// modifies register pointer, modulo
-#define NVRAM_POINTER_DATASIZE_BE0(pointer, modulo, address) \
- LOAD64( modulo, LLFW_LOG_BE0_LENGTH); \
- lwz pointer, LLFW_LOG_POS_POINTER(address); \
- sldi modulo, modulo, 4; \
- addi modulo, modulo,-LLFW_LOG_BE0_DATA_OFFSET
-#define NVRAM_POINTER_DATASIZE_BE1(pointer, modulo, address) \
- LOAD64( modulo, LLFW_LOG_BE1_LENGTH); \
- lwz pointer, LLFW_LOG_POS_POINTER(address); \
- sldi modulo, modulo, 4; \
- addi modulo, modulo,-LLFW_LOG_BE1_DATA_OFFSET
-
-/****************************************************************************
- * checkLogHeaderData
- * compare the fixed values in the header if any change was done since
- * last initialisation.
- * Flags are not checked!
- *
- * Retrun 0 if no manimulation was found 1 else
- *
- * input:
- * r3 - NVRAM Base Address
- *
- * output:
- * r3 - status: 0 = ok, 1 = corrupt
- * r4 - NVRAM Base Address
- *
- ***************************************************************************/
-ASM_ENTRY(checkLogHeaderData)
- li r4, 0 // init error flag
- lbz r5, 0(r3) // check signature
- addi r5, r5, -LLFW_LOG_BE0_SIGNATURE
- add r4, r4, r5
-
- lhz r5, LLFW_LOG_POS_LENGTH(r3) // check length
- addi r5, r5, -LLFW_LOG_BE0_LENGTH
- add r4, r4, r5
-
- lwz r5, LLFW_LOG_POS_NAME(r3) // check name prefix
- LOAD64( r6, LLFW_LOG_BE0_NAME_PREFIX)
- subf r5, r6, r5
- add r4, r4, r5
-
- ld r5, (LLFW_LOG_POS_NAME+4)(r3) // check name
- LOAD64( r6, LLFW_LOG_BE0_NAME)
- subf r5, r6, r5
- add r4, r4, r5
-
- lhz r5, LLFW_LOG_POS_DATA_OFFSET(r3) //check data offset
- addi r5, r5, -LLFW_LOG_BE0_DATA_OFFSET
- add r4, r4, r5
-
- lhz r5, LLFW_LOG_POS_FLAGS(r3) //check flags
- addi r5, r5, -LLFW_LOG_BE0_FLAGS
- add r4, r4, r5
-
- cmpldi 7, r4, 0
- beq+ 7, 0f
- li r4, 1
-0:
- mr r5, r3
- mr r3, r4
- mr r4, r5
- blr
-/*****************************************************************************
- * checkLogPartition: check Partition Header entries and Checksum
- * check also the NVRAM-Log-Partition CRC
- * if Partition is not ok set the following bits to 1
- * bit 1: if Partiton Header Checksum is corrupt
- * bit 2: if CRC is corrupt
- * bit 3: if Header entries are corrupt
- *
- * input:
- * r3 - NVRAM log address (BASE + NVRAM_LOG_OFFSET)
- *
- * output:
- * r3 - CRC status
- * r4 - NVRAM log address
- *
- * Modifies Register: R3, R4, R5, R6, R7, R8, R9
- ****************************************************************************/
-ASM_ENTRY(.checkLogPartition)
- mflr r8
- mr r4, r3 // emulate "bl updateCRC_NVRAM"
- li r3, 0 // with successful CRC check
- li r7, 0
- cmpwi 7, r3, 0
- beq+ 7, 0f
- li r7, 2
-0:
- mr r3, r4
- bl .calPartitionHeaderChecksum // r3=checksum, r4=NVARM addr
- lbz r6, LLFW_LOG_POS_CHECKSUM(r4)
- cmpw 7, r3, r6
- beq+ 7, 0f // cal checksum must eq checksum
- ori r7, r7, 1
-0:
- cmpwi 7, r3, 0
- bne+ 7, 0f
- ori r7, r7, 1 // 0 as checksum is invalid
-0:
- mr r3, r4
- bl checkLogHeaderData
- cmpdi 7, r3, 0
- beq+ 7, 0f
- ori r7, r7, 4
-0:
- mr r3, r7
- mtlr r8
- blr
-/*****************************************************************************
- * checkinitLog: check the NVRAM Log Partition Header
- * initialize the NVRAM if the Header was modified
- *
- * input:
- * r3 - NVRAM BASE address
- *
- * output:
- * r3 - 0 = check ok, no new header written
- * r3 - 1 = check not ok, header and NVRAM initialized
- * r4 - NVRAM log address
- *
- * Modifies Register: R3, R4, R5, R6, R7, r8, r9
- ****************************************************************************/
-// init is done if checkLogPartiton returns not 0 (= check failed)
-ASM_ENTRY(.checkinitLog)
-ASM_ENTRY(checkinitLog)
- mflr r9
- bl .checkLogPartition //r3..r8, r4_out = r3_in
- mtlr r9
-
- cmpwi 7, r3, 0
- mr r3, r4 // r3=NVRAM_LOG address
- bne- 7, .initLog // if header is not ok, init header
- li r3, 0
- blr // header OK, return 0
-
-
-/* this is basically just a copy of .initLog
- registers used: r3, r4, r5, r6, r7, r9*/
-init_log_2nd_be:
- mflr r9
- li r6, LLFW_LOG_BE0_LENGTH
- mulli r6, r6, 0x10
- add r6, r7, r6
- li r5, LLFW_LOG_BE1_SIGNATURE
- li r4, LLFW_LOG_BE1_LENGTH
- stb r5, 0(r6)
- sth r4, LLFW_LOG_POS_LENGTH(r6)
- li r5, LLFW_LOG_BE1_DATA_OFFSET
- li r4, LLFW_LOG_BE1_FLAGS
- sth r5, LLFW_LOG_POS_DATA_OFFSET(r6)
- sth r4, LLFW_LOG_POS_FLAGS(r6)
- li r5, 1
-
- LOAD32( r4, LLFW_LOG_BE1_NAME_PREFIX)
- stw r5, LLFW_LOG_POS_POINTER(r6)
- stw r4, (LLFW_LOG_POS_NAME+0x00)(r6)
- LOAD64( r5, LLFW_LOG_BE1_NAME)
- std r5, (LLFW_LOG_POS_NAME+0x04)(r6)
- mr r3, r6
- bl .calPartitionHeaderChecksum
- stb r3, LLFW_LOG_POS_CHECKSUM(r6)
- mtlr r9
- blr
-/*****************************************************************************
- * initLog: initialize the NVRAM with 0
- * write a new NVRAM Log-Partition-Header
- *
- * input:
- * r3 - NVRAM BASE address
- *
- * output:
- * r3 - 0 = check ok, no new header written
- * r3 - 1 = check not ok, header and NVRAM initialized
- * r4 - NVRAM log address
- *
- * Modifies Register: R3, R4, R5, R6, R7, r8, r9
- ****************************************************************************/
-ASM_ENTRY(.initLog)
- mflr r8
- mr r7, r3
-
- bl clearNVRAM
-0:
- li r5, LLFW_LOG_BE0_SIGNATURE
- li r4, LLFW_LOG_BE0_LENGTH
- stb r5, 0(r7)
- sth r4, LLFW_LOG_POS_LENGTH(r7)
- li r5, LLFW_LOG_BE0_DATA_OFFSET
- li r4, LLFW_LOG_BE0_FLAGS
- sth r5, LLFW_LOG_POS_DATA_OFFSET(r7)
- sth r4, LLFW_LOG_POS_FLAGS(r7)
- li r5, 1
-
- LOAD32( r4, LLFW_LOG_BE0_NAME_PREFIX)
- stw r5, LLFW_LOG_POS_POINTER(r7)
- stw r4, (LLFW_LOG_POS_NAME+0x00)(r7)
- LOAD64( r5, LLFW_LOG_BE0_NAME)
- std r5, (LLFW_LOG_POS_NAME+0x04)(r7)
- bl .calPartitionHeaderChecksum
- stb r3, LLFW_LOG_POS_CHECKSUM(r7)
- bl init_log_2nd_be // create a second log partition for BE1
- mr r4, r7
- li r3, 1
- mtlr r8
- blr
-/*****************************************************************************
- * clearNVRAM: set all not used NVRAM memory to zero
- *
- *
- * input:
- * R3 - NVRAM BASE ADDRESS
- *
- * output:
- * R3 - NVARM END ADDRESS
- *
- * Modifies Register: r4, r5
- ****************************************************************************/
-ASM_ENTRY(clearNVRAM)
- LOAD64( r4, NVRAM_LENGTH)
- srdi r4, r4, 3
- mtctr r4
- li r5, 0x0
- LOAD64( r4, NVRAM_EMPTY_PATTERN)
-0:
- stdx r4, r3,r5
- addi r5, r5, 8
- bdnz+ 0b
- blr
-/*****************************************************************************
- * writeNVRAMbyte: write next log into NVRAM
- *
- *
- * input:
- * R3 - byte to be written
- * R4 - NVRAM Base Address
- *
- * output:
- * R3 - byte that was written
- * R4 - NVRAM Base Address
- *
- * Modifies Register: R3, R4, R5, R6
- ****************************************************************************/
-ASM_ENTRY(.writeNVRAMbyte)
-ENTRY(writeLogByte)
- NVRAM_POINTER_DATASIZE_BE0( r5, r6, r4) // get pointer,size of data
- NVRAM_LOG_DATA_OVERFLOW( r5, r6) // check for overflow
- addi r5, r5, 1 // increment pointer
- stw r5, LLFW_LOG_POS_POINTER(r4) // store pointer
- addi r5, r5, -1 // restore old pointer
- add r6, r4, r5 // byte address in data section
-
- stb r3, LLFW_LOG_BE0_DATA_OFFSET(r6)
- blr
-
-/*****************************************************************************
- * writeNVRAMbyte: write next log into NVRAM
- *
- *
- * input:
- * R3 - byte to be written
- * R4 - NVRAM Base Address
- *
- * output:
- * R3 - byte that was written
- * R4 - NVRAM Base Address
- *
- * Modifies Register: R3, R4, R5, R6
- ****************************************************************************/
-ENTRY(writeLogByteBE1)
- li r6, LLFW_LOG_BE0_LENGTH
- mulli r6, r6, 0x10
- add r4, r6, r4
- NVRAM_POINTER_DATASIZE_BE1( r5, r6, r4) // get pointer,size of data
- NVRAM_LOG_DATA_OVERFLOW( r5, r6) // check for overflow
- addi r5, r5, 1 // increment pointer
- stw r5, LLFW_LOG_POS_POINTER(r4) // store pointer
- addi r5, r5, -1 // restore old pointer
- add r6, r4, r5 // byte address in data section
-
- stb r3, LLFW_LOG_BE1_DATA_OFFSET(r6)
- blr
-
-/*****************************************************************************
- * calPartitionHeaderChecksum: calculate the Checksum of the
- * Partition Header as described in ....
- *
- * input: r3 - NVRAM BASE adresse
- *
- * output: R3 - the calculated checksum as 8 bit value
- * R4 - NVRAM log address
- *
- * Modifies Register: R3, R4, R5, R6
- ****************************************************************************/
-ASM_ENTRY(.calPartitionHeaderChecksum)
- mr r6, r3
- lbz r3,0(r6) // load first byte
- LOAD64( r4, LLFW_LOG_POS_LENGTH) // load position of 3rd byte
-.L6:
- lbzx r5, r4, r6 // r5 nexed byte
- addi r4, r4, 1 // r4++ (index)
- add r5, r5, r3 // r5 new sum =sum + nexed byte
- rldicl r5, r5, 0, 56
- cmpld 7, r5, r3
- cmpldi 6, r4, LLFW_LOG_POS_DATA_OFFSET
- bge+ 7,.L5 // if new sum > sum
- addi r5, r5, 1 // new sum ++
- rldicl r5, r5, 0, 56
-.L5:
- mr r3,r5 // sum = new sum
- blt+ 6,.L6
-
- mr r4, r6
- blr
-
-#else /* defined(DISABLE_NVRAM) || defined(RTAS_NVRAM) */
-
-ASM_ENTRY(.writeNVRAMbyte)
- ENTRY(writeLogByte)
- blr
-
-#endif