grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Seeking permission to use GRUB derived code in GPLv2 software (U-Boot)


From: Graeme Russ
Subject: Seeking permission to use GRUB derived code in GPLv2 software (U-Boot)
Date: Thu, 10 Feb 2011 22:35:09 +1100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6

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, address@hidden
 *
 * (C) Copyright 2002
 * Daniel Engström, Omicron Ceti AB, address@hidden
 *
 * 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 via email to

[Prev in Thread] Current Thread [Next in Thread]