diff options
author | H. Peter Anvin <hpa@zytor.com> | 2006-08-08 18:04:08 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2006-08-08 18:04:08 -0700 |
commit | 104dd7b80670b7180cd1ea84f5f9832e92bbcf54 (patch) | |
tree | 4a8110617d72ea452152b725ccaf6b25597c405d | |
parent | 6ba768c1bcbe64b32a610919ce7de5f1b14f5e9e (diff) | |
download | syslinux-104dd7b80670b7180cd1ea84f5f9832e92bbcf54.tar.gz |
DOS installer: make sure we tell gcc what the memory constraints aresyslinux-3.20-pre11
-rw-r--r-- | dos/syslinux.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/dos/syslinux.c b/dos/syslinux.c index bd76518e..f3b08367 100644 --- a/dos/syslinux.c +++ b/dos/syslinux.c @@ -1,4 +1,3 @@ -#ident "$Id$" /* ----------------------------------------------------------------------- * * * Copyright 1998-2004 H. Peter Anvin - All Rights Reserved @@ -111,6 +110,14 @@ ssize_t write_file(int fd, const void *buf, size_t count) return done; } +static inline __attribute__((const)) uint16_t data_segment(void) +{ + uint16_t ds; + + asm("movw %%ds,%0" : "=rm" (ds)); + return ds; +} + struct diskio { uint32_t startsector; uint16_t sectors; @@ -123,15 +130,15 @@ void write_device(int drive, const void *buf, size_t nsecs, unsigned int sector) struct diskio dio; dprintf("write_device(%d,%p,%u,%u)\n", drive, buf, nsecs, sector); - + dio.startsector = sector; dio.sectors = nsecs; dio.bufoffs = (uintptr_t)buf; - asm("movw %%ds,%0" : "=m" (dio.bufseg)); + dio.bufseg = data_segment(); asm volatile("int $0x26 ; setc %0 ; popfw" : "=abcdm" (err) - : "a" (drive-1), "b" (&dio), "c" (-1), "d" (buf)); + : "a" (drive-1), "b" (&dio), "c" (-1), "d" (buf), "m" (dio)); if ( err ) die("sector write error"); @@ -147,11 +154,11 @@ void read_device(int drive, const void *buf, size_t nsecs, unsigned int sector) dio.startsector = sector; dio.sectors = nsecs; dio.bufoffs = (uintptr_t)buf; - asm("movw %%ds,%0" : "=m" (dio.bufseg)); + dio.bufseg = data_segment(); asm volatile("int $0x25 ; setc %0 ; popfw" : "=abcdm" (err) - : "a" (drive-1), "b" (&dio), "c" (-1), "d" (buf)); + : "a" (drive-1), "b" (&dio), "c" (-1), "d" (buf), "m" (dio)); if ( err ) die("sector read error"); @@ -190,7 +197,7 @@ uint32_t get_partition_offset(int drive) rv = 0x440d; asm volatile("int $0x21 ; setc %0" - : "=abcdm" (err), "+a" (rv) + : "=abcdm" (err), "+a" (rv), "=m" (dp) : "b" (drive), "c" (0x0860), "d" (&dp)); if ( !err ) @@ -198,7 +205,7 @@ uint32_t get_partition_offset(int drive) rv = 0x440d; asm volatile("int $0x21 ; setc %0" - : "=abcdm" (err), "+a" (rv) + : "=abcdm" (err), "+a" (rv), "=m" (dp) : "b" (drive), "c" (0x4860), "d" (&dp)); if ( !err ) @@ -235,12 +242,12 @@ void write_mbr(int drive, const void *buf) dprintf("write_mbr(%d,%p)\n", drive, buf); mbr.bufferoffset = (uintptr_t)buf; - asm("movw %%ds,%0" : "=m" (mbr.bufferseg)); + mbr.bufferseg = data_segment(); rv = 0x440d; asm volatile("int $0x21 ; setc %0" : "=abcdm" (err), "+a" (rv) - : "c" (0x0841), "d" (&mbr), "b" (drive)); + : "c" (0x0841), "d" (&mbr), "b" (drive), "m" (mbr)); if ( !err ) return; @@ -248,7 +255,7 @@ void write_mbr(int drive, const void *buf) rv = 0x440d; asm volatile("int $0x21 ; setc %0" : "=abcdm" (err), "+a" (rv) - : "c" (0x4841), "d" (&mbr), "b" (drive)); + : "c" (0x4841), "d" (&mbr), "b" (drive), "m" (mbr)); if ( err ) die("mbr write error"); @@ -262,12 +269,12 @@ void read_mbr(int drive, const void *buf) dprintf("read_mbr(%d,%p)\n", drive, buf); mbr.bufferoffset = (uintptr_t)buf; - asm("movw %%ds,%0" : "=m" (mbr.bufferseg)); + mbr.bufferseg = data_segment(); rv = 0x440d; asm volatile("int $0x21 ; setc %0" : "=abcdm" (err), "+a" (rv) - : "c" (0x0861), "d" (&mbr), "b" (drive)); + : "c" (0x0861), "d" (&mbr), "b" (drive), "m" (mbr)); if ( !err ) return; @@ -275,7 +282,7 @@ void read_mbr(int drive, const void *buf) rv = 0x440d; asm volatile("int $0x21 ; setc %0" : "=abcdm" (err), "+a" (rv) - : "c" (0x4861), "d" (&mbr), "b" (drive)); + : "c" (0x4861), "d" (&mbr), "b" (drive), "m" (mbr)); if ( err ) die("mbr read error"); |