Merge branch 'master' into leiflindholm/arm64

This commit is contained in:
Vladimir Serbinenko 2013-11-18 17:51:28 +01:00
commit 96fa2d9d02
33 changed files with 519 additions and 96 deletions

View file

@ -574,6 +574,7 @@ module = {
module = {
name = pci;
common = bus/pci.c;
i386_ieee1275 = bus/i386/ieee1275/pci.c;
enable = i386_pc;
enable = i386_ieee1275;

View file

@ -0,0 +1,42 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2013 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/dl.h>
#include <grub/pci.h>
#include <grub/mm.h>
#include <grub/misc.h>
#include <grub/ieee1275/ieee1275.h>
volatile void *
grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)),
grub_addr_t base,
grub_size_t size)
{
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_REAL_MODE))
return (volatile void *) base;
if (grub_ieee1275_map (base, base, size, 7))
grub_fatal ("couldn't map 0x%lx", base);
return (volatile void *) base;
}
void
grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)),
volatile void *mem __attribute__ ((unused)),
grub_size_t size __attribute__ ((unused)))
{
}

View file

@ -735,6 +735,7 @@ grub_legacy_check_md5_password (int argc, char **args,
char *entered)
{
struct legacy_md5_password *pw = NULL;
int ret;
if (args[0][0] != '-' || args[0][1] != '-')
{
@ -751,7 +752,9 @@ grub_legacy_check_md5_password (int argc, char **args,
if (!pw)
return 0;
return check_password_md5_real (entered, pw);
ret = check_password_md5_real (entered, pw);
grub_free (pw);
return ret;
}
static grub_err_t

View file

@ -192,6 +192,10 @@ free_pk (struct grub_public_key *pk)
struct grub_public_subkey *nsk, *sk;
for (sk = pk->subkeys; sk; sk = nsk)
{
grub_size_t i;
for (i = 0; i < ARRAY_SIZE (sk->mpis); i++)
if (sk->mpis[i])
gcry_mpi_release (sk->mpis[i]);
nsk = sk->next;
grub_free (sk);
}
@ -244,6 +248,7 @@ grub_load_public_key (grub_file_t f)
if (type == 0xff)
{
grub_free (fingerprint_context);
grub_free (buffer);
return ret;
}
@ -631,6 +636,9 @@ grub_verify_signature_real (char *buf, grub_size_t size,
if ((*pkalgos[pk].algo)->verify (0, hmpi, mpis, sk->mpis, 0, 0))
goto fail;
grub_free (context);
grub_free (readbuf);
return GRUB_ERR_NONE;
fail:
@ -736,8 +744,8 @@ static grub_err_t
grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
int argc, char **args)
{
grub_file_t f, sig;
grub_err_t err;
grub_file_t f = NULL, sig = NULL;
grub_err_t err = GRUB_ERR_NONE;
struct grub_public_key *pk = NULL;
grub_dprintf ("crypt", "alive\n");
@ -768,19 +776,27 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
grub_file_filter_disable_all ();
f = grub_file_open (args[0]);
if (!f)
return grub_errno;
{
err = grub_errno;
goto fail;
}
grub_file_filter_disable_all ();
sig = grub_file_open (args[1]);
if (!sig)
{
grub_file_close (f);
return grub_errno;
err = grub_errno;
goto fail;
}
err = grub_verify_signature (f, sig, pk);
grub_file_close (f);
grub_file_close (sig);
fail:
if (sig)
grub_file_close (sig);
if (f)
grub_file_close (f);
if (pk)
free_pk (pk);
return err;
}

View file

@ -47,6 +47,7 @@ grub_ubootdisk_register (struct device_info *newdev)
{
case DT_STOR_IDE:
case DT_STOR_SATA:
case DT_STOR_SCSI:
case DT_STOR_MMC:
case DT_STOR_USB:
/* hd */

View file

@ -87,9 +87,6 @@ grub_file_open (const char *name)
if (! file)
goto fail;
file->name = grub_strdup (name);
grub_errno = GRUB_ERR_NONE;
file->device = device;
if (device->disk && file_name[0] != '/')
@ -105,6 +102,9 @@ grub_file_open (const char *name)
if ((file->fs->open) (file, file_name) != GRUB_ERR_NONE)
goto fail;
file->name = grub_strdup (name);
grub_errno = GRUB_ERR_NONE;
for (filter = 0; file && filter < ARRAY_SIZE (grub_file_filters_enabled);
filter++)
if (grub_file_filters_enabled[filter])
@ -187,6 +187,7 @@ grub_file_close (grub_file_t file)
if (file->device)
grub_device_close (file->device);
grub_free (file->name);
grub_free (file);
return grub_errno;
}

View file

@ -49,7 +49,7 @@ grub_machine_init (void)
}
/* FIXME: measure this. */
grub_arch_cpuclock = 64000000;
grub_arch_cpuclock = 200000000;
modend = grub_modules_get_end ();
grub_mm_init_region ((void *) modend, grub_arch_memsize

View file

@ -298,7 +298,10 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
/* Mark find as a start marker for next allocation to fasten it.
This will have side effect of fragmenting memory as small
pieces before this will be un-used. */
*first = q;
/* So do it only for chunks under 64K. */
if (n < (0x8000 >> GRUB_MM_ALIGN_LOG2)
|| *first == p)
*first = q;
return p + 1;
}

View file

@ -47,10 +47,11 @@ FUNCTION(grub_setjmp)
stw 28, 60(3)
stw 29, 64(3)
stw 30, 68(3)
stw 31, 72(3)
mflr 4
stw 4, 72(3)
mfcr 4
stw 4, 76(3)
mfcr 4
stw 4, 80(3)
li 3, 0
blr
@ -76,9 +77,10 @@ FUNCTION(grub_longjmp)
lwz 28, 60(3)
lwz 29, 64(3)
lwz 30, 68(3)
lwz 5, 72(3)
mtlr 5
lwz 31, 72(3)
lwz 5, 76(3)
mtlr 5
lwz 5, 80(3)
mtcr 5
mr. 3, 4
bne 1f

View file

@ -1618,7 +1618,7 @@ grub_relocator_prepare_relocs (struct grub_relocator *rel, grub_addr_t addr,
}
void
grub_mm_check_real (char *file, int line)
grub_mm_check_real (const char *file, int line)
{
grub_mm_region_t r;
grub_mm_header_t p, pa;

View file

@ -41,7 +41,11 @@ FUNCTION(grub_setjmp)
FUNCTION(grub_longjmp)
ldx [%o0 + 0x10], %g1
movrz %o1, 1, %o1
save %sp, -64, %sp
flushw
restore
ldx [%o0 + 0x00], %o7
ldx [%o0 + 0x08], %fp
sub %fp, 192, %sp

View file

@ -379,12 +379,18 @@ grub_cmdline_get (const char *prompt_translated)
cl_terms = grub_malloc (sizeof (cl_terms[0]) * nterms);
if (!cl_terms)
return 0;
{
grub_free (buf);
return 0;
}
cl_term_cur = cl_terms;
unicode_msg = grub_malloc (msg_len * sizeof (grub_uint32_t));
if (!unicode_msg)
return 0;;
{
grub_free (buf);
return 0;
}
msg_len = grub_utf8_to_ucs4 (unicode_msg, msg_len - 1,
(grub_uint8_t *) prompt_translated, -1, 0);
unicode_msg[msg_len++] = ' ';
@ -621,6 +627,7 @@ grub_cmdline_get (const char *prompt_translated)
case '\e':
grub_free (cl_terms);
grub_free (buf);
return 0;
case '\b':

View file

@ -281,7 +281,8 @@ grub_util_make_temporary_file (void)
memcpy (tmp, t, tl);
memcpy (tmp + tl, "/grub.XXXXXX",
sizeof ("/grub.XXXXXX"));
mkstemp (tmp);
if (mkstemp (tmp) == -1)
grub_util_error (_("cannot make temporary file: %s"), strerror (errno));
return tmp;
}
@ -298,7 +299,9 @@ grub_util_make_temporary_dir (void)
memcpy (tmp, t, tl);
memcpy (tmp + tl, "/grub.XXXXXX",
sizeof ("/grub.XXXXXX"));
mkdtemp (tmp);
if (!mkdtemp (tmp))
grub_util_error (_("cannot make temporary directory: %s"),
strerror (errno));
return tmp;
}

View file

@ -748,8 +748,8 @@ grub_cmd_terminfo (grub_extcmd_context_t ctxt, int argc, char **args)
{
struct grub_terminfo_output_state *data
= (struct grub_terminfo_output_state *) cur->data;
data->pos.x = w;
data->pos.y = h;
data->size.x = w;
data->size.y = h;
}
if (argc == 1)

View file

@ -66,16 +66,25 @@ struct grub_procfs_entry test_txt =
.get_contents = get_test_txt
};
#define FONT_NAME "Unknown Regular 16"
/* Functional test main method. */
static void
cmdline_cat_test (void)
{
unsigned i;
grub_font_t font;
grub_dl_load ("gfxterm");
grub_errno = GRUB_ERR_NONE;
if (grub_font_load ("unicode") == 0)
font = grub_font_get (FONT_NAME);
if (font && grub_strcmp (font->name, FONT_NAME) != 0)
font = 0;
if (!font)
font = grub_font_load ("unicode");
if (!font)
{
grub_test_assert (0, "unicode font not found: %s", grub_errmsg);
return;

View file

@ -91,17 +91,30 @@ struct
{ "gfxterm_high", "menu_color_highlight", "blue/red" },
};
#define FONT_NAME "Unknown Regular 16"
/* Functional test main method. */
static void
gfxterm_menu (void)
{
unsigned i, j;
grub_font_t font;
grub_dl_load ("png");
grub_dl_load ("gettext");
grub_dl_load ("gfxterm");
if (grub_font_load ("unicode") == 0)
grub_errno = GRUB_ERR_NONE;
grub_dl_load ("gfxmenu");
font = grub_font_get (FONT_NAME);
if (font && grub_strcmp (font->name, FONT_NAME) != 0)
font = 0;
if (!font)
font = grub_font_load ("unicode");
if (!font)
{
grub_test_assert (0, "unicode font not found: %s", grub_errmsg);
return;
@ -112,7 +125,16 @@ gfxterm_menu (void)
for (j = 0; j < ARRAY_SIZE (tests); j++)
for (i = 0; i < GRUB_TEST_VIDEO_SMALL_N_MODES; i++)
{
grub_uint64_t start = grub_get_time_ms ();
grub_uint64_t start;
#if defined (GRUB_MACHINE_MIPS_QEMU_MIPS) || defined (GRUB_MACHINE_IEEE1275)
if (grub_test_video_modes[i].width > 1024)
continue;
if (grub_strcmp (tests[j].name, "gfxmenu") == 0
&& grub_test_video_modes[i].width > 800)
continue;
#endif
start = grub_get_time_ms ();
grub_video_capture_start (&grub_test_video_modes[i],
grub_video_fbstd_colors,

View file

@ -26,13 +26,22 @@
GRUB_MOD_LICENSE ("GPLv3+");
#define FONT_NAME "Unknown Regular 16"
/* Functional test main method. */
static void
videotest_checksum (void)
{
unsigned i;
grub_font_t font;
if (grub_font_load ("unicode") == 0)
font = grub_font_get (FONT_NAME);
if (font && grub_strcmp (font->name, FONT_NAME) != 0)
font = 0;
if (!font)
font = grub_font_load ("unicode");
if (!font)
{
grub_test_assert (0, "unicode font not found: %s", grub_errmsg);
return;
@ -40,9 +49,20 @@ videotest_checksum (void)
for (i = 0; i < ARRAY_SIZE (grub_test_video_modes); i++)
{
grub_video_capture_start (&grub_test_video_modes[i],
grub_video_fbstd_colors,
grub_test_video_modes[i].number_of_colors);
grub_err_t err;
#if defined (GRUB_MACHINE_MIPS_QEMU_MIPS) || defined (GRUB_MACHINE_IEEE1275)
if (grub_test_video_modes[i].width > 1024)
continue;
#endif
err = grub_video_capture_start (&grub_test_video_modes[i],
grub_video_fbstd_colors,
grub_test_video_modes[i].number_of_colors);
if (err)
{
grub_test_assert (0, "can't start capture: %s", grub_errmsg);
grub_print_error ();
continue;
}
grub_terminal_input_fake_sequence ((int []) { '\n' }, 1);
grub_video_checksum ("videotest");