Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

librm_mgmt.c 1.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /*
  2. * librm: a library for interfacing to real-mode code
  3. *
  4. * Michael Brown <mbrown@fensystems.co.uk>
  5. *
  6. */
  7. #include <stdint.h>
  8. #include <librm.h>
  9. /*
  10. * This file provides functions for managing librm.
  11. *
  12. */
  13. /**
  14. * Allocate space on the real-mode stack and copy data there from a
  15. * user buffer
  16. *
  17. * @v data User buffer
  18. * @v size Size of stack data
  19. * @ret sp New value of real-mode stack pointer
  20. */
  21. uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) {
  22. userptr_t rm_stack;
  23. rm_sp -= size;
  24. rm_stack = real_to_user ( rm_ss, rm_sp );
  25. memcpy_user ( rm_stack, 0, data, 0, size );
  26. return rm_sp;
  27. };
  28. /**
  29. * Deallocate space on the real-mode stack, optionally copying back
  30. * data to a user buffer.
  31. *
  32. * @v data User buffer
  33. * @v size Size of stack data
  34. */
  35. void remove_user_from_rm_stack ( userptr_t data, size_t size ) {
  36. if ( data ) {
  37. userptr_t rm_stack = real_to_user ( rm_ss, rm_sp );
  38. memcpy_user ( rm_stack, 0, data, 0, size );
  39. }
  40. rm_sp += size;
  41. };