root/dos/getsetsl.c

Revision f6d4a4415928ffca69eb0c498af777d74f4fc303, 2.3 KB (checked in by H. Peter Anvin <hpa@…>, 22 months ago)

dos: add memcpy_from_sl() and use it where appropriate

Add memcpy_from_sl() and use it to handle pointers into the payload
section.

Signed-off-by: H. Peter Anvin <hpa@…>

  • Property mode set to 100644
Line 
1/*
2 * Special handling for the MS-DOS derivative: syslinux_ldlinux
3 * is a "far" object...
4 */
5
6#define _XOPEN_SOURCE 500       /* Required on glibc 2.x */
7#define _BSD_SOURCE
8#include <inttypes.h>
9#include <string.h>
10#include <stddef.h>
11#include <stdlib.h>
12
13#include "syslxint.h"
14
15#define __noinline __attribute__((noinline))
16
17#if 0                           /* unused */
18uint8_t get_8_sl(const uint8_t * p)
19{
20    uint8_t v;
21
22    p = set_fs(p);
23    asm volatile("movb %%fs:%1,%0":"=q" (v):"m"(*p));
24    return v;
25}
26#endif
27
28uint16_t get_16_sl(const uint16_t * p)
29{
30    uint16_t v;
31
32    p = set_fs(p);
33    asm volatile("movw %%fs:%1,%0":"=r" (v):"m"(*p));
34    return v;
35}
36
37uint32_t get_32_sl(const uint32_t * p)
38{
39    uint32_t v;
40
41    p = set_fs(p);
42    asm volatile("movl %%fs:%1,%0":"=r" (v):"m"(*p));
43    return v;
44}
45
46#if 0                           /* unused */
47uint64_t get_64_sl(const uint64_t * p)
48{
49    uint32_t v0, v1;
50    const uint32_t *pp = (const uint32_t *)set_fs(p);
51
52    asm volatile("movl %%fs:%1,%0" : "=r" (v0) : "m" (pp[0]));
53    asm volatile("movl %%fs:%1,%0" : "=r" (v1) : "m" (pp[1]));
54    return v0 + ((uint64_t)v1 << 32);
55}
56#endif
57
58#if 0                           /* unused */
59void set_8_sl(uint8_t * p, uint8_t v)
60{
61    p = set_fs(p);
62    asm volatile("movb %1,%%fs:%0":"=m" (*p):"qi"(v));
63}
64#endif
65
66void set_16_sl(uint16_t * p, uint16_t v)
67{
68    p = set_fs(p);
69    asm volatile("movw %1,%%fs:%0":"=m" (*p):"ri"(v));
70}
71
72void set_32_sl(uint32_t * p, uint32_t v)
73{
74    p = set_fs(p);
75    asm volatile("movl %1,%%fs:%0":"=m" (*p):"ri"(v));
76}
77
78void set_64_sl(uint64_t * p, uint64_t v)
79{
80    uint32_t *pp = (uint32_t *)set_fs(p);
81    asm volatile("movl %1,%%fs:%0" : "=m" (pp[0]) : "ri"((uint32_t)v));
82    asm volatile("movl %1,%%fs:%0" : "=m" (pp[1]) : "ri"((uint32_t)(v >> 32)));
83}
84
85void memcpy_to_sl(void *dst, const void *src, size_t len)
86{
87    uint16_t seg;
88    uint16_t off;
89
90    seg = ds() + ((size_t)dst >> 4);
91    off = (size_t)dst & 15;
92
93    asm volatile("pushw %%es ; "
94                 "movw %3,%%es ; "
95                 "rep ; movsb ; "
96                 "popw %%es"
97                 : "+D" (off), "+S" (src), "+c" (len)
98                 : "r" (seg)
99                 : "memory");
100}
101
102void memcpy_from_sl(void *dst, const void *src, size_t len)
103{
104    uint16_t seg;
105    uint16_t off;
106
107    seg = ds() + ((size_t)src >> 4);
108    off = (size_t)src & 15;
109
110    asm volatile("pushw %%ds ; "
111                 "movw %3,%%ds ; "
112                 "rep ; movsb ; "
113                 "popw %%ds"
114                 : "+D" (dst), "+S" (off), "+c" (len)
115                 : "r" (seg)
116                 : "memory");
117}
Note: See TracBrowser for help on using the browser.