static inline grub_err_t load (grub_file_t file, void *where, grub_off_t off, grub_size_t size) { if (PTR_TO_UINT32 (where) + size > grub_os_area_addr + grub_os_area_size) return grub_error (GRUB_ERR_OUT_OF_RANGE, "not enough memory for the module"); if (grub_file_seek (file, off) == (grub_off_t) -1) return grub_errno; if (grub_file_read (file, where, size) != (grub_ssize_t) size) { if (grub_errno) return grub_errno; else return grub_error (GRUB_ERR_BAD_OS, "file is truncated"); } return GRUB_ERR_NONE; }
/* Write value (pointer to memory PLUS_HANDLE) - (pointer to memory MINUS_HANDLE) + VALUE to ADDR assuming that the size SIZE bytes. If PTV_NEEDED is 1 then announce it to runtime that this value needs to be recomputed before going to virtual mode */ grub_err_t grub_efiemu_write_value (void *addr, grub_uint32_t value, int plus_handle, int minus_handle, int ptv_needed, int size) { /* Announce relocator to runtime */ if (ptv_needed) { struct grub_efiemu_ptv_rel *ptv_rels = grub_efiemu_mm_obtain_request (ptv_handle); if (ptv_needed && ptv_written >= ptv_alloc) return grub_error (GRUB_ERR_OUT_OF_MEMORY, "your module didn't declare efiemu " " relocators correctly"); if (minus_handle) ptv_rels[ptv_written].minustype = grub_efiemu_mm_get_type (minus_handle); else ptv_rels[ptv_written].minustype = 0; if (plus_handle) ptv_rels[ptv_written].plustype = grub_efiemu_mm_get_type (plus_handle); else ptv_rels[ptv_written].plustype = 0; ptv_rels[ptv_written].addr = PTR_TO_UINT64 (addr); ptv_rels[ptv_written].size = size; ptv_written++; /* memset next value to zero to mark the end */ grub_memset (&ptv_rels[ptv_written], 0, sizeof (ptv_rels[ptv_written])); } /* Compute the value */ if (minus_handle) value -= PTR_TO_UINT32 (grub_efiemu_mm_obtain_request (minus_handle)); if (plus_handle) value += PTR_TO_UINT32 (grub_efiemu_mm_obtain_request (plus_handle)); /* Write the value */ switch (size) { case 8: *((grub_uint64_t *) addr) = value; break; case 4: *((grub_uint32_t *) addr) = value; break; case 2: *((grub_uint16_t *) addr) = value; break; case 1: *((grub_uint8_t *) addr) = value; break; default: return grub_error (GRUB_ERR_BAD_ARGUMENT, "wrong symbol size"); } return GRUB_ERR_NONE; }