multi.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2002
  4. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  5. */
  6. #include <common.h>
  7. #include <irq_func.h>
  8. #include <log.h>
  9. /*
  10. * CPU test
  11. * Load/store multiple word instructions: lmw, stmw
  12. *
  13. * 27 consecutive words are loaded from a source memory buffer
  14. * into GPRs r5 through r31. After that, 27 consecutive words are stored
  15. * from the GPRs r5 through r31 into a target memory buffer. The contents
  16. * of the source and target buffers are then compared.
  17. */
  18. #include <post.h>
  19. #include "cpu_asm.h"
  20. #if CONFIG_POST & CONFIG_SYS_POST_CPU
  21. extern void cpu_post_exec_02(ulong *code, ulong op1, ulong op2);
  22. int cpu_post_test_multi(void)
  23. {
  24. int ret = 0;
  25. unsigned int i;
  26. ulong src[27], dst[27];
  27. int flag = disable_interrupts();
  28. ulong code[] = {
  29. ASM_LMW(5, 3, 0), /* lmw r5, 0(r3) */
  30. ASM_STMW(5, 4, 0), /* stmr r5, 0(r4) */
  31. ASM_BLR, /* blr */
  32. };
  33. for (i = 0; i < ARRAY_SIZE(src); ++i) {
  34. src[i] = i;
  35. dst[i] = 0;
  36. }
  37. cpu_post_exec_02(code, (ulong) src, (ulong) dst);
  38. ret = memcmp(src, dst, sizeof(dst)) == 0 ? 0 : -1;
  39. if (ret != 0)
  40. post_log("Error at multi test !\n");
  41. if (flag)
  42. enable_interrupts();
  43. return ret;
  44. }
  45. #endif