<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>my tech blog</title>
	<atom:link href="http://billauer.co.il/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://billauer.co.il/blog</link>
	<description>Anything I found worthy to write down.</description>
	<lastBuildDate>Thu, 17 May 2012 16:20:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Linux 2.6.35 hanging/oopsing on large memory allocations</title>
		<link>http://billauer.co.il/blog/2012/05/linux-malloc-oops-hang-crash/</link>
		<comments>http://billauer.co.il/blog/2012/05/linux-malloc-oops-hang-crash/#comments</comments>
		<pubDate>Thu, 17 May 2012 15:46:41 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2837</guid>
		<description><![CDATA[Short summary Kernel 2.6.35.4 kernel on x86_64 doesn&#8217;t seem to handle large memory allocations well. In particular, Running malloc() with Gigabyte chunks can cause a kernel oops Quickly allocating all memory will make the system hang (but not oops) If anyone has an idea why this is, some helpful clues or whatever, please comment below. [...]]]></description>
			<content:encoded><![CDATA[<h3>Short summary</h3>
<p>Kernel 2.6.35.4 kernel on x86_64 doesn&#8217;t seem to handle large memory allocations well. In particular,</p>
<ul>
<li>Running malloc() with Gigabyte chunks can cause a kernel oops</li>
<li>Quickly allocating all memory will make the system hang (but not oops)</li>
</ul>
<p>If anyone has an idea why this is, some helpful clues or whatever, please comment below.</p>
<p>I should also mention that I applied the patch, which fixes the general system freeze on rapid disk I/O, mentioned in <a title="Linux: When massive load on the disk makes the system freeze" href="http://billauer.co.il/blog/2010/10/disk-io-scheduler-load-dd-freeze-stall-hang/" target="_blank">another post of mine</a>. I didn&#8217;t feel like going on crashing my system over and over again, so I skipped the test without this patch.</p>
<h3>Allocating a huge chunk</h3>
<p>Running a vanilla 2.6.35.4 kernel on a x86_64 machine (as 64-bit Linux), I wanted to see how well my 16 GB of RAM worked. So I decided to allocate a lot of memory and see what happens. More precisely, I wrote the following somewhat dirty program, and ran it (calling it memeater):</p>
<pre>#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;

int main() {
 long int size = 1024*1024*1024;
 long int i;

 size *= 4;

 char *p = malloc(size);

 printf("Size is %ld, Pointer is %08lx\n", size, (unsigned long int) p);

 if (p)
   for (i=0; i&lt;size/1024; i++) {
     *p = 0;
   p += 1024;
 }

 getc(stdin);

 return 0;
}</pre>
<p>A short explanation: This program merely requires 4 Gigabyte of memory in a single malloc(). The loop writes something on each memory page (a 4096 jump rather that 1024 would be OK as well, I believe). This is necessary, since memory allocation doesn&#8217;t really consume memory until used.</p>
<p>It then expects the user to press RETURN on console, so that the memory is held until deliberately released.</p>
<p>In theory, this shouldn&#8217;t be a problem. Allocating 4 Gigs of memory should either return a pointer or a NULL. Definitely not oops as follows:</p>
<pre>May 17 18:11:14 kernel: general protection fault: 0000 [#3] SMP
May 17 18:11:14 kernel: last sysfs file: /sys/devices/virtual/sound/timer/uevent
May 17 18:11:14 kernel: CPU 4
May 17 18:11:14 kernel: Modules linked in: nfsd exportfs it87 hwmon_vid vmnet vmblock vmci vmmon cpufreq_ondemand
 acpi_cpufreq freq_table mperf ipv6 dm_multipath kvm_intel kvm uinput snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_
intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd iTCO_wdt ppdev 8139too soundcore
 8139cp tulip parport_pc r8169 iTCO_vendor_support pcspkr snd_page_alloc parport i2c_i801 mii sha256_generic
 cryptd aes_x86_64 aes
_generic dm_crypt raid456 async_raid6_recov async_pq raid6_pq async_xor xor async_memcpy async_tx ata_generic
 pata_acpi pata_jmicron radeon ttm drm_kms_helper drm i2c_algo_bit i2c_core [last unloaded: microcode]
May 17 18:11:14 kernel:
May 17 18:11:14 kernel: Pid: 3056, comm: memeater Tainted: G      D     2.6.35.4-OCHO3 #1 P55-UD3R/P55-UD3R
May 17 18:11:14 kernel: RIP: 0010:[&lt;ffffffff811024ae&gt;]  [&lt;ffffffff811024ae&gt;] mem_cgroup_charge_statistics+0x9/0x50
May 17 18:11:14 kernel: RSP: 0018:ffff88040a85fa48  EFLAGS: 00010246
May 17 18:11:14 kernel: RAX: 00000000ffffff01 RBX: ffffea000a918e00 RCX: 0000000000000060
May 17 18:11:14 kernel: RDX: 0000000000000000 RSI: ffff8804142c8a00 RDI: ffbfc90001817000
May 17 18:11:14 kernel: RBP: ffff88040a85fa48 R08: ffff880409eba958 R09: 00000000ffffffc0
May 17 18:11:14 kernel: R10: 0000000000400000 R11: ffffea000a9d0df0 R12: 0000000000000001
May 17 18:11:14 kernel: R13: ffff8804142c8a00 R14: ffbfc90001817000 R15: ffff880409fadcc0
May 17 18:11:14 kernel: FS:  00007f36017db700(0000) GS:ffff880002100000(0000) knlGS:0000000000000000
May 17 18:11:14 kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
May 17 18:11:14 kernel: CR2: 0000000001861000 CR3: 0000000001a42000 CR4: 00000000000006e0
May 17 18:11:14 kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
May 17 18:11:14 kernel: DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
May 17 18:11:14 kernel: Process memeater (pid: 3056, threadinfo ffff88040a85e000, task ffff880409fadcc0)
May 17 18:11:14 kernel: Stack:
May 17 18:11:14 kernel: ffff88040a85fa98 ffffffff8110579c ffff88040a85faa8 ffffffff810ec2d1
May 17 18:11:14 kernel: &lt;0&gt; ffff88040a85fa88 ffffea000a918e00 00007f35e72e1000 8000000305040067
May 17 18:11:14 kernel: &lt;0&gt; 0000000000099000 ffff880409eba958 ffff88040a85faa8 ffffffff81105826
May 17 18:11:14 kernel: Call Trace:
May 17 18:11:14 kernel: [&lt;ffffffff8110579c&gt;] __mem_cgroup_uncharge_common+0x194/0x1e5
May 17 18:11:14 kernel: [&lt;ffffffff810ec2d1&gt;] ? free_pages_and_swap_cache+0x63/0x80
May 17 18:11:14 kernel: [&lt;ffffffff81105826&gt;] mem_cgroup_uncharge_page+0x27/0x29
May 17 18:11:14 kernel: [&lt;ffffffff810e7267&gt;] page_remove_rmap+0x28/0x50
May 17 18:11:14 kernel: [&lt;ffffffff810dd7b3&gt;] unmap_vmas+0x5c5/0x928
May 17 18:11:14 kernel: [&lt;ffffffff810e2ec1&gt;] exit_mmap+0xce/0x132
May 17 18:11:14 kernel: [&lt;ffffffff8104ad9b&gt;] mmput+0x5e/0xca
May 17 18:11:14 kernel: [&lt;ffffffff8104f1cf&gt;] exit_mm+0x114/0x121
May 17 18:11:14 kernel: [&lt;ffffffff81050b7b&gt;] do_exit+0x226/0x726
May 17 18:11:14 kernel: [&lt;ffffffff8105a08e&gt;] ? try_to_del_timer_sync+0x7b/0x89
May 17 18:11:14 kernel: [&lt;ffffffff810510f8&gt;] do_group_exit+0x7d/0xa5
May 17 18:11:14 kernel: [&lt;ffffffff8105ee27&gt;] get_signal_to_deliver+0x373/0x395
May 17 18:11:14 kernel: [&lt;ffffffff812c4dce&gt;] ? n_tty_read+0x6b3/0x786
May 17 18:11:14 kernel: [&lt;ffffffff81009010&gt;] do_signal+0x72/0x68d
May 17 18:11:14 kernel: [&lt;ffffffff812c758d&gt;] ? tty_ldisc_deref+0xe/0x10
May 17 18:11:14 kernel: [&lt;ffffffff812c025f&gt;] ? tty_read+0x8c/0xc5
May 17 18:11:14 kernel: [&lt;ffffffff81009657&gt;] do_notify_resume+0x2c/0x6e
May 17 18:11:14 kernel: [&lt;ffffffff81009f00&gt;] int_signal+0x12/0x17
May 17 18:11:14 kernel: Code: ff 4c 89 e3 4d 8b 24 24 4c 39 eb 75 de 48 c7 c7 60 29 a6 81 e8 b5 eb 39 00 5b 41 5c 41 5d 41 5e c9
 c3 55 48 89 e5 0f 1f 44 00 00 &lt;48&gt; 8b 87 10 11 00 00 80 fa 01 19 c9 83 c9 01 f6 06 02 48 63 c9
May 17 18:11:14 kernel: RIP  [&lt;ffffffff811024ae&gt;] mem_cgroup_charge_statistics+0x9/0x50
May 17 18:11:14 kernel: RSP &lt;ffff88040a85fa48&gt;
May 17 18:11:14 kernel: ---[ end trace 4d26f08f6051ed51 ]---
May 17 18:11:14 kernel: Fixing recursive fault but reboot is needed</pre>
<p>And I should mention that when I tried this for 16 GB, the system just hung. But that&#8217;s explained next.</p>
<h3>Allocating all RAM</h3>
<p>So I said, OK, that must be because nobody is really expected to allocate those huge chunks in one go. So what happens when the memory just ends? I have some swap space, so this should work&#8230;</p>
<pre>#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;

int main() {
 long int size = 1024*1024;
 long int i,k;

 size *= 16;

 for (k=0; k&lt;1024; k++) {

   char *p = malloc(size);

   printf("Size is %ld, Pointer is %08lx\n", size, (unsigned long int) p);

   if (p)
     for (i=0; i&lt;size/1024; i++) {
       *p = 0;
        p += 1024;
     }
 }
 getc(stdin);

 return 0;
}</pre>
<p>The idea here is simple: Loop 1024 times, allocating 16MB at a time. This is sane and eventually takes 16 GB.</p>
<p>But no, the system just hung. No oops, no drama. Just nothing happened. Processes were stalled, typing and switching consoles with Shift-Alt-Fx worked. Ctrl-Alt-Delete is ignored. No reboot. Only a reset got me out of this.</p>
<p>For the record, running the program with chunks of 14 MB each, so <strong>almost</strong> all memory was allocated (14 GB out of 16 GB), worked cleanly, and the system remained stable.</p>
<h3>Of course I have swap</h3>
<p>And this is the proof: This is my /proc/meminfo with a system barely doing anything:</p>
<pre>MemTotal:       16463436 kB
MemFree:        14909616 kB
Buffers:           75428 kB
Cached:           664284 kB
SwapCached:            0 kB
Active:           459044 kB
Inactive:         604272 kB
Active(anon):     324088 kB
Inactive(anon):   115208 kB
Active(file):     134956 kB
Inactive(file):   489064 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       4194300 kB
SwapFree:        4194300 kB
Dirty:              1348 kB
Writeback:             0 kB
AnonPages:        323592 kB
Mapped:           116232 kB
Shmem:            115704 kB
Slab:              95920 kB
SReclaimable:      46340 kB
SUnreclaim:        49580 kB
KernelStack:        4008 kB
PageTables:        36940 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    12426016 kB
Committed_AS:    1576024 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      123416 kB
VmallocChunk:   34359587772 kB
HardwareCorrupted:     0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        8064 kB
DirectMap2M:    16764928 kB</pre>
<p>Sometimes I&#8217;ve sees some of the swap actually used. It&#8217;s not like it doesn&#8217;t work.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/05/linux-malloc-oops-hang-crash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gnome: An icon in the system tray (new mail)</title>
		<link>http://billauer.co.il/blog/2012/05/linux-icon-system-tray-thunderbird-zenity/</link>
		<comments>http://billauer.co.il/blog/2012/05/linux-icon-system-tray-thunderbird-zenity/#comments</comments>
		<pubDate>Mon, 14 May 2012 06:51:29 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2828</guid>
		<description><![CDATA[This should have been obvious: Have a &#8220;new mail&#8221; icon in the system tray when new mail is fetched by Thunderbird on a FC12 Linux machine. I ended up writing my own script. My starting point was the &#8220;Gnome Integration&#8221; add-on. Not that I liked that it forced me to have another notification popup on [...]]]></description>
			<content:encoded><![CDATA[<p>This should have been obvious: Have a &#8220;new mail&#8221; icon in the system tray when new mail is fetched by Thunderbird on a FC12 Linux machine. I ended up writing my own script.</p>
<p>My starting point was the &#8220;Gnome Integration&#8221; add-on. Not that I liked that it forced me to have another notification popup on new mails (aside from Thunderbird&#8217;s native one) if I wanted the icon. But when an icon was added to the system tray for each new mail arriving (that is, a lot of icons in the tray), I knew I had to do a thing of my own.</p>
<p>So I wrote a small, and not so sophisticated script, which checks if an icon is there (more precisely: If a process owning the icon is running) and gives up if it already exists.</p>
<p>The lucky things about the &#8220;Gnome Integration&#8221; add-on is that it allows choosing the command for the mail <strong>notification</strong>. So instead of running whatever puts that unnecessary popup, it runs my script, which puts the icon in place if necessary. Popup away, single icon instead. Could I ask for more?</p>
<p>Here&#8217;s the script. I saved it as /usr/local/bin/new-mail-icon (you can put it anywhere you want, but make sure the executable has the same name):</p>
<pre>#!/bin/bash

THEDIR=$HOME/.thunderbird
ICON=$THEDIR/green-mail-unread.png
LOCKFILE=$THEDIR/new-mail-icon-process

NOW=`date "+%F %T"`

if [ -e $LOCKFILE ] &amp;&amp; grep new-mail-icon /proc/`cat $LOCKFILE`/cmdline &gt; /dev/null 2&gt;/dev/null ;
 then exit 0;
else
 ( echo $BASHPID &gt; $LOCKFILE
 zenity --notification --window-icon=$ICON --text="New mail on $NOW"
 rm -f $LOCKFILE
 ) &amp;
fi</pre>
<p>Important notes about the script:</p>
<ul>
<li>It relies on that the script&#8217;s name is &#8220;new-mail-icon&#8221;. This is how it detects another icon exists. If the script has another name, several icons will appear. Or change the argument to the grep command.</li>
<li>There is a slight race condition if two of these scripts are run in parallel (which is an unlikely situation, and still). It&#8217;s possible that more than one icon will appear, if two (or more) scripts race on the little time gap between checking for the locking file and writing to it.</li>
</ul>
<p>The script above doesn&#8217;t just check if the lockfile exists, but also verifies that the process holding it exists and has the correct command line. This makes it behave correctly if the system shuts down or crashes, leaving the lock file in place.</p>
<p>Then set the Gnome Integration add-on preferences as follows. Note that the &#8220;Show icon&#8221; is <strong>not checked</strong>. The icon is created by running my script instead of the notification application. It&#8217;s a hack indeed.</p>
<p><img src="data:image/png;base64,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" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/05/linux-icon-system-tray-thunderbird-zenity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Controlling desktop effects: Compiz notes for FC12</title>
		<link>http://billauer.co.il/blog/2012/05/compiz-gnome-desktop-effects/</link>
		<comments>http://billauer.co.il/blog/2012/05/compiz-gnome-desktop-effects/#comments</comments>
		<pubDate>Thu, 03 May 2012 23:47:29 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2815</guid>
		<description><![CDATA[Using Fedora Core 12, I wanted some control over my wobbling windows, and in particular which corner is the hot spot for displaying all open windows. The first thing I needed to find out, is the name of the toolkit doing this: So it&#8217;s Compiz. First, install the Compiz Configuration Setting Manager # yum install [...]]]></description>
			<content:encoded><![CDATA[<p>Using Fedora Core 12, I wanted some control over my wobbling windows, and in particular which corner is the hot spot for displaying all open windows.</p>
<p>The first thing I needed to find out, is the name of the toolkit doing this: So it&#8217;s <a href="http://www.compiz.org/" target="_blank">Compiz</a>.</p>
<p>First, install the Compiz Configuration Setting Manager</p>
<pre># yum install ccsm</pre>
<p>It now appears in System &gt; Preferences (as Compiz Configuration Setting Manager).</p>
<p>The next issue is that the settings are ignored. This is because compiz is executed with the gconf plugin by /usr/bin/compiz-gtk, which is what the Gnome environment runs.</p>
<p>So following one of the comments in <a href="https://bugzilla.redhat.com/show_bug.cgi?id=513116" target="_blank">this bug report</a>, edit /usr/bin/compiz-gtk so that the runCompiz function in the file&#8217;s beginning says:</p>
<pre>exec compiz --ignore-desktop-hints glib ccp $@</pre>
<p>And to get this launched, go to System &gt; Preferences &gt; Desktop effects, turn off the effects and turn them on again (choose &#8220;standard&#8221; and then &#8220;compiz&#8221; again). Note that the preferences in the Desktop effect are now ignored, and the ones chosen in Compiz Configuration Setting Manager are used instead. But hey, this is what I wanted in the first place.</p>
<p>In particular, I moved the &#8220;hot corner&#8221; to the bottom left, which I hit by accident much less.  This is done in Compiz Configuration Setting Manager &gt; Window Management &gt; Application Switcher &gt; Scale &gt; Initiate Window Picker. Maybe I should exchange this with a keystroke instead.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/05/compiz-gnome-desktop-effects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Radeon: reserve failed for wait in /var/log/messages</title>
		<link>http://billauer.co.il/blog/2012/04/radeon-compiz-messages/</link>
		<comments>http://billauer.co.il/blog/2012/04/radeon-compiz-messages/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 09:20:56 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux kernel]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2786</guid>
		<description><![CDATA[Looking at my system log (kernel 2.6.35.4), this is a common thing: Apr 24 12:04:49 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait Apr 24 12:04:49 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait Apr 24 12:04:51 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait Apr 24 12:04:51 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for [...]]]></description>
			<content:encoded><![CDATA[<p>Looking at my system log (kernel 2.6.35.4), this is a common thing:</p>
<pre>Apr 24 12:04:49 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait
Apr 24 12:04:49 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait
Apr 24 12:04:51 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait
Apr 24 12:04:51 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait
Apr 24 12:04:57 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait
Apr 24 12:05:08 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait
Apr 24 12:05:14 kernel: radeon 0000:01:00.0: ffff8802d0aa1a00 reserve failed for wait</pre>
<p>This doesn&#8217;t sound too good, but it looks like it&#8217;s harmless, according to <a href="http://www.spinics.net/lists/dri-devel/msg04607.html" target="_blank">this</a> and <a href="http://permalink.gmane.org/gmane.comp.video.dri.devel/50691" target="_blank">this</a>. It also looks like the decision was to remove the error message, rather than to fix something else. I suppose this issue is old news pretty soon.</p>
<p>It <a href="https://bugzilla.redhat.com/show_bug.cgi?id=636295" target="_blank">has been suggested</a> that this error message appears only when <a href="http://www.compiz.org/" target="_blank">compiz</a> (that cool OpenGL toy making all kinds of effects on the desktop).</p>
<p>So just let it be.</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/04/radeon-compiz-messages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No sound on Firefox on x86_64 Linux with Pulseaudio / ALSA</title>
		<link>http://billauer.co.il/blog/2012/04/alsa-upgrade-firefox-pulseaudio-flash-html5-adobe/</link>
		<comments>http://billauer.co.il/blog/2012/04/alsa-upgrade-firefox-pulseaudio-flash-html5-adobe/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 07:30:14 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2773</guid>
		<description><![CDATA[This is yet another suggestion on what to do if the Firefox doesn&#8217;t play sound (with flash videos in particular) but all other applications do (mplayer, for example). The video in Firefox runs smoothly, but no sound at all. This is a popular subject on the web, it turns out. My platform: Fedora Core 12, [...]]]></description>
			<content:encoded><![CDATA[<p>This is yet another suggestion on what to do if the Firefox doesn&#8217;t play sound (with flash videos in particular) but all other applications do (mplayer, for example). The video in Firefox runs smoothly, but no sound at all. This is a popular subject on the web, it turns out.</p>
<p>My platform: Fedora Core 12, 64 bit, hda sound card. I should also mention this all was fine on my computer until I upgraded  to alsa-1.0.24 kernel drivers from sources. With  &#8220;make install-modules&#8221; (as opposed to &#8220;make install&#8221;). Even after this installation, I don&#8217;t have an ALSA init script on my  computer (and neither should I have one, as the drivers are autoloaded  anyhow).</p>
<p>The first thing to do is to go to System &gt; Preferences &gt; Sound and pick the &#8220;Applications&#8221; tab. Now do something that does play sound. The application should be listed there while the sound is played. Stop playing, and the application vanishes from the list.</p>
<p>Now try to play a flash video. If you&#8217;re lucky, the Firefox applications appears there (as &#8220;ALSA plug-in [firefox-bin]&#8220;), only with the sound muted or volume very low. Just fix that, and you&#8217;re good.</p>
<p>In my case, nothing appeared on this list when playing a video on Firefox. This means that Firefox doesn&#8217;t connect to Pulseaudio at all. This has in fact nothing to do with the flash player: This happens when the video is played in HTML5 mode as well (a common situation in Youtube, for example).</p>
<p>Like many others who have addressed this issue, I know how I solved it, but not why things broke in the first place.</p>
<p>The problem, as it turned out, was that Firefox didn&#8217;t find the /usr/lib/alsa-lib/libasound_module_pcm_pulse.so shared library. Note that it&#8217;s &#8220;lib&#8221; and not &#8220;lib64&#8243; it was looking for, because the part producing sound runs in 32-bit mode. Or something like that.</p>
<p>So I went</p>
<pre>$ yum provides '/usr/lib/alsa-lib/libasound_module_pcm_pulse.so'</pre>
<p>Which told me I needed alsa-plugins-pulseaudio-1.0.21-2.fc12.i686. I then went (as root):</p>
<pre># yum install alsa-plugins-pulseaudio-1.0.21-2.fc12.i686</pre>
<p>just to be told by yum that &#8220;package alsa-plugins-pulseaudio-1.0.22-1.fc12.x86_64 (which is newer than alsa-plugins-pulseaudio-1.0.21-2.fc12.i686) is already installed&#8221;. This is when I really love this RPM magic.</p>
<p>Googled for the exact RPM file, downloaded it, and basically went (nothing like the &#8211;force flag)</p>
<pre># rpm -i --force alsa-plugins-pulseaudio-1.0.21-2.fc12.i686.rpm</pre>
<p>And the sound is back. Hurray! Not. That problem shouldn&#8217;t have started in the first place.</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/04/alsa-upgrade-firefox-pulseaudio-flash-html5-adobe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows: Tracking process launches and ends</title>
		<link>http://billauer.co.il/blog/2012/04/windows-thread-watch-start-stop/</link>
		<comments>http://billauer.co.il/blog/2012/04/windows-thread-watch-start-stop/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 19:40:22 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2758</guid>
		<description><![CDATA[I&#8217;m sure there&#8217;s a saner way to do this than the Perl script below, but jotting it down was so easy, that it wasn&#8217;t worth looking for another tool to do it. The idea is the simplest ever: Grab the list of processes 10 times a second or so, and write a line to standard [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sure there&#8217;s a saner way to do this than the Perl script below, but jotting it down was so easy, that it wasn&#8217;t worth looking for another tool to do it.</p>
<p>The idea is the simplest ever: Grab the list of processes 10 times a second or so, and write a line to standard output when a change is detected. If a process lives longer than ~100 ms, it&#8217;s caught.</p>
<p>The correct way to do this would be to use some kind of hook of the Windows operating system. Or more precisely, look for a program that already does that. And then hope that program isn&#8217;t some kind of spyware.</p>
<p>So here&#8217;s the script. You may need to install Win32::Process::List from somewhere, assuming you have Perl on board anyhow.</p>
<p>Perl code:</p>
<pre>#!/usr/bin/perl

use strict;
use warnings;
use Win32::Process::List;

my %old = ();

while (1) { 
  my $P = Win32::Process::List-&gt;new();  # constructor

  select(undef, undef, undef, 0.1);

  my $now = scalar localtime time();

  my %list = $P-&gt;GetProcesses();

  %old = %list
    unless (%old);

  my %left = %old;

  foreach my $key ( keys %list ) {
    print "START $now: PID $key, $list{$key}\n"
      if (not defined $old{$key});

   delete $left{$key};
  }

  foreach my $key ( keys %left ) {
    print "STOP  $now: PID $key, $left{$key}\n";
  }
  %old = %list;
}
</pre>
<p>This is what the output can look like (screensaver, then FacebookUpdate and then what happens when I open a new window on Firefox).</p>
<pre>&gt; perl processtrace.pl
START Mon Apr 16 22:04:07 2012: PID 1380, sstext3d.scr
STOP  Mon Apr 16 22:04:50 2012: PID 1380, sstext3d.scr
START Mon Apr 16 22:27:00 2012: PID 2144, FacebookUpdate.
STOP  Mon Apr 16 22:27:03 2012: PID 2144, FacebookUpdate.
START Mon Apr 16 22:28:05 2012: PID 2268, jqsnotify.exe
STOP  Mon Apr 16 22:28:07 2012: PID 2268, jqsnotify.exe</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/04/windows-thread-watch-start-stop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows device drivers: Notes to self</title>
		<link>http://billauer.co.il/blog/2012/04/wdk-ddk-windows-kernel-driver/</link>
		<comments>http://billauer.co.il/blog/2012/04/wdk-ddk-windows-kernel-driver/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 21:55:03 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows device drivers]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2754</guid>
		<description><![CDATA[Yet another messy post with just things I wrote down while developing a device driver for Windows. Not necessary coherent, not necessarily accurate. General notes while playing around “Read the source”, WDK-style: Read the inc\ddk\wdm.h include file, which supplies a lot of information and hints. Sometimes it’s much better than the docs. There are also [...]]]></description>
			<content:encoded><![CDATA[<p>Yet another messy post with just things I wrote down while developing a device driver for Windows. Not necessary coherent, not necessarily accurate.</p>
<h3>General notes while playing around</h3>
<ul>
<li>“Read the source”, WDK-style: Read the inc\ddk\wdm.h include file,  which supplies a lot of information and hints. Sometimes it’s much  better than the docs. There are also sources for the implementation of  basic functions such as open(), printf() etc. in Visual Studio’s  installation directory.</li>
<li>A list of status codes can be found <a href="http://msdn.microsoft.com/en-us/library/cc704588%28v=prot.10%29.aspx" target="_blank">here</a>.  Possibly relevant in particular: STATUS_UNSUCCESSFUL,   STATUS_NOT_IMPLEMENTED, STATUS_INVALID_PARAMETER, STATUS_NO_MEMORY,  STATUS_INVALID_DEVICE_REQUEST, STATUS_DEVICE_BUSY, STATUS_END_OF_FILE,  STATUS_ACCESS_DENIED, STATUS_DATA_ERROR, STATUS_NO_SUCH_DEVICE,  STATUS_NO_SUCH_FILE, STATUS_OBJECT_NAME_NOT_FOUND,   STATUS_INSUFFICIENT_RESOURCES, STATUS_IO_TIMEOUT,  STATUS_FILE_FORCED_CLOSED,  STATUS_CANCELLED, STATUS_NOT_FOUND,  STATUS_RETRY, STATUS_RECEIVE_PARTIAL</li>
<li>IRP’s major determine the dispatch routine launched (as set by  DriverEntry). The minor is interpreted by the dispatch routine itself.</li>
<li>A list of safe string functions: In <a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff563885%28v=vs.85%29.aspx" target="_blank">MSDN’s page</a></li>
<li>How to use symbolic links to create a name space: <a href="http://www.wd-3.com/archive/namespace.htm" target="_blank">here</a>.</li>
<li>To see the internal object structure (and symbolic links), download <a href="http://technet.microsoft.com/en-us/sysinternals/bb896657" target="_blank">WinObj from somewhere</a>.</li>
<li>Sniff IRPs in the system: Download <a href="http://www.osronline.com/article.cfm?article=199" target="_blank">IrpTracker</a>.</li>
<li>MSDN’s explanation on <a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463219" target="_blank">resource rebalancing</a>, why, how and what to do about it.</li>
<li>On a typical open for write, DesiredAccess=0x00120196  (FILE_GENERIC_WRITE | READ_CONTROL). On an open for read,  DesiredAccess=0x00120089 (FILE_GENERIC_READ | READ_CONTROL). This is  based upon command line &gt; and &lt;. Trying to “dir” the file gives  DesiredAccess=0x00000080.</li>
<li><a href="http://support.microsoft.com/kb/120170" target="_blank">The difference between IRP_MJ_CLEANUP and IRP_MJ_CLOSE</a>:  IRP_MJ_CLEANUP is called when the file is officially closed (all owners  of the file handle have closed it). IRP_MJ_CLOSE is called when the  file handle can be removed, which is when all outstanding IRPs have been  completed as well. Note that IRP_MJ_CLEANUP dispatch routine must walk  through the queue and cancel all requests (Why doesn’t the system do  this?). Note that non-I/O IRPs for the file handler <a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff548608%28v=vs.85%29.aspx" target="_blank">may still arrive</a> for the file handler.</li>
<li>Do implement a handler for IRP_MJ_SET_INFORMATION, so that such an  IRP doesn’t fail. Even a yes-yes handler doing nothing but returning  success. In particular, Cygwin sends this IRP with  FileEndOfFileInformation when writing to a regular file. Go figure.</li>
<li>Using MmGetMdlByteCount(irp-&gt;MdlAddress) to get the number of  bytes to read or write is bad: It causes a bugcheck if the number of  bytes to read or write is zero. Which is bad behavior from the  application’s side, and still.</li>
<li>Not directly relevant, but user space applications with POSIX functions such as open(), read() close() and friends <a href="http://msdn.microsoft.com/en-us/library/z0kc8e3z%28v=vs.71%29.aspx" target="_blank">should include &lt;io.h&gt;</a> rather than &lt;unistd.h&gt; which doesn’t exist on VC++.</li>
<li>Setting the DeviceType parameter is utterly important, since the  native fopen() and open() calls will fail with an “Invalid Argument”  error otherwise. The parameter in the call to IoCreateDevice() is <strong>ignored</strong> since the actual type is taken from the PDO. Hence a line in the INF file for setting up a registry value is necessary.</li>
<li>When seeking a file, be either with POSIX-style _seek() and friends,  or with native SetFilePointer(), this merely updates CurrentByteOffset,  but no IRP is issued, so the device has no idea it happened at all. In  particular, no IRP_MJ_SET_INFORMATION IRP with class  FilePositionInformation is issued, despite what one could expect. At  least so it works in Windows 7.</li>
<li>pnpdtest should be run with the verifier (standard Windows utility)  configured for toughest tests specifically on the driver. Just type  “verifier” at command prompt, reboot, and run pnpdtest. To run verifier  with a good set of tests, go<br />
&gt; verifier /volatile /flags 0xbfb /adddriver mydriver.sys</li>
<li>Unlike Linux, the allocation of PCI resources (BAR addresses and  interrupts) is not exclusive. As a result, if a device driver doesn’t  deallocate the interrupt resource at unload, and hence the pointer to  the ISR remains, attempting to reload the driver will cause a jump to  the unloaded ISR pointer and a bugcheck. In Linux this wouldn’t happen,  because the newly loaded instance of the driver wouldn’t pass the stage  of getting the resources.</li>
</ul>
<h3>Runlevels (IRQLs)</h3>
<p>A very short summary:</p>
<ul>
<li>PASSIVE_LEVEL: The level of user space applications, system threads  and work items specially generated to run in this level. May block, but  in most cases it’s not allowed because of arbitrary thread context.</li>
<li>APC_LEVEL: The special level for delivering data to user applications. Rarely seen, but often considered.</li>
<li>DISPATCH_LEVEL: Used in DPC (Deferred Procedure calls) queued by ISR  or by a custom call. Also, when acquiring a spinlock, the runlevel is  raised to DISPATCH_LEVEL.</li>
<li>Higher levels: When serving interrupts. No kind of mutex can be  acquired (neither spinlocks). Some simple memory operations and queuing  DPCs is more or less what’s left to do.</li>
</ul>
<p>Notes:</p>
<ul>
<li>Paged code runs <strong>below</strong> DISPATCH_LEVEL. So when PAGED_CODE appears in the beginning of a function, it’s at most at APC_LEVEL.</li>
<li>DPCs  run at DISPATCH_LEVEL. When requested, a single instance is  queued and  executed when possible. The DPC instance is dequeued just  before  execution, so if another DPC request occurs immediately after  launching a  DPC, another run will take place, <strong>possibly simultaneously on another CPU</strong>.   On the other hand, if several requests are made before execution is   possible, the DPC is run only once on behalf of these requests.</li>
<li>Custom DPCs can be queued from any runlevel. If the “background   routine” needs to be queued from DISPATCH_LEVEL and down, use a work   item instead.</li>
<li>Confusingly enough, most (almost all) IRP dispatch calls are made in  passive level. To make things more difficult, read, write and ioctl  IRPs can go up to DISPATCH_LEVEL.</li>
</ul>
<h3>Bug check handling</h3>
<p>What to do when the Blue Screen (BSOD) pays a visit. Or more precisely, how to catch exactly where your code wanted to use a zero pointer or something.</p>
<p>It’s important to save the entire binaries directory, including .obj  files, for the driver distributed, since those files are necessary for  bug check dissection.</p>
<p>The files are typically something like:<br />
C:\Windows\Minidump\030312-17503-01.dmp<br />
C:\Users\theuser\AppData\Local\Temp\WER-33571-0.sysdata.xml</p>
<p>Analyze a bugcheck dump (change last file, of course). Be patient. Each step takes time.</p>
<pre>&gt; C:\WinDDK\7600.16385.1\Debuggers\kd.exe -n -y srv*c:\symbols*http://msdl.microsoft.com/download/symbols -i C:\devel\objchk_win7_x86\i386 -z C:\copies\022512-24414-01.dmp</pre>
<p>The symbols which are downloaded are stored in C:\symbols (as required). When those downloads are finished, go</p>
<pre>0: kd&gt; !analyze -v</pre>
<p>Quit with “q”</p>
<p>To get a disassembly of the relevant code, go:</p>
<pre>&gt; dumpbin.exe /disasm \path\to\objchk_win7_x86\i386\project.obj &gt; project.asm</pre>
<p>Note that we disassemble the object file to which the code belongs.  This is necessary get symbol names. That alone is a good reason to  maintain an exact snapshot of released versions. The .sys file can be  disassembled to verify that nothing has changed.</p>
<p>dumpbin.exe is part of the Visual C++ package. The necessary file  bunlde are in my resumption directory, containing dumpbin.exe, link.exe,  msdis140.dll and mspdb71.dll</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/04/wdk-ddk-windows-kernel-driver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>List of FPGA boards and IP cores with PCIe/USB and their vendors</title>
		<link>http://billauer.co.il/blog/2012/04/fpga-pcie-usb-board-ip-core/</link>
		<comments>http://billauer.co.il/blog/2012/04/fpga-pcie-usb-board-ip-core/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 18:58:53 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[FPGA]]></category>
		<category><![CDATA[PCI express]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2697</guid>
		<description><![CDATA[I collected some links for my own use (limiting myself to Virtex-5 and later Xilinx FPGAs). Maybe this can help someone else too. This is by no means a complete list, but additions and corrections are welcome in the comment section below (I may delete your comment and update the list, don&#8217;t take it personally). [...]]]></description>
			<content:encoded><![CDATA[<p>I collected some links for my own use (limiting myself to Virtex-5 and later Xilinx FPGAs). Maybe this can help someone else too. This is by no means a complete list, but additions and corrections are welcome in the comment section below (I may delete your comment and update the list, don&#8217;t take it personally).</p>
<p>So, in no particular order&#8230;</p>
<h3>PCI Express IP Cores</h3>
<ul>
<li><a href="http://xillybus.com" target="_blank">Xillybus</a></li>
<li>Northwest Logic: <a href="http://www.nwlogic.com/products/pci_express_solution.html" target="_blank">Expresso</a></li>
<li>PLDA: <a href="http://www.plda.com/prodetail.php?pid=189" target="_blank">QuickPCIe</a>, <a href="http://www.plda.com/prodetail.php?pid=156" target="_blank">EZDMA</a>, <a href="http://www.plda.com/prodetail.php?pid=202" target="_blank">XpressRICH</a></li>
<li>OpenCores&#8217; <a href="http://opencores.com/project,pcie_sg_dma" target="_blank">PCIe SG DMA controller</a> with <a href="http://li5.ziti.uni-heidelberg.de/mprace/" target="_blank">MPRACE</a> drivers and software library. It&#8217;s free core &amp; software, whether that encourages or discourages you.</li>
</ul>
<h3>PCI Express helper chipsets</h3>
<ul>
<li>PLX&#8217; <a href="http://www.plxtech.com/products/expresslane/pex8311" target="_blank">PEX8311</a></li>
<li>NXP’s <a href="http://ics.nxp.com/products/pcie/phys/" target="_blank">PX1011</a></li>
</ul>
<h3>USB chipsets</h3>
<ul>
<li>Cypress <a href="http://www.cypress.com/?id=193" target="_blank">EZ-USB FX2LP</a> (CY7C68013A and friends)</li>
<li>FDTI <a href="http://www.ftdichip.com/Products/ICs/FT2232H.htm" target="_blank">FT2232H UART/FIFO</a></li>
<li>TI’s <a href="http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;familyId=1342&amp;uiTemplateId=NODE_STRY_PGE_T" target="_blank">TUSB</a> series of transceivers. PHY only, without USB’s logical protocol, which is a lot to implement.</li>
<li>SMSC’s <a href="http://www.smsc.com/index.php?tid=143&amp;pid=25" target="_blank">USB3250 </a>(PHY only as well)</li>
</ul>
<h3>PCI Express boards</h3>
<p>The boards listed have native PCIe connection (that is, with no PCIe bridge)</p>
<ul>
<li>Xilinx official boards, of course: <a href="http://www.xilinx.com/products/boards-and-kits/EK-V6-ML605-G.htm" target="_blank">ML506</a>, <a href="http://www.xilinx.com/products/boards-and-kits/EK-S6-SP605-G.htm" target="_blank">SP605</a>, <a href="http://www.xilinx.com/products/boards-and-kits/EK-V6-ML605-G.htm" target="_blank">ML605</a>, <a href="http://www.xilinx.com/products/boards-and-kits/EK-K7-KC705-G.htm" target="_blank">KC705</a> and <a href="http://www.xilinx.com/products/boards-and-kits/EK-V7-VC707-G.htm" target="_blank">VC707 </a>with Virtex-5, Spartan-6, Virtex-6, Kintex-7 and Virtex-7 respectively.</li>
<li>Avnet: <a href="http://www.em.avnet.com/en-us/design/drc/Pages/Xilinx-Virtex-5-LXTSXT-PCI-Express-Development-Kit.aspx" target="_blank">Board for Virtex-5</a> and the <a href="http://www.xilinx.com/products/boards-and-kits/AES-S6DEV-LX150T-G.htm" target="_blank">Spartan-6 LX150T board</a>.</li>
<li>National instruments: <a href="http://www.ni.com/fpga-hardware/choose-hardware/" target="_blank">Several boards</a>, mostly with PXI interface.</li>
<li>Nallatech: <a href="http://www.nallatech.com/PCI-Express-FPGA-Cards/benone-pcie.html" target="_blank">BenONE-PCIe</a>, <a href="http://www.nallatech.com/PCI-Express-FPGA-Cards/pcie-180-low-profile-10gbe-accelerator-card-featuring-xilinx-virtex-5-fpga-and-memory.html" target="_blank">PCIe-180</a>, <a href="http://www.nallatech.com/PCI-Express-Cards/pcie-data.html" target="_blank">PCIe-DATA</a>, <a href="http://www.nallatech.com/PCI-Express-FPGA-Cards/pcie-280-8-lane-pci-express-20-accelerator-card-featuring-xilinx-virtex-5-fpga-and-memory.html" target="_blank">PCIe-280</a>,  and <a href="http://www.nallatech.com/PCI-Express-FPGA-Cards/pcie-287n-7-series-fpga-network-processing-card.html" target="_blank">PCIe-287N</a></li>
<li>Hitech Global: <a href="http://hitechglobal.com/Boards/allboards.htm" target="_blank">A whole bunch of them</a>.</li>
<li>Enterpoint: The <a href="http://www.enterpoint.co.uk/raggedstone/raggedstone2.html" target="_blank">Raggedstone 2</a> board</li>
<li>Opal Kelly: <a href="http://www.opalkelly.com/products/xem6110/" target="_blank">XEM6110</a></li>
<li><a href="http://www.dinigroup.com/new/index.php" target="_blank">Dini Group</a>: Lots of boards, aimed at HPC</li>
<li>Signatec, a whole range of FPGA <a href="http://www.signatec.com/products/high-speed-signal-technology-products-services.html" target="_blank">mixed-signal boards</a>.</li>
<li><a href="http://www.fiberblaze.com/products.html" target="_blank">Fiberblaze</a>: Several boards, little docs on the site.</li>
<li>Pico Computing: <a href="http://www.picocomputing.com/e_series.html" target="_blank">PICO E-17</a> in ExpressCard form factor, and the <a href="http://www.picocomputing.com/m_series.html" target="_blank">M-Series</a>.</li>
<li>PLDA: <a href="http://www.plda.com/prodetail.php?pid=191" target="_blank">Several boards</a>. It&#8217;s notable that ExpressGenV2 is distributed by other vendors.</li>
<li>GE Intelligent Platforms: <a href="http://defense.ge-ip.com/products/2257" target="_blank">ICS-1650</a></li>
<li>InveaTech: <a href="http://www.invea-tech.com/products-and-services/combo-fpga-boards" target="_blank">Combo cards</a></li>
<li>Digilent <a href="http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,856&amp;Prod=CML-OPUS" target="_blank">Opus Virtex-5 board</a></li>
<li><a href="http://product.inrevium.com/" target="_blank">Inrevium</a>: A whole lot of boards.</li>
<li>KNJN <a href="http://www.knjn.com/FPGA-PCIe.html" target="_blank">Dragon-E</a></li>
<li>Sundance: Several <a href="http://www.sundance.com/products.php?page=pxie" target="_blank">PXIe boards</a>.</li>
<li>Ultraview: Several <a href="http://ultraviewcorp.com/displayproduct.php?cat_id=1" target="_blank">data acquisition boards</a> + <a href="http://ultraviewcorp.com/displayproduct.php?cat_id=2" target="_blank">look here</a> as well..</li>
<li>Enclustra: <a href="http://www.enclustra.com/en/products/fpga-modules/mars-mx2/" target="_blank">Mars MX2</a></li>
</ul>
<h3>EZUSB boards</h3>
<ul>
<li>Opal Kelly: <a href="http://www.opalkelly.com/products/" target="_blank">Several boards</a></li>
<li>Avnet: <a href="http://www.em.avnet.com/en-us/design/drc/Pages/Xilinx-Virtex-5-LX-Evaluation-Kit.aspx" target="_blank">Virtex-5 eval kit</a></li>
<li>CESYS: <a href="http://www.cesys.com/en/products/kategorie/fpga-boards-spartan/produkt/usbs6.html" target="_blank">USBS6</a></li>
<li>Digilent: <a href="http://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,400&amp;Cat=10&amp;FPGA" target="_blank">Several boards</a></li>
<li>Inrevium: <a href="http://solutions.inrevium.com/products/base/virtex6/tb-6v-lx760-lsi.html" target="_blank">TB-6V-LX760-LSI</a></li>
<li>Pico Computing: <a href="http://www.picocomputing.com/e_series.html" target="_blank">E-101</a></li>
<li>Xilinx&#8217; <a href="http://www.xilinx.com/products/boards-and-kits/HW-V5-ML501-UNI-G.htm" target="_blank">ML501</a> with the CY7C67300 EZ-Host</li>
<li>Ztex: A lot of <a href="http://www.ztex.de/" target="_blank">small boards</a></li>
</ul>
<h3>Other USB boards</h3>
<ul>
<li>ComBlock: <a href="http://www.comblock.com/product_list.html" target="_blank">Several boards</a>,  USB3250 based</li>
<li>Dini Group: <a href="http://www.dinigroup.com/new/xilinx.php" target="_blank">Several (heavy) boards</a>, USB goes to a Marvell MV78200 SoC</li>
</ul>
<p>The full list of boards (all types) is <a href="http://www.fpga-faq.com/FPGA_Boards.shtml" target="_blank">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/04/fpga-pcie-usb-board-ip-core/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Authoritative timestamping: Some silly games</title>
		<link>http://billauer.co.il/blog/2012/03/ts-tsget-timestamp/</link>
		<comments>http://billauer.co.il/blog/2012/03/ts-tsget-timestamp/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 15:24:51 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2676</guid>
		<description><![CDATA[Ever wanted to prove you knew something before everyone else? Here&#8217;s the way: You write it down in a file, and timestamp it. Then, when you want to prove you were there first, you&#8217;ll show the original file, the signed timestamp, and then everyone know you&#8217;re a hopeless geek. But this can help a bit [...]]]></description>
			<content:encoded><![CDATA[<p>Ever wanted to prove you knew something before everyone else? Here&#8217;s the way: You write it down in a file, and timestamp it. Then, when you want to prove you were there first, you&#8217;ll show the original file, the signed timestamp, and then everyone know you&#8217;re a hopeless geek.</p>
<p>But this can help a bit if something goes wrong with timestamp servers used to sign software.</p>
<p>Anyhow, I have to admit I know very little about this issue. In particular, I have no idea how to dissect the timestamp file (tsr). Ideas are welcome as comments below.</p>
<p>You may need to install a certain package (or several):</p>
<pre># yum install openssl-perl</pre>
<p>And this can never hurt:</p>
<pre>$ man ts</pre>
<p>Now suppose that the file containing our genius knowledge is in thefile.txt.</p>
<pre>$ openssl ts -query -data thefile.txt -cert -out request.tsq</pre>
<p>This created the request to be sent to the timestamp server. The important part is that the hash of thefile.txt is in there, so the timestamping is specific to the file.</p>
<p>Now read the manual a bit again&#8230;</p>
<pre>$ man tsget</pre>
<p>and go timestamping!</p>
<pre>$ /etc/pki/tls/misc/tsget -h http://tsa.starfieldtech.com -o timestamp.tsr request.tsq</pre>
<p>Pardon my weird path. This is how yum installed it.</p>
<p>The server mentioned above is GoDaddy&#8217;s official timestamp server, so the reply stored in timestamp.tsr is a real proof. If you want to use this in court, expect to pay a lot to experts and hope the judge doesn&#8217;t kick you out before you&#8217;re done with all the technicalities. But hey, that&#8217;s a watertight proof you paid nothing to get (and it&#8217;s probably worth accordingly).</p>
<p>It would be wonderful to know what&#8217;s actually in that timestamp. I know for a fact that the file&#8217;s hash has to be there, as well as the digital signature of the issuer of the time stamp. Lacking a better tool to peek inside, I just went:</p>
<pre>$ strings -n 10 timestamp.tsr
20120330152409Z
Starfield Technologies, Inc.1200
)Starfield Class 2 Certification Authority0
110503070000Z
160503070000Z0
Scottsdale1%0#
Starfield Technologies, Inc.1301
*http://certs.starfieldtech.com/repository/1&amp;0$
Starfield Timestamp Authority0

http://ocsp.starfieldtech.com/08

'http://crl.starfieldtech.com/sfroot.crl0S
+https://certs.starfieldtech.com/repository/0
Starfield Technologies, Inc.1200
)Starfield Class 2 Certification Authority
120330152409Z0</pre>
<p>So there are some clues here. I dissector to cleartext would be nice, though. Ideas, anyone?</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/03/ts-tsget-timestamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When Cygwin gets fussy about forking a new process</title>
		<link>http://billauer.co.il/blog/2012/02/cygwin-fork-retry/</link>
		<comments>http://billauer.co.il/blog/2012/02/cygwin-fork-retry/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 11:28:00 +0000</pubDate>
		<dc:creator>eli</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://billauer.co.il/blog/?p=2645</guid>
		<description><![CDATA[Things like 3 [main] bash 2216 child_info_fork::abort: data segment start: parent(0x26D000) != child(0x38D000) -bash: fork: retry: Resource temporarily unavailable It appears to be a recent Red Hat mishap. One of those bugs that happen because of the common belief that if you don&#8217;t play around with your software all the time, it will be considered [...]]]></description>
			<content:encoded><![CDATA[<p>Things like</p>
<pre>     3 [main] bash 2216 child_info_fork::abort: data segment start: parent(0x26D000) !=     child(0x38D000)
-bash: fork: retry: Resource temporarily unavailable</pre>
<p>It appears to be a recent Red Hat mishap. One of those bugs that happen because of the common belief that if you don&#8217;t play around with your software all the time, it will be considered dead.</p>
<p>Workaround: Close all Cygwin programs (and windows of course), find the ash.exe in the /bin directory, and double click it to open a primitive command window.</p>
<p>Go</p>
<pre>$ /bin/rebaseall</pre>
<p>And the problem is over with. I won&#8217;t bother understanding what went wrong, since the explanation is most like not very inspiring in cases like this. More about rebaseall <a href="http://cygwin.wikia.com/wiki/Rebaseall" target="_blank">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://billauer.co.il/blog/2012/02/cygwin-fork-retry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

