// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// 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.

#include "starboard/thread.h"

#if SB_API_VERSION >= 11

#include <ucontext.h>

#include "starboard/common/log.h"
#include "starboard/shared/pthread/thread_context_internal.h"

bool SbThreadContextGetPointer(SbThreadContext context,
                               SbThreadContextProperty property,
                               void** out_value) {
  if (context == kSbThreadContextInvalid || context->ip_ == nullptr) {
    return false;
  }

  switch (property) {
    case kSbThreadContextInstructionPointer:
      *out_value = context->ip_;
      return true;

    case kSbThreadContextStackPointer:
      *out_value = context->sp_;
      return true;

    case kSbThreadContextFramePointer:
      *out_value = context->fp_;
      return true;

#if SB_API_VERSION >= SB_THREAD_CONTEXT_LINK_REGISTER_VERSION
    case kSbThreadContextLinkRegister:
      *out_value = context->lr_;
      return true;
#endif  // SB_API_VERSION >= SB_THREAD_CONTEXT_LINK_REGISTER_VERSION

    default:
      SB_NOTIMPLEMENTED() << "SbThreadContextGetPointer not implemented for "
                          << property;
      return false;
  }
}

#endif  // SB_API_VERSION >= 11
