Add a new misc test suite with addpcis tests

The two tests obtain NIA with bl+mflr+addi and then compare it
against addpcis with the minimum and maximum immediate operand values.

They were also tested on a real POWER9 system (in userspace) for good
measure.

Signed-off-by: Shawn Anastasio <shawn@anastas.io>
pull/183/head
Shawn Anastasio 4 years ago
parent e606772aeb
commit 8b161c6dc6

@ -0,0 +1,3 @@
TEST=misc

include ../Makefile.test

@ -0,0 +1,102 @@
/* Copyright 2013-2014 IBM Corp.
* Copyrignt 2020 Shawn Anastasio
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#define STACK_TOP 0x2000

/* Load an immediate 64-bit value into a register */
#define LOAD_IMM64(r, e) \
lis r,(e)@highest; \
ori r,r,(e)@higher; \
rldicr r,r, 32, 31; \
oris r,r, (e)@h; \
ori r,r, (e)@l;

.section ".head","ax"

/*
* Microwatt currently enters in LE mode at 0x0, so we don't need to
* do any endian fix ups
*/
. = 0
.global _start
_start:
b boot_entry

.global boot_entry
boot_entry:
/* setup stack */
LOAD_IMM64(%r1, STACK_TOP - 0x100)
LOAD_IMM64(%r12, main)
mtctr %r12
bctrl
attn // terminate on exit
b .


/* Test addpcis with an immediate operand of 0 (min) */
.global test_addpcis_1
test_addpcis_1:
mflr %r0
std %r0, 16(%r1)
stdu %r1, -32(%r1)

/* get address of 1 */
bl 1f
1: mflr %r4
addpcis %r5, 0

/*
* At this point, r5 should equal r4 + 2*4
* return 0 if they're equal.
*/
addi %r4, %r4, 8

sub %r3, %r4, %r5

addi %r1, %r1, 32
ld %r0, 16(%r1)
mtlr %r0

blr

/* Test addpcis with an immediate operand of 0xFFFF (max) */
.global test_addpcis_2
test_addpcis_2:
mflr %r0
std %r0, 16(%r1)
stdu %r1, -32(%r1)

/* get address of 1 */
bl 1f
1: mflr %r4
addpcis %r5, 0xFFFF

/*
* Add 8 to r4 to bring it in line with addpcis' NIA.
* Then add 0xFFFF shifted and compare.
*/
addi %r4, %r4, 8
addis %r4, %r4, 0xFFFF

sub %r3, %r4, %r5

addi %r1, %r1, 32
ld %r0, 16(%r1)
mtlr %r0

blr

@ -0,0 +1,44 @@
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>

#include "console.h"

#define TEST "Test "
#define PASS "PASS\n"
#define FAIL "FAIL\n"

extern long test_addpcis_1(void);
extern long test_addpcis_2(void);

// i < 100
void print_test_number(int i)
{
puts(TEST);
putchar(48 + i/10);
putchar(48 + i%10);
putchar(':');
}

int main(void)
{
int fail = 0;

potato_uart_init();

print_test_number(1);
if (test_addpcis_1() != 0) {
fail = 1;
puts(FAIL);
} else
puts(PASS);

print_test_number(2);
if (test_addpcis_2() != 0) {
fail = 1;
puts(FAIL);
} else
puts(PASS);

return fail;
}

@ -0,0 +1,13 @@
SECTIONS
{
_start = .;
. = 0;
.head : {
KEEP(*(.head))
}
. = 0x1000;
.text : { *(.text) }
. = 0x2000;
.data : { *(.data) }
.bss : { *(.bss) }
}

Binary file not shown.

@ -0,0 +1,2 @@
Test 01:PASS
Test 02:PASS

@ -3,7 +3,7 @@
# Script to update console related tests from source
#

for i in sc illegal decrementer xics privileged mmu ; do
for i in sc illegal decrementer xics privileged mmu misc ; do
cd $i
make
cd -

Loading…
Cancel
Save