summaryrefslogtreecommitdiffstats
path: root/src/securerom/hw_utils.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/securerom/hw_utils.C')
-rw-r--r--src/securerom/hw_utils.C252
1 files changed, 124 insertions, 128 deletions
diff --git a/src/securerom/hw_utils.C b/src/securerom/hw_utils.C
index 19d4ee947..7adcb35a8 100644
--- a/src/securerom/hw_utils.C
+++ b/src/securerom/hw_utils.C
@@ -22,13 +22,9 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
-/****************************************************************************
- *
- ****************************************************************************/
-#include <hw_utils.h>
-#include <status_codes.h>
-/****************************************************************************/
+#include <securerom/hw_utils.H>
+#include <securerom/status_codes.H>
#ifdef EMULATE_HW
@@ -36,187 +32,187 @@
#include <unistd.h>
#include <sys/mman.h>
#include <limits.h>
-#include <stdint.h> /* uint_fast8_t, uintN_t */
-#include <inttypes.h>
+#include <stdint.h> /* uint_fast8_t, uintN_t */
+#include "inttypes.H"
hw_settings HW;
-/****************************************************************************/
-void HW_Init (void) {
- /* Open the file that will be used to fill the memory contents of the mmap */
- HW.mfd = open ("/dev/zero", O_RDWR, 0);
- if (HW.mfd < 0) {
- printf ("HW_Init: can't create memory file");
- exit(1);
- }
+void HW_Init (void)
+{
+ // Open the file that will be used to fill the memory contents of the mmap
+ HW.mfd = open ("/dev/zero", O_RDWR, 0);
+ if (HW.mfd < 0)
+ {
+ printf ("HW_Init: can't create memory file");
+ exit(1);
+ }
/* Allocate Memory */
#ifdef HOST_64
- HW.data = (uint8_t*) mmap64 (0, TOTAL_TEST_MEMORY,
- PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, HW.mfd, 0);
+ HW.data = (uint8_t*) mmap64 (0, TOTAL_TEST_MEMORY,
+ PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_PRIVATE, HW.mfd, 0);
#else
- HW.data = (uint8_t*) mmap (0, TOTAL_TEST_MEMORY,
- PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, HW.mfd, 0);
+ HW.data = (uint8_t*) mmap (0, TOTAL_TEST_MEMORY,
+ PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE,
+ HW.mfd, 0);
#endif
- if ((uint32_t) HW.data == -1) {
- printf ("Unable to allocate HW Memory of size %d", TOTAL_TEST_MEMORY);
- HW_Free();
- exit(1);
- }
- HW.memory = HW.data+0x1000-((uint32_t)HW.data&0xfff);
+ if ((uint32_t) HW.data == -1)
+ {
+ printf ("Unable to allocate HW Memory of size %d", TOTAL_TEST_MEMORY);
+ HW_Free();
+ exit(1);
+ }
+ HW.memory = HW.data+0x1000-((uint32_t)HW.data&0xfff);
}
-/****************************************************************************/
void HW_Free (void)
{
- close (HW.mfd);
+ close (HW.mfd);
}
-/****************************************************************************/
void Log (uint64_t code) {
- mtspr_SCRATCH2 (code);
+ mtspr_SCRATCH2 (code);
+}
+
+void Check_Stop (const char* msg)
+{
+ printf ("CHECK STOP '%s'\n", msg);
+ printf ("SCRATCH3= 0x%08llX\n", mfspr_SCRATCH3());
+ exit(FAIL);
}
-/****************************************************************************/
-void Check_Stop (char* msg) {
- printf ("CHECK STOP '%s'\n", msg);
- printf ("SCRATCH3= 0x%08llX\n", mfspr_SCRATCH3());
- exit(FAIL);
+void Error_Stop (uint64_t code, const char* msg)
+{
+ mtspr_SCRATCH3 (ERROR_EVENT|code);
+ Check_Stop (msg);
}
-/****************************************************************************/
-void Error_Stop (uint64_t code, char* msg) {
- mtspr_SCRATCH3 (ERROR_EVENT|code);
- Check_Stop (msg);
+void assem_DCBI (uint64_t addr)
+{
+ addr = physical_addr(addr)&CACHE_MASK;
+ memset(Convert_Mem_Addr(addr),0xff,CACHE_LINE); // destroys contents in model
}
-/****************************************************************************/
-void assem_DCBI (uint64_t addr) {
- addr = physical_addr(addr)&CACHE_MASK;
- memset(Convert_Mem_Addr(addr),0xff,CACHE_LINE); // destroys contents in model
- }
-/****************************************************************************/
void assem_DCBZ (uint64_t addr) {
- addr = physical_addr(addr)&CACHE_MASK;
- memset(Convert_Mem_Addr(addr),0,CACHE_LINE);
+ addr = physical_addr(addr)&CACHE_MASK;
+ memset(Convert_Mem_Addr(addr),0,CACHE_LINE);
}
-/****************************************************************************/
+
void assem_DCBST (uint8_t* addr) {}
-/****************************************************************************/
void assem_ICBI (uint64_t* addr) {}
-/****************************************************************************/
void assem_SYNC (void) {}
-/****************************************************************************/
void assem_ISYNC (void) {}
-/****************************************************************************/
-void mtspr_HRMOR (uint64_t addr) {
- HW.HRMOR = addr & HRMOR_MASK;
-}
-
-/****************************************************************************/
-//uint64_t mfspr_HRMOR (void) {
-// return HW.HRMOR;
-//}
-
-/****************************************************************************/
-
-/****************************************************************************/
-uint64_t getscom_FSP_BAR_value (uint64_t base) {
- return HW.FSP_BAR.value;
-}
-
-/****************************************************************************/
-uint64_t getscom_FSP_BAR_mask (uint64_t base) {
- return HW.FSP_BAR.mask;
+void mtspr_HRMOR (uint64_t addr)
+{
+ HW.HRMOR = addr & HRMOR_MASK;
}
-/****************************************************************************/
-void getscom_HW_ECID (uint64_t base, uint8_t* buf) {
- memcpy(buf, HW.ECID, ECID_SIZE);
+uint64_t getscom_FSP_BAR_value (uint64_t base)
+{
+ return HW.FSP_BAR.value;
}
-/****************************************************************************/
-void getscom_PIBMEM_HW_Key_Hash (uint64_t base, uint8_t* buf) {
- memcpy(buf, HW.PIBMEM_HW_KEY_HASH, SHA512_DIGEST_SIZE);
+uint64_t getscom_FSP_BAR_mask (uint64_t base)
+{
+ return HW.FSP_BAR.mask;
}
-/****************************************************************************/
-uint8_t* Convert_Mem_Addr (uint64_t addr) {
- if (addr >= TEST_SYSTEM_MEMORY) return NULL;
- return HW.memory+addr;
+void getscom_HW_ECID (uint64_t base, uint8_t* buf)
+{
+ memcpy(buf, HW.ECID, ECID_SIZE);
}
-/****************************************************************************/
-uint64_t physical_addr (uint64_t addr) {
- if (addr & HRMOR_IGNORE) addr = PHYSICAL(addr);
- else addr = PHYSICAL(addr) | HW.HRMOR;
- return addr;
+uint8_t* Convert_Mem_Addr (uint64_t addr)
+{
+ if (addr >= TEST_SYSTEM_MEMORY)
+ {
+ return NULL;
+ }
+ return HW.memory+addr;
}
-/****************************************************************************/
-uint64_t Convert_Mem_Offset (uint8_t* addr) {
- if (addr < HW.memory) return 0;
- return (uint64_t)(uint32_t)(addr-HW.memory);
+uint64_t physical_addr (uint64_t addr)
+{
+ if (addr & HRMOR_IGNORE)
+ {
+ addr = PHYSICAL(addr);
+ }
+ else
+ {
+ addr = PHYSICAL(addr) | HW.HRMOR;
+ }
+ return addr;
+}
+
+uint64_t Convert_Mem_Offset (uint8_t* addr)
+{
+ if (addr < HW.memory)
+ {
+ return 0;
+ }
+ return (uint64_t)(uint32_t)(addr-HW.memory);
}
-/****************************************************************************/
-uint16_t GET16(uint16_t data) {
+uint16_t GET16(uint16_t data)
+{
#ifdef __BIG_ENDIAN
- return data;
+ return data;
#endif
#ifdef __LITTLE_ENDIAN
- return ((data&0x00FF)<<8
- |(data&0xFF00)>>8
- );
+ return ((data&0x00FF)<<8
+ | (data&0xFF00)>>8
+ );
#endif
}
-/****************************************************************************/
-uint32_t GET32 (uint32_t data) {
+uint32_t GET32 (uint32_t data)
+{
#ifdef __BIG_ENDIAN
- return data;
+ return data;
#endif
#ifdef __LITTLE_ENDIAN
- return ((data&0x000000FF)<<24
- |(data&0x0000FF00)<<8
- |(data&0x00FF0000)>>8
- |(data&0xFF000000)>>24
- );
+ return ((data&0x000000FF)<<24
+ |(data&0x0000FF00)<<8
+ |(data&0x00FF0000)>>8
+ |(data&0xFF000000)>>24
+ );
#endif
}
-/****************************************************************************/
-uint64_t GET64 (uint64_t data) {
+uint64_t GET64 (uint64_t data)
+{
#ifdef __BIG_ENDIAN
- return data;
+ return data;
#endif
#ifdef __LITTLE_ENDIAN
- return ((data&0x00000000000000FFull)<<(7*8)
- |(data&0x000000000000FF00ull)<<(5*8)
- |(data&0x0000000000FF0000ull)<<(3*8)
- |(data&0x00000000FF000000ull)<<(1*8)
- |(data&0x000000FF00000000ull)>>(1*8)
- |(data&0x0000FF0000000000ull)>>(3*8)
- |(data&0x00FF000000000000ull)>>(5*8)
- |(data&0xFF00000000000000ull)>>(7*8)
- );
+ return ((data&0x00000000000000FFull)<<(7*8)
+ |(data&0x000000000000FF00ull)<<(5*8)
+ |(data&0x0000000000FF0000ull)<<(3*8)
+ |(data&0x00000000FF000000ull)<<(1*8)
+ |(data&0x000000FF00000000ull)>>(1*8)
+ |(data&0x0000FF0000000000ull)>>(3*8)
+ |(data&0x00FF000000000000ull)>>(5*8)
+ |(data&0xFF00000000000000ull)>>(7*8)
+ );
#endif
}
#else
-void __attribute__((noreturn)) Check_Stop(void) {
- //do not use XSCOM as the XSCOM base is not known for sure
+void __attribute__((noreturn)) Check_Stop(void)
+{
+ //do not use XSCOM as the XSCOM base is not known for sure
- //set AVP_out to (optionally) cause secure checkstop
- mtspr(SPRC,SPRC_AVP_out);
- mtspr(SPRD,-1LL);
+ //set AVP_out to (optionally) cause secure checkstop
+ mtspr(SPRC,SPRC_AVP_out);
+ mtspr(SPRD,-1LL);
- asm volatile(" li 0,0 \n"
- " mtmsr 0 \n" //ensure there is no error handler so it will checkstop instead
- " lis 0,-1107 \n"
- " stdcix 0,0,0 \n" //store to invalid address
- " eieio ");
- for(;;) {}
+ asm volatile(" li 0,0 \n"
+ " mtmsr 0 \n" //ensure there is no error handler so it will checkstop instead
+ " lis 0,-1107 \n"
+ " stdcix 0,0,0 \n" //store to invalid address
+ " eieio ");
+ for(;;) {}
}
-#endif //emulate_hw
+#endif //EMULATE_HW
OpenPOWER on IntegriCloud