hc
2024-03-22 f63cd4c03ea42695d5f9b0e1798edd196923aae6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Free Software" and "Free Software Needs
Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
and with the Back-Cover Texts as in (a) below.
 
(a) The FSF's Back-Cover Text is: "You are free to copy and modify
this GNU Manual.  Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom." -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Debugging with GDB: Memory Ports in Guile</title>
 
<meta name="description" content="Debugging with GDB: Memory Ports in Guile">
<meta name="keywords" content="Debugging with GDB: Memory Ports in Guile">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Guile-API.html#Guile-API" rel="up" title="Guile API">
<link href="Iterators-In-Guile.html#Iterators-In-Guile" rel="next" title="Iterators In Guile">
<link href="I_002fO-Ports-in-Guile.html#I_002fO-Ports-in-Guile" rel="previous" title="I/O Ports in Guile">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Memory-Ports-in-Guile"></a>
<div class="header">
<p>
Next: <a href="Iterators-In-Guile.html#Iterators-In-Guile" accesskey="n" rel="next">Iterators In Guile</a>, Previous: <a href="I_002fO-Ports-in-Guile.html#I_002fO-Ports-in-Guile" accesskey="p" rel="previous">I/O Ports in Guile</a>, Up: <a href="Guile-API.html#Guile-API" accesskey="u" rel="up">Guile API</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Memory-Ports-in-Guile-1"></a>
<h4 class="subsubsection">23.3.3.24 Memory Ports in Guile</h4>
 
<p><small>GDB</small> provides a <code>port</code> interface to target memory.
This allows Guile code to read/write target memory using Guile&rsquo;s port and
bytevector functionality.  The main routine is <code>open-memory</code> which
returns a port object.  One can then read/write memory using that object.
</p>
<dl>
<dt><a name="index-open_002dmemory"></a>Scheme Procedure: <strong>open-memory</strong> <em><span class="roman">[</span>#:mode mode] <span class="roman">[</span>#:start address] <span class="roman">[</span>#:size size]</em></dt>
<dd><p>Return a port object that can be used for reading and writing memory.
The port will be open according to <var>mode</var>, which is the standard
mode argument to Guile port open routines, except that the &lsquo;<samp>&quot;a&quot;</samp>&rsquo;
and &lsquo;<samp>&quot;l&quot;</samp>&rsquo; modes are not supported.
See <a href="http://www.gnu.org/software/guile/manual/html_node/File-Ports.html#File-Ports">File Ports</a> in <cite>GNU Guile Reference Manual</cite>.
The &lsquo;<samp>&quot;b&quot;</samp>&rsquo; (binary) character may be present, but is ignored:
memory ports are binary only.  If &lsquo;<samp>&quot;0&quot;</samp>&rsquo; is appended then
the port is marked as unbuffered.
The default is &lsquo;<samp>&quot;r&quot;</samp>&rsquo;, read-only and buffered.
</p>
<p>The chunk of memory that can be accessed can be bounded.
If both <var>start</var> and <var>size</var> are unspecified, all of memory can be
accessed.  If only <var>start</var> is specified, all of memory from that point
on can be accessed.  If only <var>size</var> if specified, all memory in the
range [0,<var>size</var>) can be accessed.  If both are specified, all memory
in the rane [<var>start</var>,<var>start</var>+<var>size</var>) can be accessed.
</p></dd></dl>
 
<dl>
<dt><a name="index-memory_002dport_003f"></a>Scheme Procedure: <strong>memory-port?</strong></dt>
<dd><p>Return <code>#t</code> if <var>object</var> is an object of type <code>&lt;gdb:memory-port&gt;</code>.
Otherwise return <code>#f</code>.
</p></dd></dl>
 
<dl>
<dt><a name="index-memory_002dport_002drange"></a>Scheme Procedure: <strong>memory-port-range</strong> <em>memory-port</em></dt>
<dd><p>Return the range of <code>&lt;gdb:memory-port&gt;</code> <var>memory-port</var> as a list
of two elements: <code>(start end)</code>.  The range is <var>start</var> to <var>end</var>
inclusive.
</p></dd></dl>
 
<dl>
<dt><a name="index-memory_002dport_002dread_002dbuffer_002dsize"></a>Scheme Procedure: <strong>memory-port-read-buffer-size</strong> <em>memory-port</em></dt>
<dd><p>Return the size of the read buffer of <code>&lt;gdb:memory-port&gt;</code>
<var>memory-port</var>.
</p>
<p>This procedure is deprecated and will be removed in <small>GDB</small> 11.
It returns 0 when using Guile 2.2 or later.
</p></dd></dl>
 
<dl>
<dt><a name="index-set_002dmemory_002dport_002dread_002dbuffer_002dsize_0021"></a>Scheme Procedure: <strong>set-memory-port-read-buffer-size!</strong> <em>memory-port size</em></dt>
<dd><p>Set the size of the read buffer of <code>&lt;gdb:memory-port&gt;</code>
<var>memory-port</var> to <var>size</var>.  The result is unspecified.
</p>
<p>This procedure is deprecated and will be removed in <small>GDB</small> 11.
When <small>GDB</small> is built with Guile 2.2 or later, you can call
<code>setvbuf</code> instead (see <a href="http://www.gnu.org/software/guile/manual/html_node/Buffering.html#Buffering"><code>setvbuf</code></a> in <cite>GNU
Guile Reference Manual</cite>).
</p></dd></dl>
 
<dl>
<dt><a name="index-memory_002dport_002dwrite_002dbuffer_002dsize"></a>Scheme Procedure: <strong>memory-port-write-buffer-size</strong> <em>memory-port</em></dt>
<dd><p>Return the size of the write buffer of <code>&lt;gdb:memory-port&gt;</code>
<var>memory-port</var>.
</p>
<p>This procedure is deprecated and will be removed in <small>GDB</small> 11.
It returns 0 when <small>GDB</small> is built with Guile 2.2 or later.
</p></dd></dl>
 
<dl>
<dt><a name="index-set_002dmemory_002dport_002dwrite_002dbuffer_002dsize_0021"></a>Scheme Procedure: <strong>set-memory-port-write-buffer-size!</strong> <em>memory-port size</em></dt>
<dd><p>Set the size of the write buffer of <code>&lt;gdb:memory-port&gt;</code>
<var>memory-port</var> to <var>size</var>.  The result is unspecified.
</p>
<p>This procedure is deprecated and will be removed in <small>GDB</small> 11.
When <small>GDB</small> is built with Guile 2.2 or later, you can call
<code>setvbuf</code> instead.
</p></dd></dl>
 
<p>A memory port is closed like any other port, with <code>close-port</code>.
</p>
<p>Combined with Guile&rsquo;s <code>bytevectors</code>, memory ports provide a lot
of utility.  For example, to fill a buffer of 10 integers in memory,
one can do something like the following.
</p>
<div class="smallexample">
<pre class="smallexample">;; In the program: int buffer[10];
(use-modules (rnrs bytevectors))
(use-modules (rnrs io ports))
(define addr (parse-and-eval &quot;buffer&quot;))
(define n 10)
(define byte-size (* n 4))
(define mem-port (open-memory #:mode &quot;r+&quot; #:start
                              (value-&gt;integer addr) #:size byte-size))
(define byte-vec (make-bytevector byte-size))
(do ((i 0 (+ i 1)))
    ((&gt;= i n))
    (bytevector-s32-native-set! byte-vec (* i 4) (* i 42)))
(put-bytevector mem-port byte-vec)
(close-port mem-port)
</pre></div>
 
<hr>
<div class="header">
<p>
Next: <a href="Iterators-In-Guile.html#Iterators-In-Guile" accesskey="n" rel="next">Iterators In Guile</a>, Previous: <a href="I_002fO-Ports-in-Guile.html#I_002fO-Ports-in-Guile" accesskey="p" rel="previous">I/O Ports in Guile</a>, Up: <a href="Guile-API.html#Guile-API" accesskey="u" rel="up">Guile API</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>