swsusp.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /*
  2. * Support for suspend and resume on s390
  3. *
  4. * Copyright IBM Corp. 2009
  5. *
  6. * Author(s): Hans-Joachim Picht <hans@linux.vnet.ibm.com>
  7. *
  8. */
  9. #include <asm/system.h>
  10. void save_processor_state(void)
  11. {
  12. /* swsusp_arch_suspend() actually saves all cpu register contents.
  13. * Machine checks must be disabled since swsusp_arch_suspend() stores
  14. * register contents to their lowcore save areas. That's the same
  15. * place where register contents on machine checks would be saved.
  16. * To avoid register corruption disable machine checks.
  17. * We must also disable machine checks in the new psw mask for
  18. * program checks, since swsusp_arch_suspend() may generate program
  19. * checks. Disabling machine checks for all other new psw masks is
  20. * just paranoia.
  21. */
  22. local_mcck_disable();
  23. /* Disable lowcore protection */
  24. __ctl_clear_bit(0,28);
  25. S390_lowcore.external_new_psw.mask &= ~PSW_MASK_MCHECK;
  26. S390_lowcore.svc_new_psw.mask &= ~PSW_MASK_MCHECK;
  27. S390_lowcore.io_new_psw.mask &= ~PSW_MASK_MCHECK;
  28. S390_lowcore.program_new_psw.mask &= ~PSW_MASK_MCHECK;
  29. }
  30. void restore_processor_state(void)
  31. {
  32. S390_lowcore.external_new_psw.mask |= PSW_MASK_MCHECK;
  33. S390_lowcore.svc_new_psw.mask |= PSW_MASK_MCHECK;
  34. S390_lowcore.io_new_psw.mask |= PSW_MASK_MCHECK;
  35. S390_lowcore.program_new_psw.mask |= PSW_MASK_MCHECK;
  36. /* Enable lowcore protection */
  37. __ctl_set_bit(0,28);
  38. local_mcck_enable();
  39. }