From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1PnUo2-0000lX-6z for mharc-grub-devel@gnu.org; Thu, 10 Feb 2011 06:35:26 -0500 Received: from [140.186.70.92] (port=57164 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PnUnz-0000kY-CN for grub-devel@gnu.org; Thu, 10 Feb 2011 06:35:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PnUns-00008y-4u for grub-devel@gnu.org; Thu, 10 Feb 2011 06:35:18 -0500 Received: from mail-iw0-f169.google.com ([209.85.214.169]:59023) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PnUnr-00008s-T6 for grub-devel@gnu.org; Thu, 10 Feb 2011 06:35:16 -0500 Received: by iwc10 with SMTP id 10so1303071iwc.0 for ; Thu, 10 Feb 2011 03:35:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:message-id:date:from:user-agent:mime-version:to :subject:content-type:content-transfer-encoding; bh=BBCi7h23dAiTEdMMydXy2nTS5Gk42PQ2L2mrPgzfCaw=; b=Lz2o22KwRXNL3VPri+pc4jm3htRY1CXVgLjOOV0VW4fvL/wgLWFxsHR8EGLAHLppnc lkBuZLDaLW70xeJiUm4y9ylWQ+3ZJdRt+t2U6UgoB3GMNtkXXulnuBr2vbEzSCKAqUng jA0Flrj/Irkrb+zFExIKtaG6YTUk8W8Vbdr9Q= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; b=AHJWKqQyM+QmGiFcweeuA4EtfGQHF8ZhBWVPQlR/3noBDBhQTlaLekh77rqxsrO+R3 stHIPPgFzdh+R3bndQRy7255oR8fBfDKs0X+Bzo16TV9B2rUqbSVqkqA9rSCPUaKW7D9 TH73x8REveN6w+OEzwnQSUlkWsx6C4lVXQNFE= Received: by 10.231.12.139 with SMTP id x11mr1162958ibx.149.1297337713270; Thu, 10 Feb 2011 03:35:13 -0800 (PST) Received: from [10.1.1.12] (d122-104-32-209.sbr6.nsw.optusnet.com.au [122.104.32.209]) by mx.google.com with ESMTPS id u9sm1165362ibe.2.2011.02.10.03.35.10 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 10 Feb 2011 03:35:12 -0800 (PST) Message-ID: <4D53CD6D.7050808@gmail.com> Date: Thu, 10 Feb 2011 22:35:09 +1100 From: Graeme Russ User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: grub-devel@gnu.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.214.169 Subject: Seeking permission to use GRUB derived code in GPLv2 software (U-Boot) X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Feb 2011 11:35:25 -0000 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 . */ #include #include #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