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
next 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.