All of lore.kernel.org
 help / color / mirror / Atom feed
From: Graeme Russ <graeme.russ@gmail.com>
To: grub-devel@gnu.org
Subject: Seeking permission to use GRUB derived code in GPLv2 software (U-Boot)
Date: Thu, 10 Feb 2011 22:35:09 +1100	[thread overview]
Message-ID: <4D53CD6D.7050808@gmail.com> (raw)

Hello,

I am the current maintainer of the x86 port of U-Boot
(http://www.denx.de/wiki/U-Boot/WebHome). I have done a lot of work getting
the x86 port up and running after a very long period of neglect and am now
getting stuck into some rather 'interesting' areas. One of which is the
Real/Protected mode switching.

I came across grub-core/kern/i386/realmode.S which has a really nice
Real/Protected mode switching code that fits my needs perfectly. Only
problem is, GRUB is GPLv3 and U-Boot is GPLv2 (most is GPLv2+). There are
plans to move U-Boot to GPLv3 so I have two options:

1) Wait on (and work towards) U-Boot becoming GPLv3
2) Humbly ask permission to use the core of the GRUB realmode.S

I've included the relevant code below - Is there anyone that can provide a
definitive directive as to whether or not I could include this code in U-Boot?

Thanks,

Graeme

/*
 * (C) Copyright 2010
 * Graeme Russ, graeme.russ@gmail.com
 *
 * (C) Copyright 2002
 * Daniel Engström, Omicron Ceti AB, daniel@omicron.se
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program 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 2 of
 * the License, or (at your option) any later version.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/*
 * The underlying concept for this code was taken from GRUB, the license
 * for which is included below
 */

/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007,2009,2010 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 <asm/processor.h>
#include <asm/processor-flags.h>

#define a32	addr32
#define d32	data32

#define DECLARE_REAL_MODE_INTERRUPT(x) \
	.globl rmirq_##x; \
	.hidden rmirq_##x; \
	.type rmirq_##x, @function; \
	.code16; \
	rmirq_##x:; \
	pushw	$##x; \
	jmp	rmirq_common_entry;

.section .realmode, "ax"

/*
 * Note: U-Boot is compiled with the options -mrtd and -mregparm=3.
 *       So the first three arguments are passed in %eax, %edx, and %ecx,
 *       respectively, and if a function has a fixed number of arguments
 *       and the number if greater than three, the function must return
 *       with "ret $N" where N is ((the number of arguments) - 3) * 4.
 */

/* force 4-byte alignment */
.p2align	2

/*
 *  These next two routines, "real_to_prot" and "prot_to_real" are structured
 *  in a very specific way.  Be very careful when changing them.
 *
 *  NOTE:  Use of either one messes up %eax and %ebp and changes %esp to
 *  point to the appropriate stack
 */

.globl real_to_prot
.hidden real_to_prot
.type real_to_prot, @function
real_to_prot:
	/* We are in Real Mode */
.code16
	cli

	/* fixup %ds in case it was modified */
	xorw	%ax, %ax
	movw	%ax, %ds

	/* restore the GDT register */
d32 a32	lgdt	saved_gdt

	/* set the PE bit of CR0 */
	movl	%cr0, %eax
	orl	$X86_CR0_PE, %eax
	movl	%eax, %cr0

	/* flush prefetch queue, reload %cs */
	movw	$pm_jmp_ptr, %ax
	movw	%ax, %bp
d32	ljmp	*(%bp)

/*
 * The 48-bit far pointer is here (in the middle of the code) to make it
 * easier to see what is going on
 */
pm_jmp_ptr:
	.long	protcseg
saved_cs:
	.word	0

protcseg:
	/* We are now in Protected Mode */
.code32

	/* restore the segment registers */
	movw	saved_ds, %ds
	movw	saved_es, %es
	movw	saved_fs, %fs
	movw	saved_gs, %gs
	movw	saved_ss, %ss

	/* save the return address */
	movl	(%esp), %ebp

	/* switch back to the protected mode stack */
	movl	saved_sp, %esp

	/* put the return address onto the protected mode stack */
	movl	%ebp, (%esp)

	/* zero %eax */
	xorl	%eax, %eax

	/* restore the IDT register */
	lidt	saved_idt

	sti

	/* return on the old (or initialized) stack! */
	ret

.globl prot_to_real
.hidden prot_to_real
.type prot_to_real, @function
prot_to_real:
	/* We are in Protected Mode */
.code32
	cli

	/* save the protected mode IDT and GDT pointers */
	sidt	saved_idt
	sgdt	saved_gdt

	/* save the segment registers */
	movw	%cs, saved_cs
	movw	%ds, saved_ds
	movw	%es, saved_es
	movw	%fs, saved_fs
	movw	%gs, saved_gs
	movw	%ss, saved_ss

	/* save the protected mode stack pointer */
	movl	%esp, saved_sp

	/* copy the return address to the real mode stack */
	movl	(%esp), %eax
	movl	%eax, real_mode_stack_top

	/* switch to the 16 bit protected mode code segment */
	ljmp	$(GDT_ENTRY_16BIT_CS * 8), $tmpcseg

tmpcseg:
	/* clear the PE bit of CR0 */
	movl	%cr0, %eax
	andl 	$(~X86_CR0_PE), %eax
	movl	%eax, %cr0

	/* flush prefetch queue, reload %cs */
	ljmp	$0, $realcseg

realcseg:
	/* we are now in Real Mode */
.code16

	/* load segment registers */
	xorw	%ax, %ax
	movw	%ax, %ds
	movw	%ax, %es
	movw	%ax, %fs
	movw	%ax, %gs
	movw	%ax, %ss

	/* switch to the real mode stack */
	movl	$real_mode_stack_top, %eax
	movl	%eax, %esp

	/* load the interrupt descriptor table */
	lidt	realmode_idt_ptr

	sti

	/* return on new stack! */
d32	ret

.section .realmode, "ax"
.globl rmirq_common_entry
.hidden rmirq_common_entry
.type rmirq_common_entry, @function
rmirq_common_entry:
	/* we are in Real Mode */
.code16
	cld
	pushw	%ss
	pushw	%gs
	pushw	%fs
	pushw	%es
	pushw	%ds
	pushl	%eax
	movl	%esp, %eax
	add	$40, %eax
	pushl	%eax
	pushl	%ebp
	pushl	%edi
	pushl	%esi
	pushl	%edx
	pushl	%ecx
	pushl	%ebx

	movl	%esp, %eax
d32	call	rmirq_llsr

	popl	%ebx
	popl	%ecx
	popl	%edx
	popl	%esi
	popl	%edi
	popl	%ebp
	popl	%eax
	popl	%eax
	popw	%ds
	popw	%es
	popw	%fs
	popw	%gs
	popw	%ss
	addl	$2, %esp
	iret
	DECLARE_REAL_MODE_INTERRUPT(0)
	DECLARE_REAL_MODE_INTERRUPT(1)
	DECLARE_REAL_MODE_INTERRUPT(2)
	DECLARE_REAL_MODE_INTERRUPT(3)
	DECLARE_REAL_MODE_INTERRUPT(4)
	DECLARE_REAL_MODE_INTERRUPT(5)
	DECLARE_REAL_MODE_INTERRUPT(6)
	DECLARE_REAL_MODE_INTERRUPT(7)
	DECLARE_REAL_MODE_INTERRUPT(8)
	DECLARE_REAL_MODE_INTERRUPT(9)
	DECLARE_REAL_MODE_INTERRUPT(10)
	DECLARE_REAL_MODE_INTERRUPT(11)
	DECLARE_REAL_MODE_INTERRUPT(12)
	DECLARE_REAL_MODE_INTERRUPT(13)
	DECLARE_REAL_MODE_INTERRUPT(14)
	DECLARE_REAL_MODE_INTERRUPT(15)
	DECLARE_REAL_MODE_INTERRUPT(16)
	DECLARE_REAL_MODE_INTERRUPT(17)
	DECLARE_REAL_MODE_INTERRUPT(18)
	DECLARE_REAL_MODE_INTERRUPT(19)
	DECLARE_REAL_MODE_INTERRUPT(20)
	DECLARE_REAL_MODE_INTERRUPT(21)
	DECLARE_REAL_MODE_INTERRUPT(22)
	DECLARE_REAL_MODE_INTERRUPT(23)
	DECLARE_REAL_MODE_INTERRUPT(24)
	DECLARE_REAL_MODE_INTERRUPT(25)
	DECLARE_REAL_MODE_INTERRUPT(26)
	DECLARE_REAL_MODE_INTERRUPT(27)
	DECLARE_REAL_MODE_INTERRUPT(28)
	DECLARE_REAL_MODE_INTERRUPT(29)
	DECLARE_REAL_MODE_INTERRUPT(30)
	DECLARE_REAL_MODE_INTERRUPT(31)
	DECLARE_REAL_MODE_INTERRUPT(32)
	DECLARE_REAL_MODE_INTERRUPT(33)
	DECLARE_REAL_MODE_INTERRUPT(34)
	DECLARE_REAL_MODE_INTERRUPT(35)
	DECLARE_REAL_MODE_INTERRUPT(36)
	DECLARE_REAL_MODE_INTERRUPT(37)
	DECLARE_REAL_MODE_INTERRUPT(38)
	DECLARE_REAL_MODE_INTERRUPT(39)
	DECLARE_REAL_MODE_INTERRUPT(40)
	DECLARE_REAL_MODE_INTERRUPT(41)
	DECLARE_REAL_MODE_INTERRUPT(42)
	DECLARE_REAL_MODE_INTERRUPT(43)
	DECLARE_REAL_MODE_INTERRUPT(44)
	DECLARE_REAL_MODE_INTERRUPT(45)
	DECLARE_REAL_MODE_INTERRUPT(46)
	DECLARE_REAL_MODE_INTERRUPT(47)
	DECLARE_REAL_MODE_INTERRUPT(48)
	DECLARE_REAL_MODE_INTERRUPT(49)
	DECLARE_REAL_MODE_INTERRUPT(50)
	DECLARE_REAL_MODE_INTERRUPT(51)
	DECLARE_REAL_MODE_INTERRUPT(52)
	DECLARE_REAL_MODE_INTERRUPT(53)
	DECLARE_REAL_MODE_INTERRUPT(54)
	DECLARE_REAL_MODE_INTERRUPT(55)
	DECLARE_REAL_MODE_INTERRUPT(56)
	DECLARE_REAL_MODE_INTERRUPT(57)
	DECLARE_REAL_MODE_INTERRUPT(58)
	DECLARE_REAL_MODE_INTERRUPT(59)
	DECLARE_REAL_MODE_INTERRUPT(60)
	DECLARE_REAL_MODE_INTERRUPT(61)
	DECLARE_REAL_MODE_INTERRUPT(62)
	DECLARE_REAL_MODE_INTERRUPT(63)
	DECLARE_REAL_MODE_INTERRUPT(64)
	DECLARE_REAL_MODE_INTERRUPT(65)
	DECLARE_REAL_MODE_INTERRUPT(66)
	DECLARE_REAL_MODE_INTERRUPT(67)
	DECLARE_REAL_MODE_INTERRUPT(68)
	DECLARE_REAL_MODE_INTERRUPT(69)
	DECLARE_REAL_MODE_INTERRUPT(70)
	DECLARE_REAL_MODE_INTERRUPT(71)
	DECLARE_REAL_MODE_INTERRUPT(72)
	DECLARE_REAL_MODE_INTERRUPT(73)
	DECLARE_REAL_MODE_INTERRUPT(74)
	DECLARE_REAL_MODE_INTERRUPT(75)
	DECLARE_REAL_MODE_INTERRUPT(76)
	DECLARE_REAL_MODE_INTERRUPT(77)
	DECLARE_REAL_MODE_INTERRUPT(78)
	DECLARE_REAL_MODE_INTERRUPT(79)
	DECLARE_REAL_MODE_INTERRUPT(80)
	DECLARE_REAL_MODE_INTERRUPT(81)
	DECLARE_REAL_MODE_INTERRUPT(82)
	DECLARE_REAL_MODE_INTERRUPT(83)
	DECLARE_REAL_MODE_INTERRUPT(84)
	DECLARE_REAL_MODE_INTERRUPT(85)
	DECLARE_REAL_MODE_INTERRUPT(86)
	DECLARE_REAL_MODE_INTERRUPT(87)
	DECLARE_REAL_MODE_INTERRUPT(88)
	DECLARE_REAL_MODE_INTERRUPT(89)
	DECLARE_REAL_MODE_INTERRUPT(90)
	DECLARE_REAL_MODE_INTERRUPT(91)
	DECLARE_REAL_MODE_INTERRUPT(92)
	DECLARE_REAL_MODE_INTERRUPT(93)
	DECLARE_REAL_MODE_INTERRUPT(94)
	DECLARE_REAL_MODE_INTERRUPT(95)
	DECLARE_REAL_MODE_INTERRUPT(96)
	DECLARE_REAL_MODE_INTERRUPT(97)
	DECLARE_REAL_MODE_INTERRUPT(98)
	DECLARE_REAL_MODE_INTERRUPT(99)
	DECLARE_REAL_MODE_INTERRUPT(100)
	DECLARE_REAL_MODE_INTERRUPT(101)
	DECLARE_REAL_MODE_INTERRUPT(102)
	DECLARE_REAL_MODE_INTERRUPT(103)
	DECLARE_REAL_MODE_INTERRUPT(104)
	DECLARE_REAL_MODE_INTERRUPT(105)
	DECLARE_REAL_MODE_INTERRUPT(106)
	DECLARE_REAL_MODE_INTERRUPT(107)
	DECLARE_REAL_MODE_INTERRUPT(108)
	DECLARE_REAL_MODE_INTERRUPT(109)
	DECLARE_REAL_MODE_INTERRUPT(110)
	DECLARE_REAL_MODE_INTERRUPT(111)
	DECLARE_REAL_MODE_INTERRUPT(112)
	DECLARE_REAL_MODE_INTERRUPT(113)
	DECLARE_REAL_MODE_INTERRUPT(114)
	DECLARE_REAL_MODE_INTERRUPT(115)
	DECLARE_REAL_MODE_INTERRUPT(116)
	DECLARE_REAL_MODE_INTERRUPT(117)
	DECLARE_REAL_MODE_INTERRUPT(118)
	DECLARE_REAL_MODE_INTERRUPT(119)
	DECLARE_REAL_MODE_INTERRUPT(121)
	DECLARE_REAL_MODE_INTERRUPT(122)
	DECLARE_REAL_MODE_INTERRUPT(123)
	DECLARE_REAL_MODE_INTERRUPT(124)
	DECLARE_REAL_MODE_INTERRUPT(125)
	DECLARE_REAL_MODE_INTERRUPT(126)
	DECLARE_REAL_MODE_INTERRUPT(127)
	DECLARE_REAL_MODE_INTERRUPT(128)
	DECLARE_REAL_MODE_INTERRUPT(129)
	DECLARE_REAL_MODE_INTERRUPT(130)
	DECLARE_REAL_MODE_INTERRUPT(131)
	DECLARE_REAL_MODE_INTERRUPT(132)
	DECLARE_REAL_MODE_INTERRUPT(133)
	DECLARE_REAL_MODE_INTERRUPT(134)
	DECLARE_REAL_MODE_INTERRUPT(135)
	DECLARE_REAL_MODE_INTERRUPT(136)
	DECLARE_REAL_MODE_INTERRUPT(137)
	DECLARE_REAL_MODE_INTERRUPT(138)
	DECLARE_REAL_MODE_INTERRUPT(139)
	DECLARE_REAL_MODE_INTERRUPT(140)
	DECLARE_REAL_MODE_INTERRUPT(141)
	DECLARE_REAL_MODE_INTERRUPT(142)
	DECLARE_REAL_MODE_INTERRUPT(143)
	DECLARE_REAL_MODE_INTERRUPT(144)
	DECLARE_REAL_MODE_INTERRUPT(145)
	DECLARE_REAL_MODE_INTERRUPT(146)
	DECLARE_REAL_MODE_INTERRUPT(147)
	DECLARE_REAL_MODE_INTERRUPT(148)
	DECLARE_REAL_MODE_INTERRUPT(149)
	DECLARE_REAL_MODE_INTERRUPT(150)
	DECLARE_REAL_MODE_INTERRUPT(151)
	DECLARE_REAL_MODE_INTERRUPT(152)
	DECLARE_REAL_MODE_INTERRUPT(153)
	DECLARE_REAL_MODE_INTERRUPT(154)
	DECLARE_REAL_MODE_INTERRUPT(155)
	DECLARE_REAL_MODE_INTERRUPT(156)
	DECLARE_REAL_MODE_INTERRUPT(157)
	DECLARE_REAL_MODE_INTERRUPT(158)
	DECLARE_REAL_MODE_INTERRUPT(159)
	DECLARE_REAL_MODE_INTERRUPT(160)
	DECLARE_REAL_MODE_INTERRUPT(161)
	DECLARE_REAL_MODE_INTERRUPT(162)
	DECLARE_REAL_MODE_INTERRUPT(163)
	DECLARE_REAL_MODE_INTERRUPT(164)
	DECLARE_REAL_MODE_INTERRUPT(165)
	DECLARE_REAL_MODE_INTERRUPT(166)
	DECLARE_REAL_MODE_INTERRUPT(167)
	DECLARE_REAL_MODE_INTERRUPT(168)
	DECLARE_REAL_MODE_INTERRUPT(169)
	DECLARE_REAL_MODE_INTERRUPT(170)
	DECLARE_REAL_MODE_INTERRUPT(171)
	DECLARE_REAL_MODE_INTERRUPT(172)
	DECLARE_REAL_MODE_INTERRUPT(173)
	DECLARE_REAL_MODE_INTERRUPT(174)
	DECLARE_REAL_MODE_INTERRUPT(175)
	DECLARE_REAL_MODE_INTERRUPT(176)
	DECLARE_REAL_MODE_INTERRUPT(177)
	DECLARE_REAL_MODE_INTERRUPT(178)
	DECLARE_REAL_MODE_INTERRUPT(179)
	DECLARE_REAL_MODE_INTERRUPT(180)
	DECLARE_REAL_MODE_INTERRUPT(181)
	DECLARE_REAL_MODE_INTERRUPT(182)
	DECLARE_REAL_MODE_INTERRUPT(183)
	DECLARE_REAL_MODE_INTERRUPT(184)
	DECLARE_REAL_MODE_INTERRUPT(185)
	DECLARE_REAL_MODE_INTERRUPT(186)
	DECLARE_REAL_MODE_INTERRUPT(187)
	DECLARE_REAL_MODE_INTERRUPT(188)
	DECLARE_REAL_MODE_INTERRUPT(189)
	DECLARE_REAL_MODE_INTERRUPT(190)
	DECLARE_REAL_MODE_INTERRUPT(191)
	DECLARE_REAL_MODE_INTERRUPT(192)
	DECLARE_REAL_MODE_INTERRUPT(193)
	DECLARE_REAL_MODE_INTERRUPT(194)
	DECLARE_REAL_MODE_INTERRUPT(195)
	DECLARE_REAL_MODE_INTERRUPT(196)
	DECLARE_REAL_MODE_INTERRUPT(197)
	DECLARE_REAL_MODE_INTERRUPT(198)
	DECLARE_REAL_MODE_INTERRUPT(199)
	DECLARE_REAL_MODE_INTERRUPT(200)
	DECLARE_REAL_MODE_INTERRUPT(201)
	DECLARE_REAL_MODE_INTERRUPT(202)
	DECLARE_REAL_MODE_INTERRUPT(203)
	DECLARE_REAL_MODE_INTERRUPT(204)
	DECLARE_REAL_MODE_INTERRUPT(205)
	DECLARE_REAL_MODE_INTERRUPT(206)
	DECLARE_REAL_MODE_INTERRUPT(207)
	DECLARE_REAL_MODE_INTERRUPT(208)
	DECLARE_REAL_MODE_INTERRUPT(209)
	DECLARE_REAL_MODE_INTERRUPT(210)
	DECLARE_REAL_MODE_INTERRUPT(211)
	DECLARE_REAL_MODE_INTERRUPT(212)
	DECLARE_REAL_MODE_INTERRUPT(213)
	DECLARE_REAL_MODE_INTERRUPT(214)
	DECLARE_REAL_MODE_INTERRUPT(215)
	DECLARE_REAL_MODE_INTERRUPT(216)
	DECLARE_REAL_MODE_INTERRUPT(217)
	DECLARE_REAL_MODE_INTERRUPT(218)
	DECLARE_REAL_MODE_INTERRUPT(219)
	DECLARE_REAL_MODE_INTERRUPT(221)
	DECLARE_REAL_MODE_INTERRUPT(222)
	DECLARE_REAL_MODE_INTERRUPT(223)
	DECLARE_REAL_MODE_INTERRUPT(224)
	DECLARE_REAL_MODE_INTERRUPT(225)
	DECLARE_REAL_MODE_INTERRUPT(226)
	DECLARE_REAL_MODE_INTERRUPT(227)
	DECLARE_REAL_MODE_INTERRUPT(228)
	DECLARE_REAL_MODE_INTERRUPT(229)
	DECLARE_REAL_MODE_INTERRUPT(230)
	DECLARE_REAL_MODE_INTERRUPT(231)
	DECLARE_REAL_MODE_INTERRUPT(232)
	DECLARE_REAL_MODE_INTERRUPT(233)
	DECLARE_REAL_MODE_INTERRUPT(234)
	DECLARE_REAL_MODE_INTERRUPT(235)
	DECLARE_REAL_MODE_INTERRUPT(236)
	DECLARE_REAL_MODE_INTERRUPT(237)
	DECLARE_REAL_MODE_INTERRUPT(238)
	DECLARE_REAL_MODE_INTERRUPT(239)
	DECLARE_REAL_MODE_INTERRUPT(240)
	DECLARE_REAL_MODE_INTERRUPT(241)
	DECLARE_REAL_MODE_INTERRUPT(242)
	DECLARE_REAL_MODE_INTERRUPT(243)
	DECLARE_REAL_MODE_INTERRUPT(244)
	DECLARE_REAL_MODE_INTERRUPT(245)
	DECLARE_REAL_MODE_INTERRUPT(246)
	DECLARE_REAL_MODE_INTERRUPT(247)
	DECLARE_REAL_MODE_INTERRUPT(248)
	DECLARE_REAL_MODE_INTERRUPT(249)
	DECLARE_REAL_MODE_INTERRUPT(250)
	DECLARE_REAL_MODE_INTERRUPT(251)
	DECLARE_REAL_MODE_INTERRUPT(252)
	DECLARE_REAL_MODE_INTERRUPT(253)
	DECLARE_REAL_MODE_INTERRUPT(254)
	DECLARE_REAL_MODE_INTERRUPT(255)
.globl rmirq_def
.hidden rmirq_def
.type rmirq_def, @function
rmirq_def:
	pushw	$0xffff
	jmp	rmirq_common_entry

.code32

realmode_idt_ptr:
	.word	0x0400		/* limit */
	.long	0x00000000	/* base */

saved_gdt:
	.word	0x0000		/* limit */
	.long	0x00000000	/* base */

saved_idt:
	.word	0x0000		/* limit */
	.long	0x00000000	/* base */

saved_sp:
	.long	0

saved_ds:
	.long	0

saved_es:
	.long	0

saved_fs:
	.long	0

saved_gs:
	.long	0

saved_ss:
	.long	0


real_mode_stack_bottom:
	.org	(. + 0x1000)
real_mode_stack_top:
	.long	0



             reply	other threads:[~2011-02-10 11:35 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-10 11:35 Graeme Russ [this message]
2011-02-10 21:46 ` Seeking permission to use GRUB derived code in GPLv2 software (U-Boot) Vladimir 'φ-coder/phcoder' Serbinenko
2011-02-10 22:24   ` Graeme Russ

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D53CD6D.7050808@gmail.com \
    --to=graeme.russ@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.