static int iterate (const char *filename, enum grub_fshelp_filetype filetype, grub_fshelp_node_t node, void *closure) { struct grub_ext2_dir_closure *c = closure; struct grub_dirhook_info info; grub_memset (&info, 0, sizeof (info)); if (! node->inode_read) { grub_ext2_read_inode (c->data, node->ino, &node->inode); if (!grub_errno) node->inode_read = 1; grub_errno = GRUB_ERR_NONE; } if (node->inode_read) { info.mtimeset = 1; info.mtime = grub_le_to_cpu32 (node->inode.mtime); } info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); grub_free (node); return c->hook (filename, &info, c->closure); }
/* Self commenting... */ static grub_err_t grub_scsi_test_unit_ready (grub_scsi_t scsi) { struct grub_scsi_test_unit_ready tur; grub_err_t err; grub_err_t err_sense; tur.opcode = grub_scsi_cmd_test_unit_ready; tur.lun = scsi->lun << GRUB_SCSI_LUN_SHIFT; tur.reserved1 = 0; tur.reserved2 = 0; tur.reserved3 = 0; tur.control = 0; grub_memset (tur.pad, 0, sizeof(tur.pad)); err = scsi->dev->read (scsi, sizeof (tur), (char *) &tur, 0, NULL); /* Each SCSI command should be followed by Request Sense. If not so, many devices STALLs or definitely freezes. */ err_sense = grub_scsi_request_sense (scsi); if (err_sense != GRUB_ERR_NONE) grub_errno = err; /* err_sense is ignored for now and Request Sense Data also... */ if (err) return err; return GRUB_ERR_NONE; }
U32 smp_init(void) { int handle; if (!global_working_memory) { global_working_memory = grub_memalign(SMP_WORKING_MEMORY_ALIGN, SMP_WORKING_MEMORY_SIZE); if (!global_working_memory) { dprintf("smp", "Failed to allocate working memory\n"); return 0; } grub_memset(global_working_memory, 0, SMP_WORKING_MEMORY_SIZE); } if (!global_page_below_1M) { global_page_below_1M = grub_mmap_malign_and_register(SMP_LOW_MEMORY_ALIGN, SMP_LOW_MEMORY_SIZE, &handle, GRUB_MEMORY_AVAILABLE, GRUB_MMAP_MALLOC_LOW); if (!global_page_below_1M) { dprintf("smp", "Failed to allocate a page below 1M\n"); return 0; } else if ((grub_addr_t)global_page_below_1M >= 1048576) { dprintf("smp", "Attempted to allocate a page below 1M, but got %p\n", global_page_below_1M); return 0; } } if (!global_reserved_mwait_memory) { global_reserved_mwait_memory = grub_mmap_malign_and_register(SMP_RESERVED_MEMORY_ALIGN, SMP_RESERVED_MEMORY_SIZE, &handle, GRUB_MEMORY_RESERVED, 0); if (!global_reserved_mwait_memory) { dprintf("smp", "Failed to allocate reserved MWAIT memory\n"); return 0; } } return smp_init_with_memory(global_working_memory, global_page_below_1M, global_reserved_mwait_memory); }
static grub_err_t grub_hostfs_dir (grub_device_t device, const char *path, grub_fs_dir_hook_t hook, void *hook_data) { grub_util_fd_dir_t dir; /* Check if the disk is our dummy disk. */ if (grub_strcmp (device->disk->name, "host")) return grub_error (GRUB_ERR_BAD_FS, "not a hostfs"); dir = grub_util_fd_opendir (path); if (! dir) return grub_error (GRUB_ERR_BAD_FILENAME, N_("can't open `%s': %s"), path, grub_util_fd_strerror ()); while (1) { grub_util_fd_dirent_t de; struct grub_dirhook_info info; grub_memset (&info, 0, sizeof (info)); de = grub_util_fd_readdir (dir); if (! de) break; info.dir = !! is_dir (path, de->d_name); hook (de->d_name, &info, hook_data); } grub_util_fd_closedir (dir); return GRUB_ERR_NONE; }
static grub_err_t grub_video_cbfb_init (void) { grub_memset (&framebuffer, 0, sizeof(framebuffer)); return grub_video_fb_init (); }
static grub_err_t grub_loopback_read (grub_disk_t disk, grub_disk_addr_t sector, grub_size_t size, char *buf) { grub_file_t file = ((struct grub_loopback *) disk->data)->file; grub_off_t pos; grub_file_seek (file, sector << GRUB_DISK_SECTOR_BITS); grub_file_read (file, buf, size << GRUB_DISK_SECTOR_BITS); if (grub_errno) return grub_errno; /* In case there is more data read than there is available, in case of files that are not a multiple of GRUB_DISK_SECTOR_SIZE, fill the rest with zeros. */ pos = (sector + size) << GRUB_DISK_SECTOR_BITS; if (pos > file->size) { grub_size_t amount = pos - file->size; grub_memset (buf + (size << GRUB_DISK_SECTOR_BITS) - amount, 0, amount); } return 0; }
static grub_err_t grub_video_ieee1275_fill_mode_info (grub_ieee1275_phandle_t dev, struct grub_video_mode_info *out) { grub_uint32_t tmp; grub_memset (out, 0, sizeof (*out)); if (grub_ieee1275_get_integer_property (dev, "width", &tmp, sizeof (tmp), 0)) return grub_error (GRUB_ERR_IO, "Couldn't retrieve display width."); out->width = tmp; if (grub_ieee1275_get_integer_property (dev, "height", &tmp, sizeof (tmp), 0)) return grub_error (GRUB_ERR_IO, "Couldn't retrieve display height."); out->height = tmp; if (grub_ieee1275_get_integer_property (dev, "linebytes", &tmp, sizeof (tmp), 0)) return grub_error (GRUB_ERR_IO, "Couldn't retrieve display pitch."); out->pitch = tmp; out->mode_type = GRUB_VIDEO_MODE_TYPE_INDEX_COLOR; out->bpp = 8; out->bytes_per_pixel = 1; out->number_of_colors = 256; out->blit_format = grub_video_get_blit_format (out); return GRUB_ERR_NONE; }
int grub_fdt_create_empty_tree (void *fdt, unsigned int size) { struct grub_fdt_empty_tree *et; if (size < GRUB_FDT_EMPTY_TREE_SZ) return -1; grub_memset (fdt, 0, size); et = fdt; et->empty_node.tree_end = grub_cpu_to_be32_compile_time (FDT_END); et->empty_node.node_end = grub_cpu_to_be32_compile_time (FDT_END_NODE); et->empty_node.node_start = grub_cpu_to_be32_compile_time (FDT_BEGIN_NODE); ((struct grub_fdt_empty_tree *) fdt)->header.off_mem_rsvmap = grub_cpu_to_be32_compile_time (ALIGN_UP (sizeof (grub_fdt_header_t), 8)); grub_fdt_set_off_dt_strings (fdt, sizeof (*et)); grub_fdt_set_off_dt_struct (fdt, sizeof (et->header) + sizeof (et->empty_rsvmap)); grub_fdt_set_version (fdt, FDT_SUPPORTED_VERSION); grub_fdt_set_last_comp_version (fdt, FDT_SUPPORTED_VERSION); grub_fdt_set_size_dt_struct (fdt, sizeof (et->empty_node)); grub_fdt_set_totalsize (fdt, size); grub_fdt_set_magic (fdt, FDT_MAGIC); return 0; }
static grub_uint8_t * make_header (grub_uint8_t *ptr, const char *name, grub_size_t len, grub_uint32_t mode, grub_off_t fsize) { struct newc_head *head = (struct newc_head *) ptr; grub_uint8_t *optr; grub_size_t oh = 0; grub_memcpy (head->magic, "070701", 6); set_field (head->ino, 0); set_field (head->mode, mode); set_field (head->uid, 0); set_field (head->gid, 0); set_field (head->nlink, 1); set_field (head->mtime, 0); set_field (head->filesize, fsize); set_field (head->devmajor, 0); set_field (head->devminor, 0); set_field (head->rdevmajor, 0); set_field (head->rdevminor, 0); set_field (head->namesize, len); set_field (head->check, 0); optr = ptr; ptr += sizeof (struct newc_head); grub_memcpy (ptr, name, len); ptr += len; oh = ALIGN_UP_OVERHEAD (ptr - optr, 4); grub_memset (ptr, 0, oh); ptr += oh; return ptr; }
static grub_err_t grub_video_cbfb_fill_mode_info (struct grub_video_mode_info *out) { grub_memset (out, 0, sizeof (*out)); out->width = grub_video_coreboot_fbtable->width; out->height = grub_video_coreboot_fbtable->height; out->pitch = grub_video_coreboot_fbtable->pitch; out->red_field_pos = grub_video_coreboot_fbtable->red_field_pos; out->red_mask_size = grub_video_coreboot_fbtable->red_mask_size; out->green_field_pos = grub_video_coreboot_fbtable->green_field_pos; out->green_mask_size = grub_video_coreboot_fbtable->green_mask_size; out->blue_field_pos = grub_video_coreboot_fbtable->blue_field_pos; out->blue_mask_size = grub_video_coreboot_fbtable->blue_mask_size; out->reserved_field_pos = grub_video_coreboot_fbtable->reserved_field_pos; out->reserved_mask_size = grub_video_coreboot_fbtable->reserved_mask_size; out->mode_type = GRUB_VIDEO_MODE_TYPE_RGB; out->bpp = grub_video_coreboot_fbtable->bpp; out->bytes_per_pixel = (grub_video_coreboot_fbtable->bpp + 7) / 8; out->number_of_colors = 256; out->blit_format = grub_video_get_blit_format (out); return GRUB_ERR_NONE; }
/* Determine if the device is removable and the type of the device SCSI. */ static grub_err_t grub_scsi_inquiry (grub_scsi_t scsi) { struct grub_scsi_inquiry iq; struct grub_scsi_inquiry_data iqd; grub_err_t err; grub_err_t err_sense; iq.opcode = grub_scsi_cmd_inquiry; iq.lun = scsi->lun << GRUB_SCSI_LUN_SHIFT; iq.page = 0; iq.reserved = 0; iq.alloc_length = 0x24; /* XXX: Hardcoded for now */ iq.control = 0; grub_memset (iq.pad, 0, sizeof(iq.pad)); err = scsi->dev->read (scsi, sizeof (iq), (char *) &iq, sizeof (iqd), (char *) &iqd); /* Each SCSI command should be followed by Request Sense. If not so, many devices STALLs or definitely freezes. */ err_sense = grub_scsi_request_sense (scsi); if (err_sense != GRUB_ERR_NONE) grub_errno = err; /* err_sense is ignored for now and Request Sense Data also... */ if (err) return err; scsi->devtype = iqd.devtype & GRUB_SCSI_DEVTYPE_MASK; scsi->removable = iqd.rmb >> GRUB_SCSI_REMOVABLE_BIT; return GRUB_ERR_NONE; }
/* Load every loadable segment into memory specified by `_load_hook'. */ grub_err_t grub_elf32_load (grub_elf_t _elf, grub_elf32_load_hook_t _load_hook, grub_addr_t *base, grub_size_t *size) { grub_addr_t load_base = (grub_addr_t) -1ULL; grub_size_t load_size = 0; grub_err_t err; auto int NESTED_FUNC_ATTR grub_elf32_load_segment (grub_elf_t elf, Elf32_Phdr *phdr, void *hook); int NESTED_FUNC_ATTR grub_elf32_load_segment (grub_elf_t elf, Elf32_Phdr *phdr, void *hook) { grub_elf32_load_hook_t load_hook = (grub_elf32_load_hook_t) hook; grub_addr_t load_addr; int do_load = 1; load_addr = phdr->p_paddr; if (load_hook && load_hook (phdr, &load_addr, &do_load)) return 1; if (! do_load) return 0; if (load_addr < load_base) load_base = load_addr; grub_dprintf ("elf", "Loading segment at 0x%llx, size 0x%llx\n", (unsigned long long) load_addr, (unsigned long long) phdr->p_memsz); if (grub_file_seek (elf->file, phdr->p_offset) == (grub_off_t) -1) { grub_error_push (); return grub_error (GRUB_ERR_BAD_OS, "invalid offset in program header"); } if (phdr->p_filesz) { grub_ssize_t read; read = grub_file_read (elf->file, (void *) load_addr, phdr->p_filesz); if (read != (grub_ssize_t) phdr->p_filesz) { /* XXX How can we free memory from `load_hook'? */ grub_error_push (); return grub_error (GRUB_ERR_BAD_OS, "couldn't read segment from file: " "wanted 0x%lx bytes; read 0x%lx bytes", phdr->p_filesz, read); } } if (phdr->p_filesz < phdr->p_memsz) grub_memset ((void *) (long) (load_addr + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz); load_size += phdr->p_memsz; return 0; }
int ifconfig (char *ip, char *sm, char *gw, char *svr) { in_addr tmp; if (sm) { if (! inet_aton (sm, &tmp)) return 0; netmask = tmp.s_addr; } if (ip) { if (! inet_aton (ip, &arptable[ARP_CLIENT].ipaddr)) return 0; if (! netmask && ! sm) netmask = default_netmask (); } if (gw && ! inet_aton (gw, &arptable[ARP_GATEWAY].ipaddr)) return 0; grub_memset (arptable[ARP_GATEWAY].node, 0, ETH_ALEN); if (svr && ! inet_aton (svr, &arptable[ARP_SERVER].ipaddr)) return 0; grub_memset (arptable[ARP_SERVER].node, 0, ETH_ALEN); if (ip || sm) { if (IP_BROADCAST == (netmask | arptable[ARP_CLIENT].ipaddr.s_addr) || netmask == (netmask | arptable[ARP_CLIENT].ipaddr.s_addr) || ! netmask) network_ready = 0; else network_ready = 1; } return 1; }
static grub_err_t grub_video_sm712_video_init (void) { /* Reset frame buffer. */ grub_memset (&framebuffer, 0, sizeof(framebuffer)); return grub_video_fb_init (); }
static grub_err_t grub_ext2_dir (grub_device_t device, const char *path, int (*hook) (const char *filename, const struct grub_dirhook_info *info)) { struct grub_ext2_data *data = 0; struct grub_fshelp_node *fdiro = 0; auto int NESTED_FUNC_ATTR iterate (const char *filename, enum grub_fshelp_filetype filetype, grub_fshelp_node_t node); int NESTED_FUNC_ATTR iterate (const char *filename, enum grub_fshelp_filetype filetype, grub_fshelp_node_t node) { struct grub_dirhook_info info; grub_memset (&info, 0, sizeof (info)); if (! node->inode_read) { grub_ext2_read_inode (data, node->ino, &node->inode); if (!grub_errno) node->inode_read = 1; grub_errno = GRUB_ERR_NONE; } if (node->inode_read) { info.mtimeset = 1; info.mtime = grub_le_to_cpu32 (node->inode.mtime); } info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); grub_free (node); return hook (filename, &info); } grub_dl_ref (my_mod); data = grub_ext2_mount (device->disk); if (! data) goto fail; grub_fshelp_find_file (path, &data->diropen, &fdiro, grub_ext2_iterate_dir, grub_ext2_read_symlink, GRUB_FSHELP_DIR); if (grub_errno) goto fail; grub_ext2_iterate_dir (fdiro, iterate); fail: if (fdiro != &data->diropen) grub_free (fdiro); grub_free (data); grub_dl_unref (my_mod); return grub_errno; }
static grub_err_t load_kernel (grub_file_t file, const char *filename, char *buffer, struct multiboot_header *header) { grub_err_t err; if (grub_multiboot_quirks & GRUB_MULTIBOOT_QUIRK_BAD_KLUDGE) { err = grub_multiboot_load_elf (file, filename, buffer); if (err == GRUB_ERR_NONE) { return GRUB_ERR_NONE; } if (err == GRUB_ERR_UNKNOWN_OS && (header->flags & MULTIBOOT_AOUT_KLUDGE)) grub_errno = err = GRUB_ERR_NONE; } if (header->flags & MULTIBOOT_AOUT_KLUDGE) { int offset = ((char *) header - buffer - (header->header_addr - header->load_addr)); int load_size = ((header->load_end_addr == 0) ? file->size - offset : header->load_end_addr - header->load_addr); grub_size_t code_size; void *source; grub_relocator_chunk_t ch; if (header->bss_end_addr) code_size = (header->bss_end_addr - header->load_addr); else code_size = load_size; err = grub_relocator_alloc_chunk_addr (grub_multiboot_relocator, &ch, header->load_addr, code_size); if (err) { grub_dprintf ("multiboot_loader", "Error loading aout kludge\n"); return err; } source = get_virtual_current_address (ch); if ((grub_file_seek (file, offset)) == (grub_off_t) -1) { return grub_errno; } grub_file_read (file, source, load_size); if (grub_errno) return grub_errno; if (header->bss_end_addr) grub_memset ((grub_uint8_t *) source + load_size, 0, header->bss_end_addr - header->load_addr - load_size); grub_multiboot_payload_eip = header->entry_addr; return GRUB_ERR_NONE; } return grub_multiboot_load_elf (file, filename, buffer); }
grub_err_t grub_machine_mmap_iterate (grub_memory_hook_t hook) { grub_uint32_t cont; struct grub_machine_mmap_entry *entry = (struct grub_machine_mmap_entry *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; grub_memset (entry, 0, sizeof (entry)); /* Check if grub_get_mmap_entry works. */ cont = grub_get_mmap_entry (entry, 0); if (entry->size) do { if (hook (entry->addr, entry->len, /* GRUB mmaps have been defined to match with the E820 definition. Therefore, we can just pass type through. */ ((entry->type <= GRUB_MACHINE_MEMORY_BADRAM) && (entry->type >= GRUB_MACHINE_MEMORY_AVAILABLE)) ? entry->type : GRUB_MEMORY_RESERVED)) break; if (! cont) break; grub_memset (entry, 0, sizeof (entry)); cont = grub_get_mmap_entry (entry, cont); } while (entry->size); else { grub_uint32_t eisa_mmap = grub_get_eisa_mmap (); if (eisa_mmap) { if (hook (0x100000, (eisa_mmap & 0xFFFF) << 10, GRUB_MEMORY_AVAILABLE) == 0) hook (0x1000000, eisa_mmap & ~0xFFFF, GRUB_MEMORY_AVAILABLE); } else hook (0x100000, grub_get_ext_memsize () << 10, GRUB_MEMORY_AVAILABLE); } return 0; }
static grub_err_t grub_video_sdl_fini (void) { SDL_Quit (); window = 0; grub_memset (&mode_info, 0, sizeof (mode_info)); return grub_video_fb_fini (); }
grub_err_t grub_efiemu_write_sym_markers (void) { struct grub_efiemu_ptv_rel *ptv_rels = grub_efiemu_mm_obtain_request (ptv_handle); grub_uint8_t *relocated = grub_efiemu_mm_obtain_request (relocated_handle); grub_memset (ptv_rels, 0, (ptv_requested + 1) * sizeof (struct grub_efiemu_ptv_rel)); *relocated = 0; return GRUB_ERR_NONE; }
grub_err_t grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx, char *argv[], void *target) { grub_uint8_t *ptr = target; int i; int newc = 0; struct dir *root = 0; grub_ssize_t cursize = 0; for (i = 0; i < initrd_ctx->nfiles; i++) { grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4)); ptr += ALIGN_UP_OVERHEAD (cursize, 4); if (initrd_ctx->components[i].newc_name) { ptr += insert_dir (initrd_ctx->components[i].newc_name, &root, ptr); ptr = make_header (ptr, initrd_ctx->components[i].newc_name, grub_strlen (initrd_ctx->components[i].newc_name), 0100777, initrd_ctx->components[i].size); newc = 1; } else if (newc) { ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1, 0, 0); free_dir (root); root = 0; newc = 0; } cursize = initrd_ctx->components[i].size; if (grub_file_read (initrd_ctx->components[i].file, ptr, cursize) != cursize) { if (!grub_errno) grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"), argv[i]); grub_initrd_close (initrd_ctx); return grub_errno; } ptr += cursize; } if (newc) ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1, 0, 0); free_dir (root); root = 0; return GRUB_ERR_NONE; }
static grub_err_t grub_linux_boot (void) { struct linux_kernel_params *params; struct linux_kernel_header *lh; char *prot_code; char *bootpath; grub_ssize_t len; bootpath = grub_env_get ("root"); if (bootpath) grub_ieee1275_set_property (grub_ieee1275_chosen, "bootpath", bootpath, grub_strlen (bootpath) + 1, &len); params = (struct linux_kernel_params *) GRUB_OFW_LINUX_PARAMS_ADDR; lh = (struct linux_kernel_header *) params; grub_memset ((char *) params, 0, GRUB_OFW_LINUX_CL_OFFSET); params->alt_mem = grub_mmap_get_upper () >> 10; params->ext_mem = params->alt_mem; lh->cmd_line_ptr = (char *) (GRUB_OFW_LINUX_PARAMS_ADDR + GRUB_OFW_LINUX_CL_OFFSET); params->cl_magic = GRUB_LINUX_CL_MAGIC; params->cl_offset = GRUB_OFW_LINUX_CL_OFFSET; { grub_term_output_t term; int found = 0; FOR_ACTIVE_TERM_OUTPUTS(term) if (grub_strcmp (term->name, "ofconsole") == 0) { grub_uint16_t pos = grub_term_getxy (term); params->video_cursor_x = pos >> 8; params->video_cursor_y = pos & 0xff; params->video_width = grub_term_width (term); params->video_height = grub_term_height (term); found = 1; break; } if (!found) { params->video_cursor_x = 0; params->video_cursor_y = 0; params->video_width = 80; params->video_height = 25; } }
static grub_err_t grub_video_sdl_init (void) { window = 0; if (SDL_Init (SDL_INIT_VIDEO) < 0) return grub_error (GRUB_ERR_BAD_DEVICE, "Couldn't init SDL: %s", SDL_GetError ()); grub_memset (&mode_info, 0, sizeof (mode_info)); return grub_video_fb_init (); }
int rarp (void) { int retry; struct arprequest rarpreq; if (! eth_probe ()) return 0; network_ready = 0; grub_memset (&rarpreq, 0, sizeof (rarpreq)); rarpreq.hwtype = htons (1); rarpreq.protocol = htons (IP); rarpreq.hwlen = ETH_ALEN; rarpreq.protolen = 4; rarpreq.opcode = htons (RARP_REQUEST); grub_memmove ((char *) &rarpreq.shwaddr, arptable[ARP_CLIENT].node, ETH_ALEN); grub_memmove ((char *) &rarpreq.thwaddr, arptable[ARP_CLIENT].node, ETH_ALEN); for (retry = 0; retry < MAX_ARP_RETRIES; ++retry) { long timeout; eth_transmit (broadcast, RARP, sizeof (rarpreq), &rarpreq); timeout = rfc2131_sleep_interval (TIMEOUT, retry); if (await_reply (AWAIT_RARP, 0, rarpreq.shwaddr, timeout)) break; if (ip_abort) return 0; } if (retry < MAX_ARP_RETRIES) { network_ready = 1; return 1; } return 0; }
int rarp (void) { int retry; /* arp and rarp requests share the same packet structure. */ struct arprequest rarpreq; /* Make sure that an ethernet is probed. */ if (! eth_probe ()) return 0; /* Clear the ready flag. */ network_ready = 0; grub_memset (&rarpreq, 0, sizeof (rarpreq)); rarpreq.hwtype = htons (1); rarpreq.protocol = htons (IP); rarpreq.hwlen = ETH_ALEN; rarpreq.protolen = 4; rarpreq.opcode = htons (RARP_REQUEST); grub_memmove ((char *) &rarpreq.shwaddr, arptable[ARP_CLIENT].node, ETH_ALEN); /* sipaddr is already zeroed out */ grub_memmove ((char *) &rarpreq.thwaddr, arptable[ARP_CLIENT].node, ETH_ALEN); /* tipaddr is already zeroed out */ for (retry = 0; retry < MAX_ARP_RETRIES; ++retry) { long timeout; eth_transmit (broadcast, RARP, sizeof (rarpreq), &rarpreq); timeout = rfc2131_sleep_interval (TIMEOUT, retry); if (await_reply (AWAIT_RARP, 0, rarpreq.shwaddr, timeout)) break; if (ip_abort) return 0; } if (retry < MAX_ARP_RETRIES) { network_ready = 1; return 1; } return 0; }
static int grub_macho_load_do_load (grub_macho_t _macho, struct grub_macho_cmd *hdr0, void *closure) { struct grub_macho_load_closure *c = closure; grub_macho_segment_t *hdr = (grub_macho_segment_t *) hdr0; if (hdr->cmd != GRUB_MACHO_CMD_SEGMENT) return 0; if (! hdr->filesize && (c->flags & GRUB_MACHO_NOBSS)) return 0; if (! hdr->vmsize) return 0; if (grub_file_seek (_macho->file, hdr->fileoff + _macho->offsetXX) == (grub_off_t) -1) { grub_error_push (); grub_error (GRUB_ERR_BAD_OS, "invalid offset in program header"); return 1; } if (hdr->filesize) { grub_ssize_t read; read = grub_file_read (_macho->file, c->offset + hdr->vmaddr, min (hdr->filesize, hdr->vmsize)); if (read != (grub_ssize_t) min (hdr->filesize, hdr->vmsize)) { /* XXX How can we free memory from `load_hook'? */ grub_error_push (); c->err = grub_error (GRUB_ERR_BAD_OS, "couldn't read segment from file: " "wanted 0x%lx bytes; read 0x%lx bytes", hdr->filesize, read); return 1; } } if (hdr->filesize < hdr->vmsize) grub_memset (c->offset + hdr->vmaddr + hdr->filesize, 0, hdr->vmsize - hdr->filesize); return 0; }
grub_err_t grub_get_datetime (struct grub_datetime *datetime) { struct grub_arc_timeinfo *dt; grub_memset (datetime, 0, sizeof (*datetime)); dt = GRUB_ARC_FIRMWARE_VECTOR->gettime (); datetime->year = dt->y; datetime->month = dt->m; datetime->day = dt->d; datetime->hour = dt->h; datetime->minute = dt->min; datetime->second = dt->s; return 0; }
static void fill_vbe_tag (struct multiboot_tag_vbe *tag) { grub_vbe_status_t status; void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; tag->type = MULTIBOOT_TAG_TYPE_VBE; tag->size = 0; status = grub_vbe_bios_get_controller_info (scratch); if (status != GRUB_VBE_STATUS_OK) return; grub_memcpy (&tag->vbe_control_info, scratch, sizeof (struct grub_vbe_info_block)); status = grub_vbe_bios_get_mode (scratch); tag->vbe_mode = *(grub_uint32_t *) scratch; if (status != GRUB_VBE_STATUS_OK) return; /* get_mode_info isn't available for mode 3. */ if (tag->vbe_mode == 3) { struct grub_vbe_mode_info_block *mode_info = (void *) &tag->vbe_mode_info; grub_memset (mode_info, 0, sizeof (struct grub_vbe_mode_info_block)); mode_info->memory_model = GRUB_VBE_MEMORY_MODEL_TEXT; mode_info->x_resolution = 80; mode_info->y_resolution = 25; } else { status = grub_vbe_bios_get_mode_info (tag->vbe_mode, scratch); if (status != GRUB_VBE_STATUS_OK) return; grub_memcpy (&tag->vbe_mode_info, scratch, sizeof (struct grub_vbe_mode_info_block)); } grub_vbe_bios_get_pm_interface (&tag->vbe_interface_seg, &tag->vbe_interface_off, &tag->vbe_interface_len); tag->size = sizeof (*tag); }
static void grub_gettext_delete_list (struct grub_gettext_context *ctx) { struct grub_gettext_msg *l = ctx->grub_gettext_msg_list; grub_size_t i; if (!l) return; ctx->grub_gettext_msg_list = 0; for (i = 0; i < ctx->grub_gettext_max; i++) grub_free (l[i].name); /* Don't delete the translated message because could be in use. */ grub_free (l); if (ctx->fd_mo) grub_file_close (ctx->fd_mo); ctx->fd_mo = 0; grub_memset (ctx, 0, sizeof (*ctx)); }
int minios_probe (struct nic *nic) { char *ip; if (net_dev) return 1; /* Clear the ARP table. */ grub_memset ((char *) arptable, 0, MAX_ARP * sizeof (struct arptable_t)); net_dev = init_netfront(NULL, (void*) -1, nic->node_addr, &ip); if (!net_dev) return 0; return 1; }
/* Prompt to input a command and read the line. */ static grub_err_t grub_rescue_read_line (char **line, int cont) { int c; int pos = 0; char str[4]; grub_printf ((cont) ? "> " : "grub rescue> "); grub_memset (linebuf, 0, GRUB_RESCUE_BUF_SIZE); while ((c = grub_getkey ()) != '\n' && c != '\r') { if (grub_isprint (c)) { if (pos < GRUB_RESCUE_BUF_SIZE - 1) { str[0] = c; str[1] = 0; linebuf[pos++] = c; grub_xputs (str); } } else if (c == '\b') { if (pos > 0) { str[0] = c; str[1] = ' '; str[2] = c; str[3] = 0; linebuf[--pos] = 0; grub_xputs (str); } } grub_refresh (); } grub_xputs ("\n"); grub_refresh (); *line = grub_strdup (linebuf); return 0; }