Robert Jordens | 17 Aug 22:56 2014
Picon

[M-Labs devel] [PATCH 1/5] vivado: make tcl a list of commands, add reporting

---
 mibuild/xilinx_vivado.py | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/mibuild/xilinx_vivado.py b/mibuild/xilinx_vivado.py
index 83dd4ed..9cb192f 100644
--- a/mibuild/xilinx_vivado.py
+++ b/mibuild/xilinx_vivado.py
 <at>  <at>  -42,19 +42,26  <at>  <at>  def _build_xdc(named_sc, named_pc):
 	return r

 def _build_files(device, sources, vincpaths, build_name):
-	tcl_contents = ""
+	tcl = []
 	for filename, language in sources:
-		tcl_contents += "add_files " + filename.replace("\\", "/") + "\n"
+		tcl.append("add_files " + filename.replace("\\", "/"))

-	tcl_contents += "read_xdc %s.xdc\n" %build_name
-	tcl_contents += "synth_design -top top -part %s -include_dirs {%s}\n" %(device, " ".join(vincpaths))
-	tcl_contents += "place_design\n"
-	tcl_contents += "route_design\n"
-	tcl_contents += "report_timing_summary -file %s_timing.rpt\n" %(build_name)
-	tcl_contents += "report_utilization -file %s_utilization.rpt\n" %(build_name)
-	tcl_contents += "write_bitstream -force %s.bit \n" %build_name
-	tcl_contents += "quit\n"	
-	tools.write_to_file(build_name + ".tcl", tcl_contents)
+	tcl.append("read_xdc %s.xdc" %build_name)
+	tcl.append("synth_design -top top -part %s -include_dirs {%s}" %(device, " ".join(vincpaths)))
+	tcl.append("report_utilization -file %s_utilization_synth.rpt" %(build_name))
(Continue reading)

Yann Sionneau | 31 Jul 00:34 2014
Picon

[M-Labs devel] [PATCH] Add support for high speed UART

Hello, 

This patch adds support for higher baudrates on MiSoC UART, the following have been tested:

9600, 115200, 3 Mbps, 3.5 Mbps and 4 Mbps have been tested on M1 board
9600, 115200 and 3 Mbps have been tested on Papilio-pro board

Description of changes:

- Using phase accumulator to generate desired frequency
- The generated frequency is not baudrate*16 anymore but just baudrate
- Each RX and TX have their own phase accumulator because they need to be able to send and receive at the same
time and their reset value is different
- RX start bit detection is now faster, at system clock speed instead of baudrate*16 speed, this allows to be
more accurate
- RX phase accumulator only starts incrementing once the falling edge of the start bit is detected. The
initial value of this accumulator is half the value necessary to generate the RX clock pulse so that this
pulse is shifted from half a bit period in order to sample received bits in the middle. When not receiving
(rx_busy == 0), the accumulator stops incrementing
- TX phase accumulator only stars when there is a byte to send, it starts from value 0. We avoid a free-running
accumulator in order to have a precise duration for the start bit and therefore not have transmission
errors. A free-running TX accumulator would leed to arbitrary short start bits
- Adding simulation test bench for RX and TX that you can execute by doing cd misoclib/uart && python __init__.py
- The tuning_word (and therefore the baudrate) is tunable by software via CSR

---
 misoclib/uart/__init__.py | 217 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 160 insertions(+), 57 deletions(-)

diff --git a/misoclib/uart/__init__.py b/misoclib/uart/__init__.py
(Continue reading)

Florent Kermarrec | 28 Jul 12:19 2014
Picon

[M-Labs devel] [PATCH] move programmer to mibuild, add IMPACT, add KC705 ddram pins & init

Hi, 

since some of you seems to have the KC705, here are some small patchs that can be useful (exceptially for the programmer).

I find more convenient to have programmer.py in mibuild, so I moved it and added a programmer parameter to platforms. Hope it's OK...

Florent
Attachment (migen-0003-kc705-add-ddram-pins.patch): application/octet-stream, 3007 bytes
Attachment (misoc-0001-move-programmer-to-mibuild.patch): application/octet-stream, 5045 bytes
<div><div dir="ltr">Hi,&nbsp;<div><br></div>
<div>since some of you seems to have the KC705, here are some small patchs that can be useful (exceptially for the programmer).</div>
<div><br></div>
<div>I find more convenient to have programmer.py in mibuild, so I moved it and added a programmer parameter to platforms. Hope it's OK...</div>

<div><br></div>
<div>Florent</div>
</div></div>
Robert Jordens | 28 Jul 03:30 2014
Picon

[M-Labs devel] [PATCH] mibuild.xilinx_vivado: support settingsXX.sh

* in the process refactor the version search, the architecture bit width
 detection, the settings search and all also for xilinx_ise
* use distutils.version.StrictVersion
---
 mibuild/tools.py         | 16 +++++++++++++++-
 mibuild/xilinx_ise.py    | 28 +++++++---------------------
 mibuild/xilinx_tools.py  | 27 +++++++++++++++++++++++++++
 mibuild/xilinx_vivado.py | 13 ++++++-------
 4 files changed, 55 insertions(+), 29 deletions(-)
 create mode 100644 mibuild/xilinx_tools.py

diff --git a/mibuild/tools.py b/mibuild/tools.py
index 35efca7..eb63fb4 100644
--- a/mibuild/tools.py
+++ b/mibuild/tools.py
 <at>  <at>  -1,4 +1,5  <at>  <at> 
-import os
+import os, struct
+from distutils.version import StrictVersion

 def mkdir_noerror(d):
 	try:
 <at>  <at>  -21,3 +22,16  <at>  <at>  def write_to_file(filename, contents, force_unix=False):
 	f = open(filename, "w", newline=newline)
 	f.write(contents)
 	f.close()
+
+def arch_bits():
+	return struct.calcsize("P")*8
+
+def versions(path):
+	for n in os.listdir(path):
+		full = os.path.join(path, n)
+		if not os.path.isdir(full):
+			continue
+		try:
+			yield StrictVersion(n)
+		except ValueError:
+			continue
diff --git a/mibuild/xilinx_ise.py b/mibuild/xilinx_ise.py
index 56bd414..12a5862 100644
--- a/mibuild/xilinx_ise.py
+++ b/mibuild/xilinx_ise.py
 <at>  <at>  -1,5 +1,4  <at>  <at> 
-import os, struct, subprocess, sys
-from decimal import Decimal
+import os, subprocess, sys

 from migen.fhdl.std import *
 from migen.fhdl.specials import SynthesisDirective
 <at>  <at>  -7,7 +6,7  <at>  <at>  from migen.genlib.cdc import *
 from migen.fhdl.structure import _Fragment

 from mibuild.generic_platform import *
-from mibuild import tools
+from mibuild import tools, xilinx_tools

 def _format_constraint(c):
 	if isinstance(c, Pins):
 <at>  <at>  -89,34 +88,21  <at>  <at>  synth_xilinx -arch {arch} -top top -edif {build_name}.edif""".format(arch=arch,
 	if r != 0:
 		raise OSError("Subprocess failed")

-def _is_valid_version(path, v):
-	try: 
-		Decimal(v)
-		return os.path.isdir(os.path.join(path, v))
-	except:
-		return False
-
 def _run_ise(build_name, ise_path, source, mode, ngdbuild_opt,
-		bitgen_opt, ise_commands, map_opt, par_opt):
+		bitgen_opt, ise_commands, map_opt, par_opt, ver=None):
 	if sys.platform == "win32" or sys.platform == "cygwin":
 		source = False
 	build_script_contents = "# Autogenerated by mibuild\nset -e\n"
 	if source:
-		vers = [ver for ver in os.listdir(ise_path) if _is_valid_version(ise_path, ver)]
-		tools_version = max(vers)
-		bits = struct.calcsize("P")*8
-		
-		xilinx_settings_file = os.path.join(ise_path, tools_version, "ISE_DS", "settings{0}.sh".format(bits))
-		if not os.path.exists(xilinx_settings_file) and bits == 64:
-			# if we are on 64-bit system but the toolchain isn't, try the 32-bit env.
-			xilinx_settings_file = os.path.join(ise_path, tools_version, "ISE_DS", "settings32.sh")
-		build_script_contents += "source " + xilinx_settings_file + "\n"
+		settings = xilinx_tools.settings(ise_path, ver, "ISE_DS")
+		build_script_contents += "source " + settings + "\n"
 	if mode == "edif":
 		ext = "edif"
 	else:
 		ext = "ngc"
 		build_script_contents += """
-xst -ifn {build_name}.xst"""
+xst -ifn {build_name}.xst
+"""

 	build_script_contents += """
 ngdbuild {ngdbuild_opt} -uc {build_name}.ucf {build_name}.{ext} {build_name}.ngd
diff --git a/mibuild/xilinx_tools.py b/mibuild/xilinx_tools.py
new file mode 100644
index 0000000..98c2e21
--- /dev/null
+++ b/mibuild/xilinx_tools.py
 <at>  <at>  -0,0 +1,27  <at>  <at> 
+import os
+from distutils.version import StrictVersion
+
+from mibuild import tools
+
+def settings(path, ver=None, sub=None):
+	vers = list(tools.versions(path))
+	if ver is None:
+		ver = max(vers)
+	else:
+		ver = StrictVersion(ver)
+		assert ver in vers
+
+	full = os.path.join(path, str(ver))
+	if sub:
+		full = os.path.join(full, sub)
+
+	search = [64, 32]
+	if tools.arch_bits() == 32:
+		search.reverse()
+
+	for b in search:
+		settings = os.path.join(full, "settings{0}.sh".format(b))
+		if os.path.exists(settings):
+			return settings
+
+	raise ValueError("no settings file found")
diff --git a/mibuild/xilinx_vivado.py b/mibuild/xilinx_vivado.py
index 7149da5..c229ba1 100644
--- a/mibuild/xilinx_vivado.py
+++ b/mibuild/xilinx_vivado.py
 <at>  <at>  -7,7 +7,7  <at>  <at>  from migen.fhdl.std import *
 from migen.fhdl.structure import _Fragment

 from mibuild.generic_platform import *
-from mibuild import tools
+from mibuild import tools, xilinx_tools

 def _format_constraint(c):
 	if isinstance(c, Pins):
 <at>  <at>  -56,15 +56,14  <at>  <at>  def _build_files(device, sources, vincpaths, build_name):
 	tcl_contents += "quit\n"	
 	tools.write_to_file(build_name + ".tcl", tcl_contents)

-def _run_vivado(build_name, vivado_path, source):
+def _run_vivado(build_name, vivado_path, source, ver=None):
 	if sys.platform == "win32" or sys.platform == "cygwin":
 		source = False
 	build_script_contents = "# Autogenerated by mibuild\nset -e\n"
 	if source:
-		raise NotImplementedError
-	build_script_contents += """
-vivado -mode tcl -source {build_name}.tcl
-""".format(build_name=build_name)
+		settings = xilinx_tools.settings(vivado_path, ver)
+		build_script_contents += "source " + settings + "\n"
+	build_script_contents += "vivado -mode tcl -source " + build_name + ".tcl\n"
 	build_script_file = "build_" + build_name + ".sh"
 	tools.write_to_file(build_script_file, build_script_contents, force_unix=True)

 <at>  <at>  -80,7 +79,7  <at>  <at>  class XilinxVivadoPlatform(GenericPlatform):
 		return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)

 	def build(self, fragment, build_dir="build", build_name="top",
-			vivado_path="/opt/Xilinx", source=True, run=True):
+			vivado_path="/opt/Xilinx/Vivado", source=True, run=True):
 		tools.mkdir_noerror(build_dir)
 		os.chdir(build_dir)

--

-- 
1.9.1

Robert Jordens | 27 Jul 04:06 2014
Picon

[M-Labs devel] [PATCH] mibuild.xilinx_vivado: support sourcing settingsXX.sh

---
 mibuild/xilinx_vivado.py | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/mibuild/xilinx_vivado.py b/mibuild/xilinx_vivado.py
index 7149da5..f19dbe4 100644
--- a/mibuild/xilinx_vivado.py
+++ b/mibuild/xilinx_vivado.py
 <at>  <at>  -1,7 +1,7  <at>  <at> 
 # This file is Copyright (c) 2014 Florent Kermarrec <florent@...>
 # License: BSD

-import os, subprocess, sys
+import os, subprocess, sys, struct

 from migen.fhdl.std import *
 from migen.fhdl.structure import _Fragment
 <at>  <at>  -56,12 +56,29  <at>  <at>  def _build_files(device, sources, vincpaths, build_name):
 	tcl_contents += "quit\n"	
 	tools.write_to_file(build_name + ".tcl", tcl_contents)

+def _is_valid_version(path, v):
+	try:
+		return float(v)
+	except:
+		return False
+
 def _run_vivado(build_name, vivado_path, source):
 	if sys.platform == "win32" or sys.platform == "cygwin":
 		source = False
 	build_script_contents = "# Autogenerated by mibuild\nset -e\n"
 	if source:
-		raise NotImplementedError
+		vers = [ver for ver in os.listdir(vivado_path)
+				if _is_valid_version(vivado_path, ver)]
+		tools_version = max(vers)
+		bits = struct.calcsize("P")*8
+
+		xilinx_settings_file = os.path.join(vivado_path, tools_version,
+				"settings{0}.sh".format(bits))
+		if not os.path.exists(xilinx_settings_file) and bits == 64:
+			# if we are on 64-bit system but the toolchain isn't, try the 32-bit env.
+			xilinx_settings_file = os.path.join(vivado_path, tools_version,
+					"settings32.sh")
+		build_script_contents += "source " + xilinx_settings_file + "\n"
 	build_script_contents += """
 vivado -mode tcl -source {build_name}.tcl
 """.format(build_name=build_name)
 <at>  <at>  -80,7 +97,7  <at>  <at>  class XilinxVivadoPlatform(GenericPlatform):
 		return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)

 	def build(self, fragment, build_dir="build", build_name="top",
-			vivado_path="/opt/Xilinx", source=True, run=True):
+			vivado_path="/opt/Xilinx/Vivado", source=True, run=True):
 		tools.mkdir_noerror(build_dir)
 		os.chdir(build_dir)

--

-- 
1.9.1

Robert Jordens | 25 Jul 07:45 2014
Picon

[M-Labs devel] [PATCH] migen.fhdl.structure: add Signal.like(other)

This is a convenience method. Signal(flen(other)) is used frequently but that
drops the signedness. Signal((other.nbits, other.signed)) would be correct but
is long.
---
 migen/fhdl/structure.py | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/migen/fhdl/structure.py b/migen/fhdl/structure.py
index 7ab4254..aa33888 100644
--- a/migen/fhdl/structure.py
+++ b/migen/fhdl/structure.py
 <at>  <at>  -274,6 +274,20  <at>  <at>  class Signal(Value):
 	def __repr__(self):
 		return "<Signal " + (self.backtrace[-1][0] or "anonymous") + " at " + hex(id(self)) + ">"

+	 <at> classmethod
+	def like(cls, other):
+		"""Create Signal based on another.
+
+		Parameters
+		----------
+		other : Value
+			Object to base this Signal on.
+
+		See `migen.fhdl.bitcontainer.value_bits_sign`() for details.
+		"""
+		from migen.fhdl.bitcontainer import value_bits_sign
+		return cls(value_bits_sign(other))
+
 class ClockSignal(Value):
 	"""Clock signal for a given clock domain

--

-- 
1.9.1

Florent Kermarrec | 24 Jul 14:40 2014
Picon

[M-Labs devel] [PATCH] migen/sim/generic: use kwargs to pass parameters to icarus.Runner

Hi,

In my case I need to pass "extra_files" parameter to icarus.Runner but using kwargs seems better
than adding all parameters manually.

Florent
<div><div dir="ltr">Hi,<div><br></div>
<div>In my case I need to pass "extra_files" parameter to icarus.Runner but using kwargs seems better</div>
<div>than adding all parameters manually.</div>
<div><br></div>
<div>Florent</div>

</div></div>
Yann Sionneau | 20 Jul 22:07 2014
Picon

[M-Labs devel] update scripts.git

Hello everybody,

Can someone push the attached commit to scripts.git please?

This fixes the compilation of the toolchain on Debian Jessie (8) which is having the same issue as https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=746831 .

I just copied the fix available over there https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=patch;h=27b829ee701e29804216b3803fbaeb629be27491 for GDB and binutils.

Cheers!

--
Yann Sionneau
commit 21c9b99c046dd91dd4279c91bcb7e6d8c7005eb6
Author: Yann Sionneau <yann.sionneau <at> gmail.com>
Date:   Sun Jul 20 22:01:23 2014 +0200

    Fix toolchain compilation on Debian 8 Jessie

diff --git a/compile-lm32-rtems/Makefile b/compile-lm32-rtems/Makefile
index 6a7dbe9..2fc3685 100644
--- a/compile-lm32-rtems/Makefile
+++ b/compile-lm32-rtems/Makefile
 <at>  <at>  -95,7 +95,8  <at>  <at>  gcc-$(GCC_CORE_VERSION)/newlib: .unzip.ok
 	cd newlib-$(NEWLIB_VERSION) && \
 	 patch -p1 < ../$(RTEMS_PATCHES_DIR)/$(NEWLIB_PATCH)
 	cd gdb-$(GDB_VERSION) && \
-	 patch -p1 < ../$(RTEMS_PATCHES_DIR)/$(GDB_PATCH)
+	 patch -p1 < ../$(RTEMS_PATCHES_DIR)/$(GDB_PATCH) && patch -p1 < ../$(MM1_PATCHES_DIR)/gdb-fix-errors-in-bfd-header.patch
+	cd binutils-$(BINUTILS_VERSION) && patch -p1 < ../$(MM1_PATCHES_DIR)/binutils-fix-errors-in-bfd-header.patch
 	touch $ <at> 

 .unzip.ok: $(DL)/$(BINUTILS).ok $(DL)/$(GCC_CORE).ok $(DL)/$(NEWLIB).ok $(DL)/$(GDB).ok
$(DL)/$(MPFR).ok $(DL)/$(MPC).ok $(DL)/$(GMP).ok
diff --git
a/compile-lm32-rtems/milkymist-one-patches/binutils-fix-errors-in-bfd-header.patch b/compile-lm32-rtems/milkymist-one-patches/binutils-fix-errors-in-bfd-header.patch
new file mode 100644
index 0000000..e05b4eb
--- /dev/null
+++ b/compile-lm32-rtems/milkymist-one-patches/binutils-fix-errors-in-bfd-header.patch
 <at>  <at>  -0,0 +1,86  <at>  <at> 
+diff -Naur dl/binutils-2.23.90/bfd/bfd-in2.h binutils-2.23.90/bfd/bfd-in2.h
+--- dl/binutils-2.23.90/bfd/bfd-in2.h	2013-08-27 00:18:06.000000000 +0200
++++ binutils-2.23.90/bfd/bfd-in2.h	2014-07-20 19:53:16.982522896 +0200
+ <at>  <at>  -299,9 +299,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -524,7 +521,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+ 
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
+ <at>  <at>  -1583,6 +1579,28  <at>  <at> 
+   } map_head, map_tail;
+ } asection;
+ 
++static inline bfd_boolean
++bfd_set_section_vma(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, bfd_vma val)
++{
++	ptr->vma = ptr->lma = val;
++	ptr->user_set_vma = TRUE;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_userdata(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, void *val)
++{
++	ptr->userdata = val;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_alignment(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, unsigned int val)
++{
++	ptr->alignment_power = val;
++	return TRUE;
++}
++
+ /* Relax table contains information about instructions which can
+    be removed by relaxation -- replacing a long address with a
+    short address.  */
+ <at>  <at>  -6227,6 +6245,14  <at>  <at> 
+   unsigned int selective_search : 1;
+ };
+ 
++static inline bfd_boolean
++bfd_set_cacheable(bfd *abfd, bfd_boolean val)
++{
++	abfd->cacheable = val;
++	return TRUE;
++}
++
++
+ typedef enum bfd_error
+ {
+   bfd_error_no_error = 0,
+diff -Naur dl/binutils-2.23.90/bfd/bfd-in.h binutils-2.23.90/bfd/bfd-in.h
+--- dl/binutils-2.23.90/bfd/bfd-in.h	2013-08-21 09:28:37.000000000 +0200
++++ binutils-2.23.90/bfd/bfd-in.h	2014-07-20 19:46:31.576450617 +0200
+ <at>  <at>  -292,9 +292,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -517,7 +514,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+ 
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
diff --git a/compile-lm32-rtems/milkymist-one-patches/gdb-fix-errors-in-bfd-header.patch b/compile-lm32-rtems/milkymist-one-patches/gdb-fix-errors-in-bfd-header.patch
new file mode 100644
index 0000000..814aa23
--- /dev/null
+++ b/compile-lm32-rtems/milkymist-one-patches/gdb-fix-errors-in-bfd-header.patch
 <at>  <at>  -0,0 +1,88  <at>  <at> 
+diff -Naur dl/gdb-7.5.1/bfd/bfd-in2.h gdb-7.5.1/bfd/bfd-in2.h
+--- dl/gdb-7.5.1/bfd/bfd-in2.h	2012-07-13 17:47:23.000000000 +0200
++++ gdb-7.5.1/bfd/bfd-in2.h	2014-07-20 20:48:58.056706292 +0200
+ <at>  <at>  -301,9 +301,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -526,8 +523,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+-
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
+ /* NB: This declaration should match the autogenerated one in libbfd.h.  */
+ <at>  <at>  -1533,6 +1528,29  <at>  <at> 
+   } map_head, map_tail;
+ } asection;
+ 
++static inline bfd_boolean
++bfd_set_section_vma(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, bfd_vma val)
++{
++	ptr->vma = ptr->lma = val;
++	ptr->user_set_vma = TRUE;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_userdata(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, void *val)
++{
++	ptr->userdata = val;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_alignment(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, unsigned int val)
++{
++	ptr->alignment_power = val;
++	return TRUE;
++}
++
++
+ /* Relax table contains information about instructions which can
+    be removed by relaxation -- replacing a long address with a 
+    short address.  */
+ <at>  <at>  -5709,6 +5727,13  <at>  <at> 
+   unsigned int selective_search : 1;
+ };
+ 
++static inline bfd_boolean
++bfd_set_cacheable(bfd *abfd, bfd_boolean val)
++{
++	abfd->cacheable = val;
++	return TRUE;
++}
++
+ typedef enum bfd_error
+ {
+   bfd_error_no_error = 0,
+diff -Naur dl/gdb-7.5.1/bfd/bfd-in.h gdb-7.5.1/bfd/bfd-in.h
+--- dl/gdb-7.5.1/bfd/bfd-in.h	2012-06-04 16:35:20.000000000 +0200
++++ gdb-7.5.1/bfd/bfd-in.h	2014-07-20 20:48:04.153025696 +0200
+ <at>  <at>  -294,9 +294,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -519,8 +516,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+-
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
+ /* NB: This declaration should match the autogenerated one in libbfd.h.  */
commit 21c9b99c046dd91dd4279c91bcb7e6d8c7005eb6
Author: Yann Sionneau <yann.sionneau <at> gmail.com>
Date:   Sun Jul 20 22:01:23 2014 +0200

    Fix toolchain compilation on Debian 8 Jessie

diff --git a/compile-lm32-rtems/Makefile b/compile-lm32-rtems/Makefile
index 6a7dbe9..2fc3685 100644
--- a/compile-lm32-rtems/Makefile
+++ b/compile-lm32-rtems/Makefile
 <at>  <at>  -95,7 +95,8  <at>  <at>  gcc-$(GCC_CORE_VERSION)/newlib: .unzip.ok
 	cd newlib-$(NEWLIB_VERSION) && \
 	 patch -p1 < ../$(RTEMS_PATCHES_DIR)/$(NEWLIB_PATCH)
 	cd gdb-$(GDB_VERSION) && \
-	 patch -p1 < ../$(RTEMS_PATCHES_DIR)/$(GDB_PATCH)
+	 patch -p1 < ../$(RTEMS_PATCHES_DIR)/$(GDB_PATCH) && patch -p1 < ../$(MM1_PATCHES_DIR)/gdb-fix-errors-in-bfd-header.patch
+	cd binutils-$(BINUTILS_VERSION) && patch -p1 < ../$(MM1_PATCHES_DIR)/binutils-fix-errors-in-bfd-header.patch
 	touch $ <at> 

 .unzip.ok: $(DL)/$(BINUTILS).ok $(DL)/$(GCC_CORE).ok $(DL)/$(NEWLIB).ok $(DL)/$(GDB).ok
$(DL)/$(MPFR).ok $(DL)/$(MPC).ok $(DL)/$(GMP).ok
diff --git
a/compile-lm32-rtems/milkymist-one-patches/binutils-fix-errors-in-bfd-header.patch b/compile-lm32-rtems/milkymist-one-patches/binutils-fix-errors-in-bfd-header.patch
new file mode 100644
index 0000000..e05b4eb
--- /dev/null
+++ b/compile-lm32-rtems/milkymist-one-patches/binutils-fix-errors-in-bfd-header.patch
 <at>  <at>  -0,0 +1,86  <at>  <at> 
+diff -Naur dl/binutils-2.23.90/bfd/bfd-in2.h binutils-2.23.90/bfd/bfd-in2.h
+--- dl/binutils-2.23.90/bfd/bfd-in2.h	2013-08-27 00:18:06.000000000 +0200
++++ binutils-2.23.90/bfd/bfd-in2.h	2014-07-20 19:53:16.982522896 +0200
+ <at>  <at>  -299,9 +299,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -524,7 +521,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+ 
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
+ <at>  <at>  -1583,6 +1579,28  <at>  <at> 
+   } map_head, map_tail;
+ } asection;
+ 
++static inline bfd_boolean
++bfd_set_section_vma(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, bfd_vma val)
++{
++	ptr->vma = ptr->lma = val;
++	ptr->user_set_vma = TRUE;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_userdata(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, void *val)
++{
++	ptr->userdata = val;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_alignment(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, unsigned int val)
++{
++	ptr->alignment_power = val;
++	return TRUE;
++}
++
+ /* Relax table contains information about instructions which can
+    be removed by relaxation -- replacing a long address with a
+    short address.  */
+ <at>  <at>  -6227,6 +6245,14  <at>  <at> 
+   unsigned int selective_search : 1;
+ };
+ 
++static inline bfd_boolean
++bfd_set_cacheable(bfd *abfd, bfd_boolean val)
++{
++	abfd->cacheable = val;
++	return TRUE;
++}
++
++
+ typedef enum bfd_error
+ {
+   bfd_error_no_error = 0,
+diff -Naur dl/binutils-2.23.90/bfd/bfd-in.h binutils-2.23.90/bfd/bfd-in.h
+--- dl/binutils-2.23.90/bfd/bfd-in.h	2013-08-21 09:28:37.000000000 +0200
++++ binutils-2.23.90/bfd/bfd-in.h	2014-07-20 19:46:31.576450617 +0200
+ <at>  <at>  -292,9 +292,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -517,7 +514,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+ 
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
diff --git a/compile-lm32-rtems/milkymist-one-patches/gdb-fix-errors-in-bfd-header.patch b/compile-lm32-rtems/milkymist-one-patches/gdb-fix-errors-in-bfd-header.patch
new file mode 100644
index 0000000..814aa23
--- /dev/null
+++ b/compile-lm32-rtems/milkymist-one-patches/gdb-fix-errors-in-bfd-header.patch
 <at>  <at>  -0,0 +1,88  <at>  <at> 
+diff -Naur dl/gdb-7.5.1/bfd/bfd-in2.h gdb-7.5.1/bfd/bfd-in2.h
+--- dl/gdb-7.5.1/bfd/bfd-in2.h	2012-07-13 17:47:23.000000000 +0200
++++ gdb-7.5.1/bfd/bfd-in2.h	2014-07-20 20:48:58.056706292 +0200
+ <at>  <at>  -301,9 +301,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -526,8 +523,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+-
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
+ /* NB: This declaration should match the autogenerated one in libbfd.h.  */
+ <at>  <at>  -1533,6 +1528,29  <at>  <at> 
+   } map_head, map_tail;
+ } asection;
+ 
++static inline bfd_boolean
++bfd_set_section_vma(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, bfd_vma val)
++{
++	ptr->vma = ptr->lma = val;
++	ptr->user_set_vma = TRUE;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_userdata(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, void *val)
++{
++	ptr->userdata = val;
++	return TRUE;
++}
++
++static inline bfd_boolean
++bfd_set_section_alignment(bfd *abfd ATTRIBUTE_UNUSED, asection *ptr, unsigned int val)
++{
++	ptr->alignment_power = val;
++	return TRUE;
++}
++
++
+ /* Relax table contains information about instructions which can
+    be removed by relaxation -- replacing a long address with a 
+    short address.  */
+ <at>  <at>  -5709,6 +5727,13  <at>  <at> 
+   unsigned int selective_search : 1;
+ };
+ 
++static inline bfd_boolean
++bfd_set_cacheable(bfd *abfd, bfd_boolean val)
++{
++	abfd->cacheable = val;
++	return TRUE;
++}
++
+ typedef enum bfd_error
+ {
+   bfd_error_no_error = 0,
+diff -Naur dl/gdb-7.5.1/bfd/bfd-in.h gdb-7.5.1/bfd/bfd-in.h
+--- dl/gdb-7.5.1/bfd/bfd-in.h	2012-06-04 16:35:20.000000000 +0200
++++ gdb-7.5.1/bfd/bfd-in.h	2014-07-20 20:48:04.153025696 +0200
+ <at>  <at>  -294,9 +294,6  <at>  <at> 
+ 
+ #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+ 
+-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)),
((ptr)->user_set_vma = TRUE), TRUE)
+-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
+-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
+ /* Find the address one past the end of SEC.  */
+ #define bfd_get_section_limit(bfd, sec) \
+   (((bfd)->direction != write_direction && (sec)->rawsize != 0	\
+ <at>  <at>  -519,8 +516,6  <at>  <at> 
+ 
+ #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+ 
+-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
+-
+ extern bfd_boolean bfd_cache_close
+   (bfd *abfd);
+ /* NB: This declaration should match the autogenerated one in libbfd.h.  */
Robert Jordens | 19 Jul 07:19 2014
Picon

[M-Labs devel] [PATCH 2/2] flow.plumbing: spelling

---
 migen/flow/plumbing.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/migen/flow/plumbing.py b/migen/flow/plumbing.py
index cb8abf4..2e2ea98 100644
--- a/migen/flow/plumbing.py
+++ b/migen/flow/plumbing.py
 <at>  <at>  -65,7 +65,7  <at>  <at>  class Multiplexer(Module):
 		
 		###

-		case = {}
+		cases = {}
 		for i, sink in enumerate(sinks):
 			cases[i] = Record.connect(sink, self.source)
 		self.comb += Case(self.sel, cases)
--

-- 
1.9.1

Robert Jordens | 19 Jul 07:18 2014
Picon

[M-Labs devel] [PATCH 1/2] flow.plumbing: make argument order consistent

---
 migen/flow/plumbing.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/migen/flow/plumbing.py b/migen/flow/plumbing.py
index 5c48af3..cb8abf4 100644
--- a/migen/flow/plumbing.py
+++ b/migen/flow/plumbing.py
 <at>  <at>  -53,7 +53,7  <at>  <at>  class Splitter(Module):
 			self.comb += s.stb.eq(self.sink.stb & ~already_acked[n])

 class Multiplexer(Module):
-	def __init__(self, n, layout):
+	def __init__(self, layout, n):
 		self.source = Source(layout)
 		sinks = []
 		for i in range(n):
--

-- 
1.9.1

Iñigo Muguruza | 16 Jul 14:18 2014
Picon

[M-Labs devel] Fwd: gdb stub implementation in Misoc



---------- Forwarded message ----------
From: Iñigo Muguruza <inigo.muguruza89-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: 2014-07-16 13:17 GMT+01:00
Subject: Re: [M-Labs devel] gdb stub implementation in Misoc
To: Yann Sionneau <yann.sionneau-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>


Hi Yann,

thanks for your answers.

We were hoping to compile a Hello world program and link it with the gdb stub, so that we could use gdb and the serial port to debug the program. Why can't it be loaded in sdram instead of the rom?  What do we need to change so that this happens? Ony the flterm seems to block while loading the program.

Regards,

Iñigo








2014-07-16 11:45 GMT+01:00 Yann Sionneau <yann.sionneau-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:

In Milkymist legacy SoC the gdbstub is not loaded in DDR SDRAM, it
seems that's what you are doing by loading it via serialboot.

In fact, in Milkymist, the gdbstub is loaded in on-chip ROM (
https://github.com/m-labs/milkymist/blob/master/cores/monitor/rtl/monitor.v
).
So the gdb stub is compiled using a different linker script
(https://github.com/m-labs/milkymist/blob/master/software/gdbstub/linker.ld)
because the ROM is mapped at a different address than DDR SDRAM or
flash.

Could you explain what exactly you are trying to do ?

What were you expecting from the main.c you posted?

Btw, lm32 has an (optional) instruction cache, on legacy soc both
instruction and data caches are enabled. On Misoc it seems both caches
are enabled as well, cf
https://github.com/m-labs/misoc/blob/master/verilog/lm32/lm32_config.v

Regards,

Yann



2014-07-16 11:56 GMT+02:00 Iñigo Muguruza <inigo.muguruza89-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:
> Hi everyone,
>
> I'm trying to implement gdb stub in Misoc. I'm using the gdbstub.c and
> crt0.S that are located within the project of milkymist. I have compiled and
> linked them using the blinkie's project main.c, makefile  and misoc linker
> (linker-sdram.ld). I have managed to create the .bin, but when I upload it,
> using flterm, it freezes, like this:
>
> BIOS> serialboot
> Booting from serial...
> sL5DdSMmkekro
> [FLTERM] Received firmware download request from the device.
> [FLTERM] Uploading kernel (13888 bytes)...
> 12%
>
> Any idea which could be the reason??
>
> I know that the main.c has a lot mistakes, but firstly I'm trying to upload
> the .bin . I have attached the makefile, main.c and the .bin.
>
> Thanks in advance,
>
>
>
> _______________________________________________
> M-Labs devel mailing list
> Devel <at> lists.m-labs.hk
> https://ssl.serverraum.org/lists/listinfo/devel
>



--
Yann Sionneau


<div><div dir="ltr">
<br><br><div class="gmail_quote">---------- Forwarded message ----------<br>From: I&ntilde;igo Muguruza <span dir="ltr">&lt;<a href="mailto:inigo.muguruza89@...">inigo.muguruza89@...</a>&gt;</span><br>
Date: 2014-07-16 13:17 GMT+01:00<br>Subject: Re: [M-Labs devel] gdb stub implementation in Misoc<br>To: Yann Sionneau &lt;<a href="mailto:yann.sionneau@...">yann.sionneau@...</a>&gt;<br><br><br><div dir="ltr">
<div>
<div>
<div>Hi Yann,<br><br>
</div>thanks for your answers. <br><br>
</div>We were hoping to compile a Hello world program and link it with the gdb stub, so that we could use gdb and the serial port to debug the program. Why can't it be loaded in sdram instead of the rom?&nbsp; What do we need to change so that this happens? Ony the flterm seems to block while loading the program.<br><br>
</div>
<div>Regards,<br><br>
</div>
<div>I&ntilde;igo <br>
</div>
<div><br></div>
<br><div>
<br><br><br><br>
</div>
</div>
<div class="gmail_extra">
<br><br><div class="gmail_quote">2014-07-16 11:45 GMT+01:00 Yann Sionneau <span dir="ltr">&lt;<a href="mailto:yann.sionneau@..." target="_blank">yann.sionneau@...</a>&gt;</span>:<div>
<div class="h5">
<br><blockquote class="gmail_quote">In Milkymist legacy SoC the gdbstub is not loaded in DDR SDRAM, it<br>
seems that's what you are doing by loading it via serialboot.<br><br>
In fact, in Milkymist, the gdbstub is loaded in on-chip ROM (<br><a href="https://github.com/m-labs/milkymist/blob/master/cores/monitor/rtl/monitor.v" target="_blank">https://github.com/m-labs/milkymist/blob/master/cores/monitor/rtl/monitor.v</a><br>
).<br>
So the gdb stub is compiled using a different linker script<br>
(<a href="https://github.com/m-labs/milkymist/blob/master/software/gdbstub/linker.ld" target="_blank">https://github.com/m-labs/milkymist/blob/master/software/gdbstub/linker.ld</a>)<br>
because the ROM is mapped at a different address than DDR SDRAM or<br>
flash.<br><br>
Could you explain what exactly you are trying to do ?<br><br>
What were you expecting from the main.c you posted?<br><br>
Btw, lm32 has an (optional) instruction cache, on legacy soc both<br>
instruction and data caches are enabled. On Misoc it seems both caches<br>
are enabled as well, cf<br><a href="https://github.com/m-labs/misoc/blob/master/verilog/lm32/lm32_config.v" target="_blank">https://github.com/m-labs/misoc/blob/master/verilog/lm32/lm32_config.v</a><br><br>
Regards,<br><br>
Yann<br><br><br><br>
2014-07-16 11:56 GMT+02:00 I&ntilde;igo Muguruza &lt;<a href="mailto:inigo.muguruza89@..." target="_blank">inigo.muguruza89@...</a>&gt;:<br><div><div>&gt; Hi everyone,<br>
&gt;<br>
&gt; I'm trying to implement gdb stub in Misoc. I'm using the gdbstub.c and<br>
&gt; crt0.S that are located within the project of milkymist. I have compiled and<br>
&gt; linked them using the blinkie's project main.c, makefile &nbsp;and misoc linker<br>
&gt; (linker-sdram.ld). I have managed to create the .bin, but when I upload it,<br>
&gt; using flterm, it freezes, like this:<br>
&gt;<br>
&gt; BIOS&gt; serialboot<br>
&gt; Booting from serial...<br>
&gt; sL5DdSMmkekro<br>
&gt; [FLTERM] Received firmware download request from the device.<br>
&gt; [FLTERM] Uploading kernel (13888 bytes)...<br>
&gt; 12%<br>
&gt;<br>
&gt; Any idea which could be the reason??<br>
&gt;<br>
&gt; I know that the main.c has a lot mistakes, but firstly I'm trying to upload<br>
&gt; the .bin . I have attached the makefile, main.c and the .bin.<br>
&gt;<br>
&gt; Thanks in advance,<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; M-Labs devel mailing list<br>
&gt; <a href="mailto:Devel@..." target="_blank">Devel <at> lists.m-labs.hk</a><br>
&gt; <a href="https://ssl.serverraum.org/lists/listinfo/devel" target="_blank">https://ssl.serverraum.org/lists/listinfo/devel</a><br>
&gt;<br><span><br><br><br>
--<br>
Yann Sionneau<br></span>
</blockquote>
</div>
</div>
</div>
<br>
</div>
</div>
<br>
</div></div>

Gmane