blob: 67108764bddee589ac1925aa64aae50a2af70f81 [file] [log] [blame]
/* $IdPath$
*
* Copyright (C) 2001 Peter Johnson
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "util.h"
#include "check.h"
#include "bytecode.h"
#include "bc-int.h"
#include "arch.h"
#include "x86arch.h"
START_TEST(test_x86_ea_new_reg)
{
effaddr *ea;
x86_effaddr_data *ead;
int i;
/* Test with NULL */
ea = x86_ea_new_reg(1);
fail_unless(ea != NULL, "Should die if out of memory (not return NULL)");
/* Test structure values function should set */
fail_unless(ea->len == 0, "len should be 0");
ead = ea_get_data(ea);
fail_unless(ead->segment == 0, "Should be no segment override");
fail_unless(ead->valid_modrm == 1, "Mod/RM should be valid");
fail_unless(ead->need_modrm == 1, "Mod/RM should be needed");
fail_unless(ead->valid_sib == 0, "SIB should be invalid");
fail_unless(ead->need_sib == 0, "SIB should not be needed");
free(ea);
/* Exhaustively test generated Mod/RM byte with register values */
for(i=0; i<8; i++) {
ea = x86_ea_new_reg(i);
ead = ea_get_data(ea);
fail_unless(ead->modrm == (0xC0 | (i & 0x07)),
"Invalid Mod/RM byte generated");
free(ea);
}
}
END_TEST
static Suite *
bytecode_suite(void)
{
Suite *s = suite_create("bytecode");
TCase *tc_conversion = tcase_create("Conversion");
suite_add_tcase(s, tc_conversion);
tcase_add_test(tc_conversion, test_x86_ea_new_reg);
return s;
}
int
main(void)
{
int nf;
Suite *s = bytecode_suite();
SRunner *sr = srunner_create(s);
srunner_run_all(sr, CRNORMAL);
nf = srunner_ntests_failed(sr);
srunner_free(sr);
suite_free(s);
return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}