genode/os/src/test/part_blk/main.cc

116 lines
2.7 KiB
C++

/*
* \brief Test that reads and writes the first and the last block of a given
* block device
* \author Sebastian Sumpf
* \date 2011-05-30
*/
/*
* Copyright (C) 2011-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#include <base/allocator_avl.h>
#include <block_session/connection.h>
#include <os/config.h>
static const int verbose = 0;
using namespace Genode;
static Allocator_avl _block_alloc(env()->heap());
static Block::Connection _blk(&_block_alloc);
static size_t _blk_size;
class Sector
{
private:
Block::Packet_descriptor _p;
public:
Sector(unsigned long blk_nr, unsigned long count, bool write = false)
{
Block::Packet_descriptor::Opcode op = write ? Block::Packet_descriptor::WRITE
: Block::Packet_descriptor::READ;
try {
_p = Block::Packet_descriptor( _blk.dma_alloc_packet(_blk_size * count),
op, blk_nr, count);
} catch (Block::Session::Tx::Source::Packet_alloc_failed) {
PERR("Packet overrun!");
_p = _blk.tx()->get_acked_packet();
}
}
~Sector() { _blk.tx()->release_packet(_p); }
template <typename T>
T addr() { return reinterpret_cast<T>(_blk.tx()->packet_content(_p)); }
void submit_request()
{
_blk.tx()->submit_packet(_p);
_p = _blk.tx()->get_acked_packet();
if (!_p.succeeded())
PERR("Could not access block %zu", _p.block_number());
}
};
int main()
{
unsigned pattern;
try {
Genode::config()->xml_node().attribute("pattern").value(&pattern); }
catch (...) { PERR("Test Failed"); return 1; }
size_t blk_count;
Block::Session::Operations ops;
_blk.info(&blk_count, &_blk_size, &ops);
if (verbose)
printf("Found device %zu blocks of %zu bytes\n", blk_count, _blk_size);
/* write first and last block of device useing 'pattern' */
{
Sector s(0, 1, true);
memset(s.addr<void *>(), pattern, _blk_size);
s.submit_request();
Sector s_last(blk_count - 1, 1, true);
memset(s_last.addr<void *>(), 2 * pattern, _blk_size);
s_last.submit_request();
}
/* read first and last block from device and compare to 'pattern' */
Sector s(0, 1);
s.submit_request();
Sector s_last(blk_count - 1, 1);
s_last.submit_request();
unsigned *val = s.addr<unsigned *>();
unsigned *val_last = s_last.addr<unsigned *>();
unsigned cmp_val, cmp_val_last;
memset(&cmp_val, pattern, 4);
memset(&cmp_val_last, 2 * pattern, 4);
if (verbose) {
printf("READ blk %05u: %x\n", 0, *val);
printf("READ blk %05zu: %x\n", blk_count - 1, *val_last);
}
if (*val != cmp_val || *val_last != cmp_val_last)
printf("Failed\n");
else
printf("Success\n");
return 0;
}