reboot_record.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <string.h>
  2. #include <arch/ops.h>
  3. #include <dev/mrdump.h>
  4. #include <debug.h>
  5. #include "aee.h"
  6. #include "mrdump_private.h"
  7. struct mrdump_control_block *mrdump_cb_addr(void)
  8. {
  9. /* directly return the address of debug service on SRAM */
  10. return (struct mrdump_control_block *)MRDUMP_CB_ADDR;
  11. }
  12. int mrdump_cb_size(void)
  13. {
  14. return MRDUMP_CB_SIZE;
  15. }
  16. int aee_mrdump_get_info(struct mrdump_control_block *mcb)
  17. {
  18. if (mcb == NULL)
  19. return -1;
  20. struct mrdump_control_block *bufp = NULL;
  21. memset(mcb, 0, sizeof(struct mrdump_control_block));
  22. bufp = mrdump_cb_addr();
  23. if (bufp == NULL)
  24. return -2;
  25. if (memcmp(bufp->sig, MRDUMP_GO_DUMP, 8) == 0) {
  26. memcpy(mcb, bufp, sizeof(struct mrdump_control_block));
  27. return 0;
  28. } else {
  29. return -3;
  30. }
  31. }
  32. struct mrdump_control_block *aee_mrdump_get_params(void)
  33. {
  34. struct mrdump_control_block *bufp = mrdump_cb_addr();
  35. if (bufp == NULL) {
  36. dprintf(CRITICAL, "mrdump_cb is NULL\n");
  37. return NULL;
  38. }
  39. if (memcmp(bufp->sig, MRDUMP_GO_DUMP, 8) == 0) {
  40. bufp->sig[0] = 'X';
  41. aee_mrdump_flush_cblock(bufp);
  42. dprintf(CRITICAL, "Boot record found at %p[%02x%02x]\n", bufp, bufp->sig[0], bufp->sig[1]);
  43. return bufp;
  44. } else {
  45. dprintf(CRITICAL, "No Boot record found\n");
  46. return NULL;
  47. }
  48. }
  49. void aee_mrdump_flush_cblock(struct mrdump_control_block *bufp)
  50. {
  51. if (bufp != NULL) {
  52. arch_clean_cache_range((addr_t)bufp, sizeof(struct mrdump_control_block));
  53. }
  54. }