162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci **************************************************************************** 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * "DHRYSTONE" Benchmark Program 662306a36Sopenharmony_ci * ----------------------------- 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Version: C, Version 2.1 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * File: dhry_1.c (part 2 of 3) 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * Date: May 25, 1988 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * Author: Reinhold P. Weicker 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci **************************************************************************** 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include "dhry.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include <linux/ktime.h> 2262306a36Sopenharmony_ci#include <linux/slab.h> 2362306a36Sopenharmony_ci#include <linux/string.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* Global Variables: */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciint Int_Glob; 2862306a36Sopenharmony_cichar Ch_1_Glob; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic Rec_Pointer Ptr_Glob, Next_Ptr_Glob; 3162306a36Sopenharmony_cistatic Boolean Bool_Glob; 3262306a36Sopenharmony_cistatic char Ch_2_Glob; 3362306a36Sopenharmony_cistatic int Arr_1_Glob[50]; 3462306a36Sopenharmony_cistatic int Arr_2_Glob[50][50]; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic void Proc_3(Rec_Pointer *Ptr_Ref_Par) 3762306a36Sopenharmony_ci/******************/ 3862306a36Sopenharmony_ci/* executed once */ 3962306a36Sopenharmony_ci/* Ptr_Ref_Par becomes Ptr_Glob */ 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci if (Ptr_Glob) { 4262306a36Sopenharmony_ci /* then, executed */ 4362306a36Sopenharmony_ci *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci Proc_7(10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); 4662306a36Sopenharmony_ci} /* Proc_3 */ 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic void Proc_1(Rec_Pointer Ptr_Val_Par) 5062306a36Sopenharmony_ci/******************/ 5162306a36Sopenharmony_ci/* executed once */ 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; 5462306a36Sopenharmony_ci /* == Ptr_Glob_Next */ 5562306a36Sopenharmony_ci /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ 5662306a36Sopenharmony_ci /* corresponds to "rename" in Ada, "with" in Pascal */ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci *Ptr_Val_Par->Ptr_Comp = *Ptr_Glob; 5962306a36Sopenharmony_ci Ptr_Val_Par->variant.var_1.Int_Comp = 5; 6062306a36Sopenharmony_ci Next_Record->variant.var_1.Int_Comp = 6162306a36Sopenharmony_ci Ptr_Val_Par->variant.var_1.Int_Comp; 6262306a36Sopenharmony_ci Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; 6362306a36Sopenharmony_ci Proc_3(&Next_Record->Ptr_Comp); 6462306a36Sopenharmony_ci /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp == Ptr_Glob->Ptr_Comp */ 6562306a36Sopenharmony_ci if (Next_Record->Discr == Ident_1) { 6662306a36Sopenharmony_ci /* then, executed */ 6762306a36Sopenharmony_ci Next_Record->variant.var_1.Int_Comp = 6; 6862306a36Sopenharmony_ci Proc_6(Ptr_Val_Par->variant.var_1.Enum_Comp, 6962306a36Sopenharmony_ci &Next_Record->variant.var_1.Enum_Comp); 7062306a36Sopenharmony_ci Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; 7162306a36Sopenharmony_ci Proc_7(Next_Record->variant.var_1.Int_Comp, 10, 7262306a36Sopenharmony_ci &Next_Record->variant.var_1.Int_Comp); 7362306a36Sopenharmony_ci } else { 7462306a36Sopenharmony_ci /* not executed */ 7562306a36Sopenharmony_ci *Ptr_Val_Par = *Ptr_Val_Par->Ptr_Comp; 7662306a36Sopenharmony_ci } 7762306a36Sopenharmony_ci} /* Proc_1 */ 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistatic void Proc_2(One_Fifty *Int_Par_Ref) 8162306a36Sopenharmony_ci/******************/ 8262306a36Sopenharmony_ci/* executed once */ 8362306a36Sopenharmony_ci/* *Int_Par_Ref == 1, becomes 4 */ 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci One_Fifty Int_Loc; 8662306a36Sopenharmony_ci Enumeration Enum_Loc; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci Int_Loc = *Int_Par_Ref + 10; 8962306a36Sopenharmony_ci do { 9062306a36Sopenharmony_ci /* executed once */ 9162306a36Sopenharmony_ci if (Ch_1_Glob == 'A') { 9262306a36Sopenharmony_ci /* then, executed */ 9362306a36Sopenharmony_ci Int_Loc -= 1; 9462306a36Sopenharmony_ci *Int_Par_Ref = Int_Loc - Int_Glob; 9562306a36Sopenharmony_ci Enum_Loc = Ident_1; 9662306a36Sopenharmony_ci } /* if */ 9762306a36Sopenharmony_ci } while (Enum_Loc != Ident_1); /* true */ 9862306a36Sopenharmony_ci} /* Proc_2 */ 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic void Proc_4(void) 10262306a36Sopenharmony_ci/*******/ 10362306a36Sopenharmony_ci/* executed once */ 10462306a36Sopenharmony_ci{ 10562306a36Sopenharmony_ci Boolean Bool_Loc; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci Bool_Loc = Ch_1_Glob == 'A'; 10862306a36Sopenharmony_ci Bool_Glob = Bool_Loc | Bool_Glob; 10962306a36Sopenharmony_ci Ch_2_Glob = 'B'; 11062306a36Sopenharmony_ci} /* Proc_4 */ 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistatic void Proc_5(void) 11462306a36Sopenharmony_ci/*******/ 11562306a36Sopenharmony_ci/* executed once */ 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci Ch_1_Glob = 'A'; 11862306a36Sopenharmony_ci Bool_Glob = false; 11962306a36Sopenharmony_ci} /* Proc_5 */ 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ciint dhry(int n) 12362306a36Sopenharmony_ci/*****/ 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci /* main program, corresponds to procedures */ 12662306a36Sopenharmony_ci /* Main and Proc_0 in the Ada version */ 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci One_Fifty Int_1_Loc; 12962306a36Sopenharmony_ci One_Fifty Int_2_Loc; 13062306a36Sopenharmony_ci One_Fifty Int_3_Loc; 13162306a36Sopenharmony_ci char Ch_Index; 13262306a36Sopenharmony_ci Enumeration Enum_Loc; 13362306a36Sopenharmony_ci Str_30 Str_1_Loc; 13462306a36Sopenharmony_ci Str_30 Str_2_Loc; 13562306a36Sopenharmony_ci int Run_Index; 13662306a36Sopenharmony_ci int Number_Of_Runs; 13762306a36Sopenharmony_ci ktime_t Begin_Time, End_Time; 13862306a36Sopenharmony_ci u32 User_Time; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci /* Initializations */ 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci Next_Ptr_Glob = (Rec_Pointer)kzalloc(sizeof(Rec_Type), GFP_ATOMIC); 14362306a36Sopenharmony_ci if (!Next_Ptr_Glob) 14462306a36Sopenharmony_ci return -ENOMEM; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci Ptr_Glob = (Rec_Pointer)kzalloc(sizeof(Rec_Type), GFP_ATOMIC); 14762306a36Sopenharmony_ci if (!Ptr_Glob) { 14862306a36Sopenharmony_ci kfree(Next_Ptr_Glob); 14962306a36Sopenharmony_ci return -ENOMEM; 15062306a36Sopenharmony_ci } 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; 15362306a36Sopenharmony_ci Ptr_Glob->Discr = Ident_1; 15462306a36Sopenharmony_ci Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; 15562306a36Sopenharmony_ci Ptr_Glob->variant.var_1.Int_Comp = 40; 15662306a36Sopenharmony_ci strcpy(Ptr_Glob->variant.var_1.Str_Comp, 15762306a36Sopenharmony_ci "DHRYSTONE PROGRAM, SOME STRING"); 15862306a36Sopenharmony_ci strcpy(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci Arr_2_Glob[8][7] = 10; 16162306a36Sopenharmony_ci /* Was missing in published program. Without this statement, */ 16262306a36Sopenharmony_ci /* Arr_2_Glob[8][7] would have an undefined value. */ 16362306a36Sopenharmony_ci /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ 16462306a36Sopenharmony_ci /* overflow may occur for this array element. */ 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci pr_debug("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci Number_Of_Runs = n; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci pr_debug("Execution starts, %d runs through Dhrystone\n", 17162306a36Sopenharmony_ci Number_Of_Runs); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci /***************/ 17462306a36Sopenharmony_ci /* Start timer */ 17562306a36Sopenharmony_ci /***************/ 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci Begin_Time = ktime_get(); 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { 18062306a36Sopenharmony_ci Proc_5(); 18162306a36Sopenharmony_ci Proc_4(); 18262306a36Sopenharmony_ci /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ 18362306a36Sopenharmony_ci Int_1_Loc = 2; 18462306a36Sopenharmony_ci Int_2_Loc = 3; 18562306a36Sopenharmony_ci strcpy(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); 18662306a36Sopenharmony_ci Enum_Loc = Ident_2; 18762306a36Sopenharmony_ci Bool_Glob = !Func_2(Str_1_Loc, Str_2_Loc); 18862306a36Sopenharmony_ci /* Bool_Glob == 1 */ 18962306a36Sopenharmony_ci while (Int_1_Loc < Int_2_Loc) { 19062306a36Sopenharmony_ci /* loop body executed once */ 19162306a36Sopenharmony_ci Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; 19262306a36Sopenharmony_ci /* Int_3_Loc == 7 */ 19362306a36Sopenharmony_ci Proc_7(Int_1_Loc, Int_2_Loc, &Int_3_Loc); 19462306a36Sopenharmony_ci /* Int_3_Loc == 7 */ 19562306a36Sopenharmony_ci Int_1_Loc += 1; 19662306a36Sopenharmony_ci } /* while */ 19762306a36Sopenharmony_ci /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ 19862306a36Sopenharmony_ci Proc_8(Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); 19962306a36Sopenharmony_ci /* Int_Glob == 5 */ 20062306a36Sopenharmony_ci Proc_1(Ptr_Glob); 20162306a36Sopenharmony_ci for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) { 20262306a36Sopenharmony_ci /* loop body executed twice */ 20362306a36Sopenharmony_ci if (Enum_Loc == Func_1(Ch_Index, 'C')) { 20462306a36Sopenharmony_ci /* then, not executed */ 20562306a36Sopenharmony_ci Proc_6(Ident_1, &Enum_Loc); 20662306a36Sopenharmony_ci strcpy(Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); 20762306a36Sopenharmony_ci Int_2_Loc = Run_Index; 20862306a36Sopenharmony_ci Int_Glob = Run_Index; 20962306a36Sopenharmony_ci } 21062306a36Sopenharmony_ci } 21162306a36Sopenharmony_ci /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ 21262306a36Sopenharmony_ci Int_2_Loc = Int_2_Loc * Int_1_Loc; 21362306a36Sopenharmony_ci Int_1_Loc = Int_2_Loc / Int_3_Loc; 21462306a36Sopenharmony_ci Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; 21562306a36Sopenharmony_ci /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ 21662306a36Sopenharmony_ci Proc_2(&Int_1_Loc); 21762306a36Sopenharmony_ci /* Int_1_Loc == 5 */ 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci } /* loop "for Run_Index" */ 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci /**************/ 22262306a36Sopenharmony_ci /* Stop timer */ 22362306a36Sopenharmony_ci /**************/ 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci End_Time = ktime_get(); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#define dhry_assert_int_eq(val, expected) \ 22862306a36Sopenharmony_ci if (val != expected) \ 22962306a36Sopenharmony_ci pr_err("%s: %d (FAIL, expected %d)\n", #val, val, \ 23062306a36Sopenharmony_ci expected); \ 23162306a36Sopenharmony_ci else \ 23262306a36Sopenharmony_ci pr_debug("%s: %d (OK)\n", #val, val) 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci#define dhry_assert_char_eq(val, expected) \ 23562306a36Sopenharmony_ci if (val != expected) \ 23662306a36Sopenharmony_ci pr_err("%s: %c (FAIL, expected %c)\n", #val, val, \ 23762306a36Sopenharmony_ci expected); \ 23862306a36Sopenharmony_ci else \ 23962306a36Sopenharmony_ci pr_debug("%s: %c (OK)\n", #val, val) 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci#define dhry_assert_string_eq(val, expected) \ 24262306a36Sopenharmony_ci if (strcmp(val, expected)) \ 24362306a36Sopenharmony_ci pr_err("%s: %s (FAIL, expected %s)\n", #val, val, \ 24462306a36Sopenharmony_ci expected); \ 24562306a36Sopenharmony_ci else \ 24662306a36Sopenharmony_ci pr_debug("%s: %s (OK)\n", #val, val) 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci pr_debug("Execution ends\n"); 24962306a36Sopenharmony_ci pr_debug("Final values of the variables used in the benchmark:\n"); 25062306a36Sopenharmony_ci dhry_assert_int_eq(Int_Glob, 5); 25162306a36Sopenharmony_ci dhry_assert_int_eq(Bool_Glob, 1); 25262306a36Sopenharmony_ci dhry_assert_char_eq(Ch_1_Glob, 'A'); 25362306a36Sopenharmony_ci dhry_assert_char_eq(Ch_2_Glob, 'B'); 25462306a36Sopenharmony_ci dhry_assert_int_eq(Arr_1_Glob[8], 7); 25562306a36Sopenharmony_ci dhry_assert_int_eq(Arr_2_Glob[8][7], Number_Of_Runs + 10); 25662306a36Sopenharmony_ci pr_debug("Ptr_Comp: %px\n", Ptr_Glob->Ptr_Comp); 25762306a36Sopenharmony_ci dhry_assert_int_eq(Ptr_Glob->Discr, 0); 25862306a36Sopenharmony_ci dhry_assert_int_eq(Ptr_Glob->variant.var_1.Enum_Comp, 2); 25962306a36Sopenharmony_ci dhry_assert_int_eq(Ptr_Glob->variant.var_1.Int_Comp, 17); 26062306a36Sopenharmony_ci dhry_assert_string_eq(Ptr_Glob->variant.var_1.Str_Comp, 26162306a36Sopenharmony_ci "DHRYSTONE PROGRAM, SOME STRING"); 26262306a36Sopenharmony_ci if (Next_Ptr_Glob->Ptr_Comp != Ptr_Glob->Ptr_Comp) 26362306a36Sopenharmony_ci pr_err("Next_Ptr_Glob->Ptr_Comp: %px (expected %px)\n", 26462306a36Sopenharmony_ci Next_Ptr_Glob->Ptr_Comp, Ptr_Glob->Ptr_Comp); 26562306a36Sopenharmony_ci else 26662306a36Sopenharmony_ci pr_debug("Next_Ptr_Glob->Ptr_Comp: %px\n", 26762306a36Sopenharmony_ci Next_Ptr_Glob->Ptr_Comp); 26862306a36Sopenharmony_ci dhry_assert_int_eq(Next_Ptr_Glob->Discr, 0); 26962306a36Sopenharmony_ci dhry_assert_int_eq(Next_Ptr_Glob->variant.var_1.Enum_Comp, 1); 27062306a36Sopenharmony_ci dhry_assert_int_eq(Next_Ptr_Glob->variant.var_1.Int_Comp, 18); 27162306a36Sopenharmony_ci dhry_assert_string_eq(Next_Ptr_Glob->variant.var_1.Str_Comp, 27262306a36Sopenharmony_ci "DHRYSTONE PROGRAM, SOME STRING"); 27362306a36Sopenharmony_ci dhry_assert_int_eq(Int_1_Loc, 5); 27462306a36Sopenharmony_ci dhry_assert_int_eq(Int_2_Loc, 13); 27562306a36Sopenharmony_ci dhry_assert_int_eq(Int_3_Loc, 7); 27662306a36Sopenharmony_ci dhry_assert_int_eq(Enum_Loc, 1); 27762306a36Sopenharmony_ci dhry_assert_string_eq(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); 27862306a36Sopenharmony_ci dhry_assert_string_eq(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci User_Time = ktime_to_ms(ktime_sub(End_Time, Begin_Time)); 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci kfree(Ptr_Glob); 28362306a36Sopenharmony_ci kfree(Next_Ptr_Glob); 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci /* Measurements should last at least 2 seconds */ 28662306a36Sopenharmony_ci if (User_Time < 2 * MSEC_PER_SEC) 28762306a36Sopenharmony_ci return -EAGAIN; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci return div_u64(mul_u32_u32(MSEC_PER_SEC, Number_Of_Runs), User_Time); 29062306a36Sopenharmony_ci} 291