11.1Snonaka/* $NetBSD: efidev.c,v 1.1 2018/03/08 10:34:33 nonaka Exp $ */ 21.1Snonaka/* $OpenBSD: efiboot.c,v 1.28 2017/11/25 19:02:07 patrick Exp $ */ 31.1Snonaka 41.1Snonaka/* 51.1Snonaka * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net> 61.1Snonaka * 71.1Snonaka * Permission to use, copy, modify, and distribute this software for any 81.1Snonaka * purpose with or without fee is hereby granted, provided that the above 91.1Snonaka * copyright notice and this permission notice appear in all copies. 101.1Snonaka * 111.1Snonaka * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 121.1Snonaka * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 131.1Snonaka * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 141.1Snonaka * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 151.1Snonaka * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 161.1Snonaka * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 171.1Snonaka * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 181.1Snonaka */ 191.1Snonaka 201.1Snonaka#include "efiboot.h" 211.1Snonaka 221.1Snonaka/* 231.1Snonaka * Determine the number of nodes up to, but not including, the first 241.1Snonaka * node of the specified type. 251.1Snonaka */ 261.1Snonakaint 271.1Snonakaefi_device_path_depth(EFI_DEVICE_PATH *dp, int dptype) 281.1Snonaka{ 291.1Snonaka int i; 301.1Snonaka 311.1Snonaka for (i = 0; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp), i++) { 321.1Snonaka if (DevicePathType(dp) == dptype) 331.1Snonaka return (i); 341.1Snonaka } 351.1Snonaka 361.1Snonaka return (-1); 371.1Snonaka} 381.1Snonaka 391.1Snonakaint 401.1Snonakaefi_device_path_ncmp(EFI_DEVICE_PATH *dpa, EFI_DEVICE_PATH *dpb, int deptn) 411.1Snonaka{ 421.1Snonaka int i, cmp; 431.1Snonaka 441.1Snonaka for (i = 0; i < deptn; i++) { 451.1Snonaka if (IsDevicePathEnd(dpa) || IsDevicePathEnd(dpb)) 461.1Snonaka return ((IsDevicePathEnd(dpa) && IsDevicePathEnd(dpb)) 471.1Snonaka ? 0 : (IsDevicePathEnd(dpa))? -1 : 1); 481.1Snonaka cmp = DevicePathNodeLength(dpa) - DevicePathNodeLength(dpb); 491.1Snonaka if (cmp) 501.1Snonaka return (cmp); 511.1Snonaka cmp = memcmp(dpa, dpb, DevicePathNodeLength(dpa)); 521.1Snonaka if (cmp) 531.1Snonaka return (cmp); 541.1Snonaka dpa = NextDevicePathNode(dpa); 551.1Snonaka dpb = NextDevicePathNode(dpb); 561.1Snonaka } 571.1Snonaka 581.1Snonaka return (0); 591.1Snonaka} 60